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)\) 表示 \(y(x)\) 对 x
进行 n
次微分。
因此,微分方程也可以写成 \(D^{2} \cdot y(x) + y(x) = 0\) 或 \((D^{2} + 1) \cdot y(x) = 0\)。\(y(x)\) 左边的部分是零化子,即 \(D^{2}+1\)。
因此,这就是如何将 \(\sin(x)\) 表示为一个 Holonomic 函数:
>>> 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]
的成员。函数 DifferentialOperators()
返回的 D
操作符可以像 SymPy 表达式一样用于创建零化子。我们目前使用 SymPy 中较旧的环实现来实现优先机制。
- class sympy.holonomic.holonomic.HolonomicFunction(annihilator, x, x0=0, y0=None)[源代码][源代码]¶
一个全纯函数是具有多项式系数的线性齐次常微分方程的解。这个微分方程也可以用一个零化子来表示,即一个微分算子
L
使得 \(L.f = 0\)。为了这些函数的唯一性,可以与零化子一起提供初始条件。方法
change_ics
(b[, lenics])将初始条件的点 \(x0\) 更改为
b
。change_x
(z)仅更改Holonomic函数的变量,用于内部目的。
composition
(expr, *args, **kwargs)返回在组合一个全纯函数与一个代数函数之后的函数。
degree
()返回在零化子中 \(x\) 的最高次幂。
diff
(*args, **kwargs)给定Holonomic函数的微分。
evalf
(points[, method, h, derivatives])使用数值方法找到一个全纯函数的数值。
integrate
(limits[, initcond])积分给定的全纯函数。
is_singularics
()如果函数在字典格式中有单一的初始条件,则返回 True。
series
([n, coefficient, order, _recur])找到给定holonomic函数在 \(x_0\) 处的幂级数展开。
shift_x
(a)将 \(x + a\) 替换为 \(x\)。
to_expr
()将一个全纯函数转换回初等函数。
to_hyper
([as_list, _recur])返回一个超几何函数(或它们的线性组合),表示给定的正合函数。
返回一个 Meijer G-函数的线性组合。
to_sequence
([lb])找到函数在 \(x_0\) 处展开的级数中系数的递推关系,其中 \(x_0\) 是存储初始条件的点。
unify
(other)统一给定两个Holonomic函数的基多项式环。
示例
>>> 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()\) 进行数值计算。以下是使用 numpy 和 matplotlib 对 \(sin(x)**2/x\) 的示例。
>>> 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代数的元素。这些算子由基环中的一系列多项式以及算子所属的父环(即代数)定义。
方法
is_singular
(x0)检查微分方程在 x0 处是否奇异。
示例
>>> 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
或字符串。例如,“Dx” 或 “D”。
示例
>>> 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 = \sigma(a)Dx + \delta(a)\]对于 \(a \subset A\)。
其中 \(\sigma: A \Rightarrow A\) 是一个自同态,而 \(\delta: A \rightarrow A\) 是一个斜导数,即 \(\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]