Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用指数中的减法计算symfit模型时的AttributeError_Python_Sympy_Attributeerror_Symfit - Fatal编程技术网

Python 使用指数中的减法计算symfit模型时的AttributeError

Python 使用指数中的减法计算symfit模型时的AttributeError,python,sympy,attributeerror,symfit,Python,Sympy,Attributeerror,Symfit,我已经建立了一个模型来拟合一些数据,指数中有一个减法。它适用于拟合,但当我显式地计算模型时,会得到奇怪的结果,并且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)

我已经建立了一个模型来拟合一些数据,指数中有一个减法。它适用于拟合,但当我显式地计算模型时,会得到奇怪的结果,并且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=0)
对于第二个模型,lambdify似乎无法解析表达式

使用sf.sqrt()或sympy.exp()时也是如此。 我正在使用python 3.6.7和IPython 7.1.1,使用Symfit 0.4.6和Sympy 1.1.1(因为Symfit不适用于符合pip的更高版本)

我可以使用任一模型拟合数据,并使用最佳拟合参数评估模型,如这里的示例所示()。线路

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]

symfit
中调用
Model
意味着符号表达式被转换为lambda函数,即不再是符号的普通python函数

在您的示例中,调用

sf.Model({y:a*(c-sf.exp((x)/b)))
相当于写作

λx,a,b,c:a*(c-np.exp((x)/b)) 请注意,符号指数现在已更改为
numpy
one。从这个示例中,您可以看到,模型不是用符号表达式调用的,而是用数字或数组调用的

所以你的电话应该改成

模型(x=1,a=1,b=1,c=1)
如果您需要在符号级别上工作,请继续直接使用
模型中的表达式,该调用仅用于数字用途

最后,文档中的示例假设扩展数据是一个数组,但在示例中它是一个列表。这应该(由我)更新

最后一句话,要学会喜欢python中的关键字参数;)。以下是等效的:

a=sf.参数('a',1,0,2)#名称、初始值、最小值、最大值
a=sf.参数('a',值=1,最小值=0,最大值=2)
但只有一个是自我记录:)

yfit = model(x=xdata, **fit_result.params)[y] 
yfit = [model(x=x, **fit_result.params) for x in xdata]