我已经建立了一个模型来拟合一些数据与指数中的减法。它适用于拟合,但是当我明确评估模型时,我得到奇怪的结果和一个 AttributeError:'Mul' 对象没有属性 'exp'。
问题似乎源于 lambdify 的工作方式,并在评估包含非平凡函数(例如增效或幂运算)的模型时发生。
import symfit as sf
a = sf.Parameter('a',1,0,2) #name, initial value, minimum, maximum
b = sf.Parameter('b',1,0,2)
c=sf.Parameter('c',1,0,2)
x, y = sf.variables('x, y')
model=sf.Model({y: a * (c - sf.exp((x) / b))})
model(1,a,b,c)
Out: Ans(y=a*(c + 1))
model=sf.Model({y: a * (1 - sf.exp((x-c) / b))})
model(1,a,b,c)
Traceback (most recent call last):
File "<ipython-input-9-faba3b52b923>", line 1, in <module>
model(1,a,b,c)
File "C:\PortablePrograms\Python\WPy-3670\python-3.6.7.amd64\lib\site-packages\symfit\core\fit.py", line 334, in __call__
return Ans(*self.eval_components(**bound_arguments.arguments))
File "C:\PortablePrograms\Python\WPy-3670\python-3.6.7.amd64\lib\site-packages\symfit\core\fit.py", line 296, in eval_components
return [expr(*args, **kwargs) for expr in self.numerical_components]
File "C:\PortablePrograms\Python\WPy-3670\python-3.6.7.amd64\lib\site-packages\symfit\core\fit.py", line 296, in <listcomp>
return [expr(*args, **kwargs) for expr in self.numerical_components]
File "C:\PortablePrograms\Python\WPy-3670\python-3.6.7.amd64\lib\site-packages\sympy\utilities\lambdify.py", line 444, in wrapper
return funcarg(*newargs, **kwargsx)
File "<string>", line 1, in <lambda>
AttributeError: 'Mul' object has no attribute 'exp'
我希望要么使用参数的初始值,要么得到一个象征性的答案,但两者都得不到。
因此,对于第一个模型,结果既错误又不一致,我希望
Ans(y=a*(c-exp(1/b))
或者
Ans(y=a*(c-1))
或者只是简单地
Ans(y=0)
对于第二个模型,lambdify 似乎无法解析表达式。
使用 sf.sqrt() 或 sympy.exp() 时也是如此。我在 python 3.6.7 和 IPython 7.1.1 中工作,使用 Symfit 0.4.6 和 Sympy 1.1.1(因为 Symfit 不适用于根据 pip 的更高版本)。
我可以使用任一模型来拟合数据并使用最佳拟合参数评估模型,如此处的示例 ( https://pypi.org/project/symfit/ ) 所示。线
yfit = model(x=xdata, **fit_result.params)[y]
除非改为
yfit = [model(x=x, **fit_result.params) for x in xdata]