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

时间:2017-06-15 08:13:31

标签: python scipy curve-fitting symfit

我需要在参数中放入三个值中的两个,比如说我有ca而且我知道b但我只想要适合cValueError: SLSQP Error: lb > ub in bounds True, False, False.。如果我尝试将a修改为负值,则会出现以下错误a。但是,如果我通过在a前添加一个负号( - )来更改我的模型,那么我的#%% 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() 参数为正,它将解决,但它会返回所有NaN。

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

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" version="1.0"/>
<xsl:strip-space elements="*"/>

<xsl:variable name="curr" select="if (/Data/Record[1]/Amount/@currencyID != /Data/Record/Amount/@currencyID) then '1' else '0'" />

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="Amount">
    <Value>
       <xsl:value-of select="$curr"/>
    </Value>
</xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:2)

这似乎是symfit的问题,感谢报道。

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

我会尝试尽快修补。

作为对代码的进一步改进,我建议您将<{1}}替换为

np.e**(-c/x)

这是一个符号exp,所以from symfit import exp exp(-c/x) (或你)也可以利用它上面的所有符号计算功能。