SymPy中完整函数的表示#
等级 DifferentialOperator
用来表示零化子,但是我们很容易用这个函数来创建微分算子 DifferentialOperators()
. 等级 HolonomicFunction
表示完整函数。
让我们用一个例子来解释一下:
接受 \(\sin(x)\) 例如,它所满足的微分方程是 \(y^{{(2)}}(x) + y(x) = 0\) . 根据定义,我们认为它是一个完整的函数。这首颂歌的一般解决方案是 \(C_{{1}} \cdot \sin(x) + C_{{2}} \cdot \cos(x)\) 但是为了得到 \(\sin(x)\) 我们需要提供初始条件,即。 \(y(0) = 0, y^{{(1)}}(0) = 1\) .
为了在这个模块中表示相同的,我们需要以零化子的形式提供微分方程。基本上微分算子是微分函数上的算子。所以 \(D^{{n}} \cdot y(x) = y^{{(n)}}(x)\) 在哪里? \(y^{{(n)}}(x)\) 表示 n
时间微分 \(y(x)\) 关于 x
.
所以微分方程也可以写成 \(D^{{2}} \cdot y(x) + y(x) = 0\) 或 \((D^{{2}} + 1) \cdot y(x) = 0\) . 剩下的部分 \(y(x)\) 是歼灭者,即。 \(D^{{2}}+1\) .
所以这就是一个人将如何表现 \(\sin(x)\) 作为完整函数:
>>> from sympy.holonomic import DifferentialOperators, HolonomicFunction
>>> from sympy.abc import x
>>> from sympy import ZZ
>>> R, D = DifferentialOperators(ZZ.old_poly_ring(x), 'D')
>>> HolonomicFunction(D**2 + 1, x, 0, [0, 1])
HolonomicFunction((1) + (1)*D**2, x, 0, [0, 1])
多项式的系数将是环的成员 ZZ[x]
在示例中。这个 D
函数返回的运算符 DifferentialOperators()
可以用来创造湮灭子就像交响表达式一样。我们目前使用SymPy中较旧的环实现作为优先级机制。
- class sympy.holonomic.holonomic.HolonomicFunction(annihilator, x, x0=0, y0=None)[源代码]#
完整函数是具有多项式系数的线性齐次常微分方程的解。这个微分方程也可以用零化子,即微分算子来表示
L
这样的话 \(L.f = 0\) . 对于这些函数的唯一性,初始条件也可以随零化子一起提供。解释
完整函数具有闭包性质,因此形成环。给定两个完整函数f和g,它们的和、积、积分和导数也是完整函数。
对于普通点,初始条件应为导数值的向量,即。 \([y(x_0), y'(x_0), y''(x_0) ... ]\) .
对于常规奇点,初始条件也可按以下格式提供: \({{s0: [C_0, C_1, ...], s1: [C^1_0, C^1_1, ...], ...}}\) 其中s0,s1。。。是指征方程和向量的根 \([C_0, C_1, ...], [C^0_0, C^0_1, ...], ...\) 是相关幂级数的相应初始项。参见下面的示例。
实例
>>> from sympy.holonomic.holonomic import HolonomicFunction, DifferentialOperators >>> from sympy import QQ >>> from sympy import symbols, S >>> x = symbols('x') >>> R, Dx = DifferentialOperators(QQ.old_poly_ring(x),'Dx')
>>> p = HolonomicFunction(Dx - 1, x, 0, [1]) # e^x >>> q = HolonomicFunction(Dx**2 + 1, x, 0, [0, 1]) # sin(x)
>>> p + q # annihilator of e^x + sin(x) HolonomicFunction((-1) + (1)*Dx + (-1)*Dx**2 + (1)*Dx**3, x, 0, [1, 2, 1])
>>> p * q # annihilator of e^x * sin(x) HolonomicFunction((2) + (-2)*Dx + (1)*Dx**2, x, 0, [0, 1])
作为正则奇点初始条件的一个例子,示性方程只有一个根 \(1/2\) .
>>> HolonomicFunction(-S(1)/2 + x*Dx, x, 0, {S(1)/2: [1]}) HolonomicFunction((-1/2) + (x)*Dx, x, 0, {1/2: [1]})
>>> HolonomicFunction(-S(1)/2 + x*Dx, x, 0, {S(1)/2: [1]}).to_expr() sqrt(x)
要绘制完整函数,可以使用 \(.evalf()\) 数值计算。下面是一个关于 \(sin(x)**2/x\) 使用numpy和matplotlib。
>>> import sympy.holonomic >>> from sympy import var, sin >>> import matplotlib.pyplot as plt >>> import numpy as np >>> var("x") >>> r = np.linspace(1, 5, 100) >>> y = sympy.holonomic.expr_to_holonomic(sin(x)**2/x, x0=1).evalf(r) >>> plt.plot(r, y, label="holonomic function") >>> plt.show()
- class sympy.holonomic.holonomic.DifferentialOperator(list_of_poly, parent)[源代码]#
微分算子是Weyl代数的元素。算子是由基环和算子的父环(即它所属的代数)中的多项式列表定义的。
解释
取多项式的每一次幂的多项式列表
Dx
父环必须是微分算子代数的一个实例。使用该运算符可以轻松创建微分运算符
Dx
. 参见下面的示例。实例
>>> from sympy.holonomic.holonomic import DifferentialOperator, DifferentialOperators >>> from sympy import ZZ >>> from sympy import symbols >>> x = symbols('x') >>> R, Dx = DifferentialOperators(ZZ.old_poly_ring(x),'Dx')
>>> DifferentialOperator([0, 1, x**2], R) (1)*Dx + (x**2)*Dx**2
>>> (x*Dx*x + 1 - Dx**2)**2 (2*x**2 + 2*x + 1) + (4*x**3 + 2*x**2 - 4)*Dx + (x**4 - 6*x - 2)*Dx**2 + (-2*x**2)*Dx**3 + (1)*Dx**4
- sympy.holonomic.holonomic.DifferentialOperators(base, generator)[源代码]#
此函数用于创建零化子
Dx
.- 参数:
底座:
代数的基多项式环。基多项式环是 \(x\) 这将在运算符中显示为系数。
发电机:
代数的生成元可以是非交换的
Symbol
或者一根绳子。e、 g.“Dx”或“D”。
解释
返回微分算子的代数,也称为Weyl代数和微分算子,即
Dx
操作员。实例
>>> from sympy import ZZ >>> from sympy.abc import x >>> from sympy.holonomic.holonomic import DifferentialOperators >>> R, Dx = DifferentialOperators(ZZ.old_poly_ring(x), 'Dx') >>> R Univariate Differential Operator Algebra in intermediate Dx over the base ring ZZ[x] >>> Dx*x (1) + (x)*Dx
- class sympy.holonomic.holonomic.DifferentialOperatorAlgebra(base, generator)[源代码]#
Ore代数是一组中间的非交换多项式
Dx
基多项式环上的系数 \(A\) . 它遵循减刑规则:\[Dxa=\西格玛(a)Dx+\delta(a)\]对于 \(a \subset A\) .
Where \(\sigma: A \Rightarrow A\) is an endomorphism and \(\delta: A \rightarrow A\) is a skew-derivation i.e. \(\delta(ab) = \delta(a) b + \sigma(a) \delta(b)\).
如果把sigma作为恒等映射,delta作为标准导子,那么它就成为微分算子的代数,也称为Weyl代数,即元素为微分算子的代数。
这个类表示一个Weyl代数,用作微分算子的父环。
实例
>>> from sympy import ZZ >>> from sympy import symbols >>> from sympy.holonomic.holonomic import DifferentialOperators >>> x = symbols('x') >>> R, Dx = DifferentialOperators(ZZ.old_poly_ring(x), 'Dx') >>> R Univariate Differential Operator Algebra in intermediate Dx over the base ring ZZ[x]