sympy 函数的操作
Manipulation of sympy Functions
我正在研究任意离散函数,例如 x1(k)、x2(k) 等,其中 k 是一个整数,对于任何 k,xi(k) 是一个实数(但是,对于我想要执行的符号计算,我可能会添加它,这无关紧要)。
我需要以符号方式操作这些函数,即我需要能够执行典型的运算,例如这些函数的乘法或加法(例如 x1(k)x2(k)) 以及对其参数的操纵(例如 x1(2k+1 )).由于参数操作,我不能只使用 sympy 的 Symbol class 因为它们没有参数。相反,sympy 的 Function class 支持参数,我认为这正是我所需要的。但是对于像 x1*x2
这样的事情,它会抛出
TypeError: unsupported operand type(s) for *: 'UndefinedFunction' and 'UndefinedFunction'
因此,我不太确定函数 class 是否适合我正在寻找的东西,或者我是否只是误解了如何实现我需要的东西。我如何使用 sympy 进行此类计算?
编辑:
为了澄清,(在我知道 sympy.Symbol 中存在 cls
选项之前)我认为
import sympy as sp
x1 = sp.Symbol("x1")
由于缺乏论据,无法正常工作。所以我尝试了
k = sp.Symbol("k")
x1 = sp.Function("x1")(k)
会有参数,但会抛出 x1*x1
之类的错误。希望更清楚。
跟进问题:按照ForceBru的回答建议,如果我使用
k = sp.Symbol("k")
x1 = sp.symbols("x1", cls=sp.Function)(k)
x2 = sp.symbols("x2", cls=sp.Function)(k)
那么这似乎可以解决问题。但是,我还需要做的是将参数增加一个整数 j,即,我可能有一个像 2x1(2k+1)x2(2k+3) (甚至更复杂)在应用此操作后 returns 2x1 (2k+1+j)x2(2k+3+j)。不能真正使用 expr.args
,因为那不仅会 return x1 和 x2 的参数。此外,如果不仅 x1 和 x2 的参数受到影响,expr.subs
的使用可能会有风险。
您知道如何实现这一点吗?
EDIT2: 经过更多的尝试后,我发现使用 expr.atoms(sp.Function)
似乎可以工作,其中 return 是一个函数列表,然后可以被(j 次)自己的移位版本所取代。将接受 FroceBru 的回答,因为这是关键提示。
您的代码尝试乘以函数本身,而不是它们 应用程序 的结果。
I need to be able to perform typical operations like multiplication or addition of these functions (e.g. x1(k)x2(k)
)
你可以这样做:
>>> import sympy as sp
>>> x1, x2 = sp.symbols("x_1 x_2", cls=sp.Function)
>>> k = sp.Symbol('k')
>>> x1(k) * x2(k) # simple multiplication
x_1(k)*x_2(k)
>>> x1(2*k + 1) * x2(3*k + 2) # argument manipulation
x_1(2*k + 1)*x_2(3*k + 2)
区别在于x1 * x2
试图将函数本身相乘,但意义不大,除非*
表示卷积。例如,什么是 sin * cos
?相反,x1(k) * x2(k)
是一个合理的表达式,就像 sin(x) * cos(x)
,因为它是应用 x1
和 [=18] 的 结果 的乘积=] 到 k
.
我正在研究任意离散函数,例如 x1(k)、x2(k) 等,其中 k 是一个整数,对于任何 k,xi(k) 是一个实数(但是,对于我想要执行的符号计算,我可能会添加它,这无关紧要)。
我需要以符号方式操作这些函数,即我需要能够执行典型的运算,例如这些函数的乘法或加法(例如 x1(k)x2(k)) 以及对其参数的操纵(例如 x1(2k+1 )).由于参数操作,我不能只使用 sympy 的 Symbol class 因为它们没有参数。相反,sympy 的 Function class 支持参数,我认为这正是我所需要的。但是对于像 x1*x2
这样的事情,它会抛出
TypeError: unsupported operand type(s) for *: 'UndefinedFunction' and 'UndefinedFunction'
因此,我不太确定函数 class 是否适合我正在寻找的东西,或者我是否只是误解了如何实现我需要的东西。我如何使用 sympy 进行此类计算?
编辑:
为了澄清,(在我知道 sympy.Symbol 中存在 cls
选项之前)我认为
import sympy as sp
x1 = sp.Symbol("x1")
由于缺乏论据,无法正常工作。所以我尝试了
k = sp.Symbol("k")
x1 = sp.Function("x1")(k)
会有参数,但会抛出 x1*x1
之类的错误。希望更清楚。
跟进问题:按照ForceBru的回答建议,如果我使用
k = sp.Symbol("k")
x1 = sp.symbols("x1", cls=sp.Function)(k)
x2 = sp.symbols("x2", cls=sp.Function)(k)
那么这似乎可以解决问题。但是,我还需要做的是将参数增加一个整数 j,即,我可能有一个像 2x1(2k+1)x2(2k+3) (甚至更复杂)在应用此操作后 returns 2x1 (2k+1+j)x2(2k+3+j)。不能真正使用 expr.args
,因为那不仅会 return x1 和 x2 的参数。此外,如果不仅 x1 和 x2 的参数受到影响,expr.subs
的使用可能会有风险。
您知道如何实现这一点吗?
EDIT2: 经过更多的尝试后,我发现使用 expr.atoms(sp.Function)
似乎可以工作,其中 return 是一个函数列表,然后可以被(j 次)自己的移位版本所取代。将接受 FroceBru 的回答,因为这是关键提示。
您的代码尝试乘以函数本身,而不是它们 应用程序 的结果。
I need to be able to perform typical operations like multiplication or addition of these functions (e.g.
x1(k)x2(k)
)
你可以这样做:
>>> import sympy as sp
>>> x1, x2 = sp.symbols("x_1 x_2", cls=sp.Function)
>>> k = sp.Symbol('k')
>>> x1(k) * x2(k) # simple multiplication
x_1(k)*x_2(k)
>>> x1(2*k + 1) * x2(3*k + 2) # argument manipulation
x_1(2*k + 1)*x_2(3*k + 2)
区别在于x1 * x2
试图将函数本身相乘,但意义不大,除非*
表示卷积。例如,什么是 sin * cos
?相反,x1(k) * x2(k)
是一个合理的表达式,就像 sin(x) * cos(x)
,因为它是应用 x1
和 [=18] 的 结果 的乘积=] 到 k
.