在symfit python包中设置负的固定参数

问题描述 投票:1回答:1

我需要在参数中适应三个值中的两个,比如我有a,b,c,我知道a,但我只想适合bc。问题变成如果我尝试将a修正为负值我跟随错误ValueError: SLSQP Error: lb > ub in bounds True, False, False.。但是,如果我通过在a前添加一个负号( - )来改变我的模型,那么我的a参数为正,它将解决,但它返回所有NaN。

这是一个返回错误的代码。如果可能的话,这就是我想要构建模型的方式。

#%% import modules
import IPython as IP
IP.get_ipython().magic('reset -sf')
import matplotlib.pyplot as plt
from symfit import Parameter, Variable
from symfit import Fit
import numpy as np

# data
Y = np.array([7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.50E-01 , 7.49E-01 , 7.49E-01 , 7.49E-01 , 7.49E-01 , 7.49E-01 , 7.48E-01 , 7.48E-01 , 7.48E-01 , 7.47E-01 , 7.47E-01 , 7.46E-01 , 7.46E-01 , 7.45E-01 , 7.44E-01 , 7.44E-01 , 7.43E-01 , 7.42E-01 , 7.41E-01 , 7.40E-01 , 7.39E-01 , 7.38E-01 , 7.37E-01 , 7.36E-01 , 7.35E-01 , 7.34E-01 , 7.32E-01 , 7.31E-01 , 7.30E-01 , 7.28E-01 , 7.27E-01 , 7.25E-01 , 7.24E-01 , 7.22E-01 , 7.21E-01 , 7.19E-01 , 7.17E-01 , 7.16E-01 , 7.14E-01 , 7.12E-01 , 7.10E-01 , 7.08E-01 , 7.06E-01 , 7.04E-01 , 7.02E-01 , 7.00E-01 , 6.98E-01 , 6.96E-01 , 6.94E-01 , 6.92E-01 , 6.90E-01 , 6.88E-01 , 6.86E-01 , 6.83E-01 , 6.81E-01 , 6.79E-01 , 6.77E-01 , 6.75E-01 , 6.72E-01 , 6.70E-01 , 6.68E-01 , 6.65E-01 , 6.63E-01 , 6.61E-01 , 6.58E-01 , 6.56E-01 , 6.54E-01 , 6.51E-01 , 6.49E-01 , 6.46E-01 , 6.44E-01 , 6.42E-01 , 6.39E-01 , 6.37E-01 , 6.34E-01 , 6.32E-01 , 6.30E-01 , 6.27E-01 , 6.25E-01 , 6.22E-01 , 6.20E-01 , 6.17E-01 , 6.15E-01 , 6.12E-01 , 6.10E-01 , 6.08E-01 , 6.05E-01 , 6.03E-01 , 6.00E-01 , 5.98E-01 , 5.95E-01 , 5.93E-01 , 5.91E-01 , 5.88E-01 , 5.86E-01 , 5.83E-01 , 5.81E-01 , 5.79E-01 , 5.76E-01 , 5.74E-01 , 5.71E-01 , 5.69E-01 , 5.67E-01 , 5.64E-01 , 5.62E-01 , 5.60E-01 , 5.57E-01 , 5.55E-01 , 5.53E-01 , 5.50E-01 , 5.48E-01 , 5.46E-01 , 5.43E-01 , 5.41E-01 , 5.39E-01 , 5.36E-01 , 5.34E-01 , 5.32E-01 , 5.29E-01 , 5.27E-01 , 5.25E-01])
X = np.arange(len(Y))


#%% solve the best fit line for the entire data set.

# define the parameters
a = Parameter(value = -0.25,fixed=True)
b = Parameter()
c = Parameter()
x = Variable()


# build the model
model = a + b * (1 - np.e**(-c/x))

# fit the model
fit = Fit(model, X, Y)
fit_result = fit.execute()
model_fit = model(x=X, a=fit_result.value(a), b=fit_result.value(b),c=fit_result.value(c))


#%% Plot the results
plt.figure()
plt.plot(X,Y,'ko',markersize=3,fillstyle='none',label='data')
plt.plot(X, model_fit,'--',label='best fit')
plt.legend()
python scipy curve-fitting symfit
1个回答
2
投票

这似乎与symfit有关,感谢报道。

作为您问题的快速解决方案;似乎SLSQP正在引发NaN。因此,从Fit对象切换到NumericalLeastSquares对象将解决您的问题。 (但它仍然不允许固定的负值)

我会尝试尽快修补此问题。

作为对您的代码的额外改进,我可以建议替换np.e**(-c/x)

from symfit import exp
exp(-c/x)

这是一个符号exp,所以symfit(或你)也可以利用它上面的所有符号计算能力。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.