一連の行列から R (反射率) の値を計算するプログラムを作成しました... しかし、n 個の値 (反射指数である n3) の 1 つが推測されただけであることがわかりました。ここで、定義済み関数を使用してさまざまな n3 値を調べて、データに最適な R(l) を見つけたいと思います (それらは別のファイルに保存されます)。私はoptimization.curve_fitで遊んでみましたが、正直なところ、「y」に対応するRは実際の関数ではなく2つのループによって生成されるため、この場合に適切に使用する方法がわかりません...
from scipy import*
from scipy import linalg
import math
import cmath
from numpy import linalg
import numpy
import matplotlib.pyplot as plt
import scipy.optimize as optimization
infile=open('C:\Users\...\Data.txt', 'r')
n0=1.
n1=2.31
n2=2.
n3=1.8
d1=20*10**(-9)
d2=20*10**(-9)
lmin=700*10**(-9)
lmax=2200*10**(-9)
dl=1*10**(-9)
l=lmin
Theta=0
D0=matrix([[math.cos(math.radians(Theta)), math.cos(math.radians(Theta))],[n0, -n0]], dtype=complex)
D1=matrix([[math.cos(math.radians(Theta)), math.cos(math.radians(Theta))],[n1, -n1]], dtype=complex)
D2=matrix([[math.cos(math.radians(Theta)), math.cos(math.radians(Theta))],[n2, -n2]], dtype=complex)
Fi1= 0+0j
Fi2= 0+0j
P1=matrix([[1, 0], [0, 1]], dtype=complex)
P2=matrix([[1, 0], [0, 1]], dtype=complex)
M=matrix([[1,0],[0,1]], dtype=complex)
R=0+0j
r=0+0j
#File reading
x,y = numpy.loadtxt('C:\Users\...\Data.txt',dtype=float).transpose()
DL = []
Res = []
#Funcion
def R(l):
l=lmin
D3=matrix([[math.cos(math.radians(Theta)), math.cos(math.radians(Theta))],[n3, -n3]], dtype=complex)
while l<lmax:
Fi1= 2.* pi * n1 *d1 * math.cos(math.radians(Theta))/l
Fi2= 2.* pi * n2 *d2 * math.cos(math.radians(Theta))/l
f1 = math.e**(1j*Fi1)
f2 = math.e**(1j*Fi2)
P1 = matrix([[1/f1, 0], [0, f1]])
P2 = matrix([[1/f2, 0], [0, f2]])
T=matrix([[1,0],[0,1]], dtype=complex)
for i in range(0,9):
T=D1*P1*(D1)**(-1)*D2*P2*(D2)**(-1)*T
M=D0**(-1)*T*D3
r=M[1,0]/M[0,0]
R=abs(M[1,0]/M[0,0])**2
Res.append(R)
DL.append(l)
l=l+dl
return R
#print optimization.curve_fit(R(l), x, y)
R(l)
plt.plot(x,y)
plt.plot(DL,Res)
plt.show()