我试图在symfit之后使用symfit documentation包进行全局拟合。
import numpy as np
import symfit as sf
import matplotlib.pyplot as plt
%matplotlib inline # for ipynb
# Generate example data
t = np.arange(0.0, 600.1, 30)
k = 0.005
C1_0, C2_0 = 1.0, 2.0
C1 = C1_0 * np.exp(-k*t)
C2 = C2_0 * np.exp(-k*t)
# Construct model
x_1, x_2, y_1, y_2 = sf.variables('x_1, x_2, y_1, y_2')
kg = sf.Parameter(value=0.01, min=0.0, max=0.1)
a_1, a_2 = sf.parameters('a_1, a_2')
globalmodel = sf.Model({
y_1: a_1 * np.e**(- kg * x_1),
y_2: a_2 * np.e**(- kg * x_2),
})
# Do fit
globalfit = sf.Fit(globalmodel, x_1=t, x_2=t, y_1=C1, y_2=C2)
globalfit_result = globalfit.execute()
print(globalfit_result)
### EDITED START
while globalfit_result.r_squared < 0.99:
kg = sf.Parameter(value=globalfit_result.params['kg'])
a_1 = sf.Parameter(value=globalfit_result.params['a_1'])
a_2 = sf.Parameter(value=globalfit_result.params['a_2'])
globalmodel = sf.Model({
y_1: a_1 * np.e**(- kg * x_1),
y_2: a_2 * np.e**(- kg * x_2),
})
globalfit = sf.Fit(globalmodel, x_1=t, x_2=t, y_1=C1, y_2=C2)
globalfit_result = globalfit.execute()
### EDITED END
y_r = globalmodel(x_1=t, x_2=t, **globalfit_result.params)
# Plot fit
plt.plot(t,C1,'ro')
plt.plot(t,C2,'b+')
plt.plot(t,y_r[0],'r-')
plt.plot(t,y_r[1],'b-')
plt.show()
在此示例中,我希望将“ globalmodel”中的“ kg”参数优化为0.005。但是,“ kg”的值约为9.6e-3,太接近初始值(10.0e-3)。我认为我做一些愚蠢的事情,但我无法弄清楚。
欢迎任何意见和建议!
已编辑
我添加(一个非常丑陋的)while循环以获得最佳拟合。我不确定为什么应该这样做,但是似乎可行。
最佳答案
似乎边界导致了问题。我在测试中将其删除,然后一切正常。这在symfit 0.3.3
,和一个I已经固定在̶[̶̶m̶a̶s̶t̶e̶r̶
̶]̶[1]̶BRANCH ON̶G̶i̶t̶h̶u̶b̶.̶̶̶我上传新的开发人员版你可以立即安装使用̶̶,̶直到我正式发布0.3.4̶(这将是相同的,但具有扩展文档)̶,目前已被固定在较新版本。
请注意,我将您的̶p̶i̶p̶ ̶i̶n̶s̶t̶a̶l̶l̶ ̶s̶y̶m̶f̶i̶t̶=̶=̶0̶.̶3̶.̶3̶.̶d̶e̶v̶1̶5̶5̶ ̶-̶-̶u̶p̶g̶r̶a̶d̶e̶
更改为np.e
,因为这是象征性的。我的工作代码如下,除了提到的更改并在sf.exp
中运行之外,其余与您的相同。
import numpy as np
import symfit as sf
import matplotlib.pyplot as plt
# Generate example data
t = np.arange(0.0, 600.1, 30)
k = 0.005
C1_0, C2_0 = 1.0, 2.0
C1 = C1_0 * np.exp(-k*t)
C2 = C2_0 * np.exp(-k*t)
# Construct model
x_1, x_2, y_1, y_2 = sf.variables('x_1, x_2, y_1, y_2')
kg = sf.Parameter(value=0.01, min=0.0, max=0.1)
a_1, a_2 = sf.parameters('a_1, a_2')
globalmodel = sf.Model({
y_1: a_1 * sf.exp(- kg * x_1),
y_2: a_2 * sf.exp(- kg * x_2),
})
# Do fit
globalfit = sf.Fit(globalmodel, x_1=t, x_2=t, y_1=C1, y_2=C2)
globalfit_result = globalfit.execute()
print(globalfit_result)
y_r = globalmodel(x_1=t, x_2=t, **globalfit_result.params)
# Plot fit
plt.plot(t,C1,'ro')
plt.plot(t,C2,'b+')
plt.plot(t,y_r[0],'r-')
plt.plot(t,y_r[1],'b-')
plt.show()
关于python - 带有symfit的全局拟合示例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40958688/