在Python中最小化数据的平方

时间:2019-02-12 21:42:49

标签: python numpy optimization minimize chi-squared

我正在尝试最小化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,然后最小化库无法访问它。

问题是,我还应该如何将数据放入其中?

0 个答案:

没有答案