我已经建立了一个模型来拟合一些数据,并在其中减去减法。它适合拟合,但当我明确评估模型时,得到奇怪的结果,并出现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()时也是如此。 我正在使用Symfit 0.4.6和Sympy 1.1.1在python 3.6.7和IPython 7.1.1中工作(因为Symfit不适用于更高版本的pip)。
我可以使用这两个模型来拟合数据,并使用最佳拟合参数评估模型,如此处的示例(https://pypi.org/project/symfit/)所示。线
yfit = model(x=xdata, **fit_result.params)[y]
除非更改为,否则
也不起作用(在python 2.7、3.5和3.6上试用)
yfit = [model(x=x, **fit_result.params) for x in xdata]
答案 0 :(得分:3)
在__DIR__ . '/../../mediservices/bootstrap/autoload.php'
中调用Model
意味着符号表达式将转换为lambda函数,即不再是符号的普通python函数。
在您的示例中,致电
symfit
相当于写作
sf.Model({y: a * (c - sf.exp((x) / b))})
请注意,符号指数现已更改为lambda x, a, b, c: a * (c - np.exp((x) / b))
。从这个例子中,您可以看到一个模型不是用符号表达式来调用,而是用数字或数组来调用。
因此您的通话应更改为
numpy
如果需要在符号级别上进行操作,请继续直接使用model(x=1, a=1, b=1, c=1)
中的表达式,该调用仅用于数字用途。
最后,文档中的示例假定xdata是一个数组,但是在示例中,它是一个列表。 (应该由我更新)。
最后,请学习在python;)中喜欢关键字参数。以下是等效的:
Model
但只有一个是自我记录的:)。