使用lmfit在Python中拟合2D函数数据
我想用一个二维函数来拟合数据,以便提取参数(a)和(b),我使用的是lmfit这个包。基本上,这就像一维函数拟合一样,我想把每个数据点都拟合到同样坐标(x,y)的二维函数上。这意味着每个数据点都有一个不同的初始猜测值,因为每个数据的坐标(x,y)都不一样。这是我的代码:
#!/usr/bin/ python
import pyfits
import numpy as np
import math
from lmfit import minimize, Parameters, Parameter, report_errors,report_fit,
conf_interval, printfuncs
xn =np.linspace(0,3,4) # x-component
yn =np.linspace(0,3,4) # y-component
data= [0.0, 0.16, 0.33, 0.5, 0.2, 0.26, 0.38, 0.53, 0.4, 0.43, 0.52, 0.64, 0.6, 0.62,
0.67, 0.78] # (x1,y1) generate (data[0]), (x1,y2) generate (data[1]) and so on
params = Parameters()
params.add('a', value=3)
params.add('b', value=5)
def residual(params,x,y,data=None):
a = params['a'].value # parameter
b = params['b'].value # parameter
model=(x**2/a**2+y**2/b**2)**0.5 # 2D function
if data is None:
return data
return model - data
out=minimize(residual,params,args=(x,y,data,)) # lmfit minimizer
final=data+out.residual
report_fit(params)
ci = conf_interval(out, sigmas=[0.68,0.95]) # confidence interval
printfuncs.report_ci(ci)
但是,我收到了这个错误信息:
ValueError: operands could not be broadcast together with shapes (4) (16)
很明显,x和y的维度和数据不一样,但我不知道怎么让data[0]对应(x1,y1),data[1]对应(x1,y2)...,data[5]对应(x2,y1)等等。请问有没有人能帮我解决这个问题或者给点建议,非常感谢。
1 个回答
0
你需要把你的数据压缩吗?
x = [x1, x2, ...]
y = [y1, y2, ...]
data = zip(x, y) # [(x1, y1), (x2, y2), ... ]