我正在尝试最小化Chi_Squared函数。
跟随Python - Minimizing Chi-squared
没有任何结果,因为从那以后发生了很多变化。 代码:
import numpy as np
import scipy.optimize as opt
import matplotlib.pyplot as plt
filename = 'exportklee.csv'
data = np.genfromtxt('exportklee.csv', dtype=float, delimiter=',')
magX = data[:, 3] #* 0.080
magY = data[:, 4] #* 0.080
magZ = data[:, 5] #* 0.080
f1=magX
f2=magY
f3=magZ
T=np.array([magX,magY,magZ])
B=np.linalg.norm(T,axis=0)
mittel=B.mean()
target=np.ones_like(B)*mittel
pi=np.pi
def sind(alpha):
return np.sin(np.deg2rad(alpha))
def cosd(alpha):
return np.cos(np.deg2rad(alpha))
def chisqfunc(x):
model=(((f1 - x(0))*((f1 - x(0))/x(6) + (sind((pi*x(3))/180)*((f2 - x(1))/(x(7)*cosd((pi*x(3))/180)) + (sind((pi*x(3))/180)*(f1 - x(0)))/(x(6)*cosd((pi*x(3))/180))))/cosd((pi*x(3))/180) + ((cosd((pi*x(3))/180)*sind((pi*x(4))/180) + sind((pi*x(3))/180)*sind((pi*x(5))/180))*(((cosd((pi*x(3))/180)*sind((pi*x(4))/180) + sind((pi*x(3))/180)*sind((pi*x(5))/180))*(f1 - x(0)))/(x(6)*cosd((pi*x(3))/180)*(- sind((x(4)*pi)/180)**2 - sind((x(5)*pi)/180)**2 + 1)**(1/2)) - (f3 - x(2))/(x(8)*(- sind((x(4)*pi)/180)**2 - sind((x(5)*pi)/180)**2 + 1)**(1/2)) + (sind((pi*x(5))/180)*(f2 - x(1)))/(x(7)*cosd((pi*x(3))/180)*(- sind((x(4)*pi)/180)**2 - sind((x(5)*pi)/180)**2 + 1)**(1/2))))/(cosd((pi*x(3))/180)*(- sind((x(4)*pi)/180)**2 - sind((x(5)*pi)/180)**2 + 1)**(1/2))))/x(6) + ((((f2 - x(1))/(x(7)*cosd((pi*x(3))/180)) + (sind((pi*x(3))/180)*(f1 - x(0)))/(x(6)*cosd((pi*x(3))/180)))/cosd((pi*x(3))/180) + (sind((pi*x(5))/180)*(((cosd((pi*x(3))/180)*sind((pi*x(4))/180) + sind((pi*x(3))/180)*sind((pi*x(5))/180))*(f1 - x(0)))/(x(6)*cosd((pi*x(3))/180)*(- sind((x(4)*pi)/180)**2 - sind((x(5)*pi)/180)**2 + 1)**(1/2)) - (f3 - x(2))/(x(8)*(- sind((x(4)*pi)/180)**2 - sind((x(5)*pi)/180)**2 + 1)**(1/2)) + (sind((pi*x(5))/180)*(f2 - x(1)))/(x(7)*cosd((pi*x(3))/180)*(- sind((x(4)*pi)/180)**2 - sind((x(5)*pi)/180)**2 + 1)**(1/2))))/(cosd((pi*x(3))/180)*(- sind((x(4)*pi)/180)**2 - sind((x(5)*pi)/180)**2 + 1)**(1/2)))*(f2 - x(1)))/x(7) - ((f3 - x(2))*(((cosd((pi*x(3))/180)*sind((pi*x(4))/180) + sind((pi*x(3))/180)*sind((pi*x(5))/180))*(f1 - x(0)))/(x(6)*cosd((pi*x(3))/180)*(- sind((x(4)*pi)/180)**2 - sind((x(5)*pi)/180)**2 + 1)**(1/2)) - (f3 - x(2))/(x(8)*(- sind((x(4)*pi)/180)**2 - sind((x(5)*pi)/180)**2 + 1)**(1/2)) + (sind((pi*x(5))/180)*(f2 - x(1)))/(x(7)*cosd((pi*x(3))/180)*(- sind((x(4)*pi)/180)**2 - sind((x(5)*pi)/180)**2 + 1)**(1/2))))/(x(8)*(- sind((x(4)*pi)/180)**2 - sind((x(5)*pi)/180)**2 + 1)**(1/2)))**(1/2)
chisq=np.sum(((target - model))**2)
return chisq
x0 = np.array([1,1,1,0.1,0.1,0.1,22,22,22])
modelv=opt.minimize(chisqfunc, x0)
此旧代码在3.7中不再起作用。
现在产生的错误是
'numpy.ndarray'对象不可调用
我非常确定这是由于我将数据(f1,f2,f3,target)扔到了函数中,因为全局将其转换为np_array,然后最小化库无法访问它。
问题是,我还应该如何将数据放入其中?