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])

返回一个超几何函数(或它们的线性组合),表示给定的正合函数。

to_meijerg()

返回一个 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
is_singular(x0)[源代码][源代码]

检查微分方程在 x0 处是否奇异。

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]