【发布时间】:2019-12-18 15:29:40
【问题描述】:
我有一个拟合函数:
import cvxpy as cp
import numpy as np
from scipy.optimize import minimize
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from lmfit import Model, Parameters
def f(wdata, pr, pi, cr, ci):
return ( np.arctan2(-2*ci*pi - 2*cr*pr, 2*cr*wdata) - np.arctan2((pi)**2 + (pr)**2 - (wdata)**2, -2*pr*wdata) )
wdata = (500000000.0, 520000000.0, 540000000.0, 560000000.0, 580000000.0, 600000000.0, 620000000.0, 640000000.0, 660000000.0, 680000000.0, 700000000.0, 720000000.0, 740000000.0, 760000000.0])
wdata= np.asarray(wdata)
ydata = f(wdata, -355574682.231318, -9040912422.93189, 31570159.4732856, -6238484.15663787)
fmodel = Model(f)
params = Parameters()
params.add('pr', value=-355574682.231318, vary=True)
params.add('pi', value=-9040912422.93189, vary=True)
params.add('pi', value=-9040912422.93189, vary=True)
params.add('cr', value=31570159.4732856, vary=True)
params.add('ci', expr='-((cr*pr)/pi) < ci < (cr*pr)/pi if pi<0 else ((cr*pr)/pi) < ci < -(cr*pr)/pi ', vary=True)
result = fmodel.fit(ydata, params, wdata=wdata)
print(result.fit_report())
plt.plot(wdata, ydata, 'bo')
plt.plot(wdata, result.init_fit, 'k--')
plt.plot(wdata, result.best_fit, 'r-')
plt.show()
如您所见,参数“ci”必须在其他参数之间进行限制。我将约束放在 if 语句中;但是,我收到一个错误,即未定义名称“ci”。我认为原因是我将 ci 与其他参数放在了两个不等式中。如何告诉我的代码我希望“ci”有界? (与我现在在我的代码中显示的界限)
【问题讨论】:
标签: python optimization scipy curve-fitting lmfit