【发布时间】:2019-08-13 23:58:44
【问题描述】:
假设我们有两条具有相同变量的不同曲线。如何优化变量以同时对两条曲线进行最佳拟合?我可以分别优化每条曲线,但获得的值不一定能为另一条曲线提供最佳拟合。
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, a, b, c, d):
return ( a+b*wdata + c*d*wdata )
def g(wdata, a, b, c, d):
return ( a**2*(wdata)**2/a*b*wdata*(c)**2 )
wdata = (1, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100)
wdata= np.asarray(wdata)
ydata1 = f(wdata, -19, -60, 9, 100)
ydata2 = g(wdata, -19, -60, 9, 100)
fmodel = Model(f)
gmodel = Model(g)
params = Parameters()
params.add('a', value=-19, max = 0, vary=False)
params.add('b', value=-60, vary=True)
params.add('c', value=9, min = 0, vary=True)
params.add('xangle', value=0.05, vary=True, min=-np.pi/2, max=np.pi/2)
params.add('d', expr='(c*a/b)*sin(xangle)')
resultf = fmodel.fit(ydata1, params, wdata=wdata, method='leastsq')
print(resultf.fit_report())
plt.plot(wdata, ydata1, 'bo')
plt.plot(wdata, resultf.init_fit, 'k--')
plt.plot(wdata, resultf.best_fit, 'r-')
resultg = gmodel.fit(ydata2, params, wdata=wdata, method='leastsq')
print(resultg.fit_report())
plt.plot(wdata, ydata2, 'bo')
plt.plot(wdata, resultg.init_fit, 'k--')
plt.plot(wdata, resultg.best_fit, 'r-')
plt.show()
【问题讨论】:
-
你可以阅读多目标最大化。一个简单的事情就是优化误差函数的总和。
标签: python optimization curve-fitting lmfit