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中手动分配符号外,是否有一种方法可以根据输入函数一般分配符号-基本上是mysym_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))