带多个参数的 SymPy 符号函数
SymPy symbol function taking multiple arguments
我想定义一个符号化函数 expFun 以便稍后用于集成。
我指的是 .
我当前的代码看起来像
import numpy as np
import sympy as sym
a1= sym.Symbol('a1')
a2= sym.Symbol('a2')
X1= sym.Symbol('X1')
X2= sym.Symbol('X2')
T= sym.Symbol('T')
u= sym.Symbol('u')
def expFun(a1,a2,X1,X2,T,u):
return X1*sym.exp(-a1*(T-u))+X2*sym.exp(-a2*(T-u))
expFun(sym.Symbol('a1 a2 X1 X2 T u'))
最后一行报错,说
TypeError: expFun() missing 5 required positional arguments: 'a2', 'X1', 'X2', 'T', and 'u'
我也试过这个也不管用:
expFun(sym.Symbol('a1','a2', 'X1','X2','T','u'))
将这些参数放入列表或集合中也没有帮助。
谁能告诉我如何解决这个问题?
#更新#
根据下面 hpaulj 的评论,我更新了我的代码如下。但我仍然遇到错误:(
from __future__ import division
import sympy as sym
X1, X2, a1, a2, T, u = sym.symbols('a1 a2 X1 X2 T u')
def expFun1(a1,a2,X1,X2,T,u):
return X1*np.exp(-a1*(T-u))+X2*np.exp(-a2*(T-u))
expFun1(*sym.symbols('a1 a2 X1 X2 T u'))
然后是错误信息
TypeError: loop of ufunc does not support argument 0 of type Mul which has no callable exp method
然后我试了这个
def expFun2(a1,a2,X1,X2,T,u):
return X1*sym.exp(-a1*(T-u))+X2*sym.exp(-a2*(T-u))
expFun2(*sym.symbols('a1 a2 X1 X2 T u'))
并在 Skpyder 4 控制台上获得有趣的输出 window。
我正在使用 Python 3.7.6 和 Spyder 版本 4.2.1
在 isympy
会话中:
>>> from __future__ import division
>>> from sympy import *
>>> x, y, z, t = symbols('x y z t')
>>> k, m, n = symbols('k m n', integer=True)
>>> f, g, h = symbols('f g h', cls=Function)
...
In [1]: def foo(a,b,c):
...: return a+b*c
...:
In [2]: foo(x,y,z)
Out[2]: x + y⋅z
In [3]: foo(symbols('a b c'))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-2bd97132ca00> in <module>
----> 1 foo(symbols('a b c'))
TypeError: foo() missing 2 required positional arguments: 'b' and 'c'
In [4]: foo(*symbols('a b c'))
Out[4]: a + b⋅c
foo
,而您的 expFun
是一个 python 函数,而不是 sympy
。适用常规 Python 语法。
symbols(...)
“returns 一系列符号”,即一个 python 元组(或取决于输入,只有一个符号对象)。
In [13]: symbols('x y') # a tuple
Out[13]: (x, y)
In [14]: a1, a2 = symbols('x y') # unpack that tuple
In [15]: a1
Out[15]: x
foo(*symbols('a b c'))
使用 *
将该元组解压为 foo
接受的 3 个参数。
Symbol
returns 只是一个符号对象,而不是多个像 symbols
:
In [18]: Symbol('x y')
Out[18]: x y
感谢您提供的所有有用意见。
结合这些建议,我设法实现了我最初的意图。这是摘要。
import sympy as sym
sym.init_printing(use_unicode=False, wrap_line=True)
X1, X2, a1, a2, T, u = sym.symbols('X1 X2 a1 a2 T u')
def expFun2(X1,X2,a1,a2,T,u):
return X1*sym.exp(-a1*(T-u))+X2*sym.exp(-a2*(T-u))
expFun2(*sym.symbols('X1 X2 a1 a2 T u'))
sym.init_printing(use_unicode=False, wrap_line=True)
解决了我在问题中报告的显示问题。
我想定义一个符号化函数 expFun 以便稍后用于集成。
我指的是
我当前的代码看起来像
import numpy as np
import sympy as sym
a1= sym.Symbol('a1')
a2= sym.Symbol('a2')
X1= sym.Symbol('X1')
X2= sym.Symbol('X2')
T= sym.Symbol('T')
u= sym.Symbol('u')
def expFun(a1,a2,X1,X2,T,u):
return X1*sym.exp(-a1*(T-u))+X2*sym.exp(-a2*(T-u))
expFun(sym.Symbol('a1 a2 X1 X2 T u'))
最后一行报错,说
TypeError: expFun() missing 5 required positional arguments: 'a2', 'X1', 'X2', 'T', and 'u'
我也试过这个也不管用:
expFun(sym.Symbol('a1','a2', 'X1','X2','T','u'))
将这些参数放入列表或集合中也没有帮助。
谁能告诉我如何解决这个问题?
#更新#
根据下面 hpaulj 的评论,我更新了我的代码如下。但我仍然遇到错误:(
from __future__ import division
import sympy as sym
X1, X2, a1, a2, T, u = sym.symbols('a1 a2 X1 X2 T u')
def expFun1(a1,a2,X1,X2,T,u):
return X1*np.exp(-a1*(T-u))+X2*np.exp(-a2*(T-u))
expFun1(*sym.symbols('a1 a2 X1 X2 T u'))
然后是错误信息
TypeError: loop of ufunc does not support argument 0 of type Mul which has no callable exp method
然后我试了这个
def expFun2(a1,a2,X1,X2,T,u):
return X1*sym.exp(-a1*(T-u))+X2*sym.exp(-a2*(T-u))
expFun2(*sym.symbols('a1 a2 X1 X2 T u'))
并在 Skpyder 4 控制台上获得有趣的输出 window。
我正在使用 Python 3.7.6 和 Spyder 版本 4.2.1
在 isympy
会话中:
>>> from __future__ import division
>>> from sympy import *
>>> x, y, z, t = symbols('x y z t')
>>> k, m, n = symbols('k m n', integer=True)
>>> f, g, h = symbols('f g h', cls=Function)
...
In [1]: def foo(a,b,c):
...: return a+b*c
...:
In [2]: foo(x,y,z)
Out[2]: x + y⋅z
In [3]: foo(symbols('a b c'))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-2bd97132ca00> in <module>
----> 1 foo(symbols('a b c'))
TypeError: foo() missing 2 required positional arguments: 'b' and 'c'
In [4]: foo(*symbols('a b c'))
Out[4]: a + b⋅c
foo
,而您的 expFun
是一个 python 函数,而不是 sympy
。适用常规 Python 语法。
symbols(...)
“returns 一系列符号”,即一个 python 元组(或取决于输入,只有一个符号对象)。
In [13]: symbols('x y') # a tuple
Out[13]: (x, y)
In [14]: a1, a2 = symbols('x y') # unpack that tuple
In [15]: a1
Out[15]: x
foo(*symbols('a b c'))
使用 *
将该元组解压为 foo
接受的 3 个参数。
Symbol
returns 只是一个符号对象,而不是多个像 symbols
:
In [18]: Symbol('x y')
Out[18]: x y
感谢您提供的所有有用意见。 结合这些建议,我设法实现了我最初的意图。这是摘要。
import sympy as sym
sym.init_printing(use_unicode=False, wrap_line=True)
X1, X2, a1, a2, T, u = sym.symbols('X1 X2 a1 a2 T u')
def expFun2(X1,X2,a1,a2,T,u):
return X1*sym.exp(-a1*(T-u))+X2*sym.exp(-a2*(T-u))
expFun2(*sym.symbols('X1 X2 a1 a2 T u'))
sym.init_printing(use_unicode=False, wrap_line=True)
解决了我在问题中报告的显示问题。