Python 写SymPy积分的一般方法?

Python 写SymPy积分的一般方法?,python,sympy,Python,Sympy,现在,要将函数fx与Symphy集成,我将执行以下操作: from sympy.abc import alpha as _alpha_, beta as _beta_, x as _x_ sym_args = _alpha_, _beta_ fx_definite_integral = sympy.integrate(fx(_x_, *sym_args), (_x_, xmin, xmax)) 但这需要我事先知道给定函数可能需要什么符号。但是如果我插入一个不同的函数,使用参数,比如,a,B

现在,要将函数
fx
与Symphy集成,我将执行以下操作:

from sympy.abc import alpha as _alpha_, beta as _beta_, x as _x_

sym_args = _alpha_, _beta_

fx_definite_integral = sympy.integrate(fx(_x_, *sym_args), (_x_, xmin, xmax))
但这需要我事先知道给定函数可能需要什么符号。但是如果我插入一个不同的函数,使用参数,比如,a,B,Y,Z,Q,W,会怎么样

除了在symphy中手动分配符号外,是否有一种方法可以根据输入函数一般分配符号-基本上是my
sym_args

理想的

sym_args = sympy.all_the_symbols_I_need_for_random_function(fx)

这个问题的定义有点不准确,因为毕竟,您需要了解一些关于
fx
的参数,对吗?例如,
fx
应该至少有一个
x
的参数;它始终是第一个参数,还是称为
x
的参数,可能是也可能不是第一个?是否应为其余参数指定一个特定的名称序列,例如
alpha
beta
等,还是使用符号作为参数名称?如果参数有默认值怎么办

我将为一个简单的示例提供一种可能的方法,然后您可以根据您的案例选择如何实现它。让我们用这个函数:

def fx(x, a, b, c):
    return x * (a + (b / c))
为了提取有关函数参数的信息,可以使用

在这里,您可以使用不同的策略。例如,如果希望第一个参数始终为
x
,其余参数始终为希腊字母(只要参数不太多),可以执行以下操作:

import sympy.abc
fx_argsym = [sympy.abc.x] + list(sympy.symbols(sympy.abc.greeks[:len(fx_args) - 1]))
# fx_argsym <- [x, alpha, beta, gamma]
请注意,如果未确保
x
位于
fx_argsym
中,则可能会出现错误,但这很容易检查,例如:

assert _x_ in fx_argsym
你可以用

f = Function('f')
expr.Integral(f(x), (x, xmin, xmax))
然后使用
expr.replace(f,你的函数)
用你的函数替换
f
。您需要
您的_函数
,以便它接受一个参数来匹配
f
。就
Integral
而言,它只需要知道
f
依赖于
x
。其余(常量)变量可以是“in”
f


例如,如果表达式是
x+A+B
,则可以使用
expr.replace(f,lambda x:x+A+B)

这里的
fx
是什么?是Python函数返回Symphy表达式吗?是数学函数的表达式,例如
def fx(x,alpha,beta):返回x+alpha**2+beta
,这里我必须手动为所有输入参数定义符号。Symphy不集成函数,而是集成表达式。符号表达式不需要插入任何内容,它已经包含符号。当您编写Python函数(如
def fx…
以在Symphy中使用)时,您可能过于复杂了。PyCharm告诉我,Python3不推荐使用
inspect.getargspec(fx).args
。相反,我必须使用
fx_args=[*inspect.signature(fx.parameters.keys()]
从列表中取出参数(否则,返回一个OrderedDict),以便Symphy获取这些参数。@komodovaran_uu感谢,我没有注意到这一点。根据文件,这应该是一个有效的替代品,但你可以这样做,但它最适合你。哦,你完全正确。这是因为PyCharm没有在自动完成中拾取
.args
,所以我认为它不存在。这就是你不阅读手册所得到的。
fx_definite_integral = sympy.integrate(fx(*fx_argsym), (_x_, xmin, xmax))
assert _x_ in fx_argsym
f = Function('f')
expr.Integral(f(x), (x, xmin, xmax))