带多个参数的 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) 解决了我在问题中报告的显示问题。