gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:52:42 25 4
gpt4 key购买 nike

我需要将三个值中的两个放入参数中,假设我有 a,b,c 并且我知道 a 但我只想适合 bc。如果我尝试将 a 修复为负值,则会出现以下错误 ValueError: SLSQP Error: lb > ub inbounds 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()

最佳答案

这似乎是 symfit 的问题,感谢您报告它。

快速解决您的问题;看来 SLSQP 导致了 NaN。因此,从 Fit 对象切换到 NumericalLeastSquares 对象将解决您的问题。 (但它仍然不允许固定负值)

我会尽快修复这个问题。

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

from symfit import exp
exp(-c/x)

这是一个符号表达式,因此 symfit (或您)也可以利用它的符号计算的所有功能。

关于python - 在symfit python包中设置负固定参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44562190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com