如何最小化 Python 上的多变量函数?

问题描述

我是 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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...