问题描述
我是 stackoverflow(和 Python)的新手,如果这个问题很乱,我很抱歉!尝试使用最小二乘法最小化函数 myfit(M,P)。这是我的代码:
import matplotlib.pylab as plt
import matplotlib.pyplot as plt
import numpy as np
import math
from fractions import Fraction
import cmath
from matplotlib import colors as c
from scipy.optimize import curve_fit,minimize
from mpl_toolkits.mplot3d import Axes3D
import csv
from matplotlib.colors import ListedColormap,LinearSegmentedColormap
theta = ((np.pi)/4)*0
eta = (3*(np.pi)/2)*0
# Quarter-wave plate and Half-wave plate
QWP = np.matrix([[complex(1 +0j),complex(0 +0j)],[complex(0 +0j),complex(0+1j)]])
HWP = np.matrix([[1,0],[0,-1]])
ydata= np.linspace(0,np.pi,50)
xdata= np.linspace(0,np.pi/2,25)
X,Y = np.meshgrid(xdata,ydata)
z=[]
zdata = []
with open('.//Caoilainn//Data//CoPt//18112020//TR-MOKE_CoPt_Delay@Max_QWP_0to180deg_HWP_0to90deg.tsv','r') as csvfile:
plots = csv.reader(csvfile,delimiter='\t')
next(plots,None)
for row in plots:
z.append(float(row[2]))
Z = np.zeros((50,25))
for i in range(0,50):
for j in range(0,25):
Z[i,j] = z[i*25+j]
def d(theta):
return theta + 0.01*np.pi/180
# Rotation Matrix,R(theta)
def R(theta):
return np.matrix([[np.cos(theta),np.sin(theta)],[-np.sin(theta),np.cos(theta)]])
# R(theta+d)
def D(theta):
return np.matrix([[np.cos(d(theta)),np.sin(d(theta))],[-np.sin(d(theta)),np.cos(d(theta))]])
def signal(x,y):
E = np.matrix([[np.sin(eta)*1j],[np.cos(eta)]])
J = R(theta)*E
V= R(y)*QWP*R(-y)*R(x)*HWP*R(-x)*J
return float(abs(V[0])*abs(V[0]) - abs(V[1])*abs(V[1]))
def moke(x,[np.cos(eta)]])
J = D(theta)*E
V= R(y)*QWP*R(-y)*R(x)*HWP*R(-x)*J
return (float(abs(V[0])*abs(V[0]) - abs(V[1])*abs(V[1])) - signal(x,y))/d(theta)
def mcd(x,[np.cos(eta)]])
J = R(theta)*np.matrix([[np.sin(eta + (0.01*np.pi)/180)*1j],[np.cos(eta+ (0.01*np.pi)/180)]])
V= R(y)*QWP*R(-y)*R(x)*HWP*R(-x)*J
return (float(abs(V[0])*abs(V[0]) - abs(V[1])*abs(V[1])) - signal(x,y))/ (0.01*np.pi/180)
# Plot the 3D figure of the fitted function
fig = plt.figure(1)
ax = fig.gca(projection='3d')
ax.plot_surface(X,Y,Z,cmap="viridis")
plt.show()
# Our function to fit
def myfit(M,P):
x,y = M
return P[0]*signal(x-P[3],y-P[4]) + P[1]*moke(x-P[3],y-P[4]) + P[2]*mcd(x-P[3],y-P[4])
def khi(P,xdata,ydata,zdata):
out = 0.0
for itemp,i in enumerate(xdata):
for jtemp,j in enumerate(ydata):
out = out + float((zdata[jtemp,itemp] - myfit(i,j,P))**2)
return out
def myfit2(x,y,P):
out = np.empty([y.size,x.size ])
for itemp,i in enumerate(x):
for jtemp,j in enumerate(y):
out[jtemp,itemp] = P[0]*signal(i-P[3],j-P[4]) + P[1]*moke(i-P[3],j-P[4]) + P[2]*mcd(i-P[3],j-P[4])
return out
P0 = np.array([0.3,1.0,0.1,7*np.pi/180,-70*np.pi/180])
xdata = np.vstack((X.ravel(),Y.ravel()))
popt,pcov = curve_fit(myfit,Z.ravel(),P0)
res = minimize(khi,P0,(xdata,zdata))
vtemp = myfit(xdata,popt)
出现的错误是
" File "//anaconda3/lib/python3.7/site-packages/scipy/optimize/minpack.py",line 458,in func_wrapped 返回 func(xdata,*params) - ydata
TypeError: myfit() 需要 2 个位置参数,但给出了 6 个"
非常感谢任何帮助
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)