完整函数的运算#

加法和乘法#

两个完整函数可以相加或相乘,结果也是一个完整函数。

>>> from sympy.holonomic.holonomic import HolonomicFunction, DifferentialOperators
>>> from sympy.polys.domains import QQ
>>> from sympy import symbols
>>> x = symbols('x')
>>> R, Dx = DifferentialOperators(QQ.old_poly_ring(x),'Dx')

pq 以下是 \(e^x\)\(\sin(x)\) 分别。

>>> p = HolonomicFunction(Dx - 1, x, 0, [1])
>>> q = HolonomicFunction(Dx**2 + 1, x, 0, [0, 1])

完整表示 \(e^x+\sin(x)\)

>>> p + q
HolonomicFunction((-1) + (1)*Dx + (-1)*Dx**2 + (1)*Dx**3, x, 0, [1, 2, 1])

完整表示 \(e^x \cdot \sin(x)\)

>>> p * q
HolonomicFunction((2) + (-2)*Dx + (1)*Dx**2, x, 0, [0, 1])

整合与差异化#

HolonomicFunction.integrate(limits, initcond=False)[源代码]#

对给定的完整函数进行积分。

实例

>>> from sympy.holonomic.holonomic import HolonomicFunction, DifferentialOperators
>>> from sympy import QQ
>>> from sympy import symbols
>>> x = symbols('x')
>>> R, Dx = DifferentialOperators(QQ.old_poly_ring(x),'Dx')
>>> HolonomicFunction(Dx - 1, x, 0, [1]).integrate((x, 0, x))  # e^x - 1
HolonomicFunction((-1)*Dx + (1)*Dx**2, x, 0, [0, 1])
>>> HolonomicFunction(Dx**2 + 1, x, 0, [1, 0]).integrate((x, 0, x))
HolonomicFunction((1)*Dx + (1)*Dx**3, x, 0, [0, 1, 0])
HolonomicFunction.diff(*args, **kwargs)[源代码]#

给定完整函数的微分。

实例

>>> from sympy.holonomic.holonomic import HolonomicFunction, DifferentialOperators
>>> from sympy import ZZ
>>> from sympy import symbols
>>> x = symbols('x')
>>> R, Dx = DifferentialOperators(ZZ.old_poly_ring(x),'Dx')
>>> HolonomicFunction(Dx**2 + 1, x, 0, [0, 1]).diff().to_expr()
cos(x)
>>> HolonomicFunction(Dx - 2, x, 0, [1]).diff().to_expr()
2*exp(2*x)

参见

integrate

多项式合成#

HolonomicFunction.composition(expr, *args, **kwargs)[源代码]#

Returns function after composition of a holonomic function with an algebraic function. The method cannot compute initial conditions for the result by itself, so they can be also be provided.

实例

>>> from sympy.holonomic.holonomic import HolonomicFunction, DifferentialOperators
>>> from sympy import QQ
>>> from sympy import symbols
>>> x = symbols('x')
>>> R, Dx = DifferentialOperators(QQ.old_poly_ring(x),'Dx')
>>> HolonomicFunction(Dx - 1, x).composition(x**2, 0, [1])  # e^(x**2)
HolonomicFunction((-2*x) + (1)*Dx, x, 0, [1])
>>> HolonomicFunction(Dx**2 + 1, x).composition(x**2 - 1, 1, [1, 0])
HolonomicFunction((4*x**3) + (-1)*Dx + (x)*Dx**2, x, 1, [1, 0])

参见

from_hyper

转换为完整序列#

HolonomicFunction.to_sequence(lb=True)[源代码]#

求函数级数展开中系数的递推关系 \(x_0\) 在哪里 \(x_0\) 是存储初始条件的点。

解释

如果这一点 \(x_0\) 是普通的,解的形式 \([(R, n_0)]\) 返回。在哪里? \(R\) 是递归关系和 \(n_0\) 是最小的 n 重复出现的情况。

如果这一点 \(x_0\) 是正则单数,是一种格式的解决方案列表 \((R, p, n_0)\) 返回,即。 \([(R, p, n_0), ... ]\) . 这个向量中的每个元组代表一个递归关系 \(R\) 与指数方程的根有关 p . 在这种情况下也可以提供不同格式的条件,请参见HolonomicFunction类的docstring。

如果无法用数值计算初始条件,它将作为符号返回 \(C_j\) ,表示 \((x - x_0)^j\) 在幂级数中关于 \(x_0\) .

实例

>>> 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')
>>> HolonomicFunction(Dx - 1, x, 0, [1]).to_sequence()
[(HolonomicSequence((-1) + (n + 1)Sn, n), u(0) = 1, 0)]
>>> HolonomicFunction((1 + x)*Dx**2 + Dx, x, 0, [0, 1]).to_sequence()
[(HolonomicSequence((n**2) + (n**2 + n)Sn, n), u(0) = 0, u(1) = 1, u(2) = -1/2, 2)]
>>> HolonomicFunction(-S(1)/2 + x*Dx, x, 0, {S(1)/2: [1]}).to_sequence()
[(HolonomicSequence((n), n), u(0) = 1, 1/2, 1)]

工具书类

级数展开#

HolonomicFunction.series(n=6, coefficient=False, order=True, _recur=None)[源代码]#

求给定完整函数的幂级数展开式 \(x_0\) .

解释

如果 \(x_0\) 是一个正则点,它具有指数方程的多个根。

实例

>>> from sympy.holonomic.holonomic import HolonomicFunction, DifferentialOperators
>>> from sympy import QQ
>>> from sympy import symbols
>>> x = symbols('x')
>>> R, Dx = DifferentialOperators(QQ.old_poly_ring(x),'Dx')
>>> HolonomicFunction(Dx - 1, x, 0, [1]).series()  # e^x
1 + x + x**2/2 + x**3/6 + x**4/24 + x**5/120 + O(x**6)
>>> HolonomicFunction(Dx**2 + 1, x, 0, [0, 1]).series(n=8)  # sin(x)
x - x**3/6 + x**5/120 - x**7/5040 + O(x**8)

数值计算#

HolonomicFunction.evalf(points, method='RK4', h=0.05, derivatives=False)[源代码]#

用数值方法求完整函数的数值。(默认为RK4)。必须提供一组点(实数或复数),这将是数值积分的路径。

解释

The path should be given as a list \([x_1, x_2, \dots x_n]\). The numerical values will be computed at each point in this order \(x_1 \rightarrow x_2 \rightarrow x_3 \dots \rightarrow x_n\).

Returns values of the function at \(x_1, x_2, \dots x_n\) in a list.

实例

>>> from sympy.holonomic.holonomic import HolonomicFunction, DifferentialOperators
>>> from sympy import QQ
>>> from sympy import symbols
>>> x = symbols('x')
>>> R, Dx = DifferentialOperators(QQ.old_poly_ring(x),'Dx')

从(0到1)的实轴上的直线

>>> r = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]

从0.1到1在e^x上的Runge-Kutta四阶。1处的精确解为2.71828182845905

>>> HolonomicFunction(Dx - 1, x, 0, [1]).evalf(r)
[1.10517083333333, 1.22140257085069, 1.34985849706254, 1.49182424008069,
1.64872063859684, 1.82211796209193, 2.01375162659678, 2.22553956329232,
2.45960141378007, 2.71827974413517]

欧拉方法

>>> HolonomicFunction(Dx - 1, x, 0, [1]).evalf(r, method='Euler')
[1.1, 1.21, 1.331, 1.4641, 1.61051, 1.771561, 1.9487171, 2.14358881,
2.357947691, 2.5937424601]

我们还可以观察到,用龙格-库塔四阶法得到的数值比欧拉法要精确得多。

转换为超几何函数的线性组合#

HolonomicFunction.to_hyper(as_list=False, _recur=None)[源代码]#

返回表示给定完整函数的超几何函数(或它们的线性组合)。

解释

Returns an answer of the form: \(a_1 \cdot x^{b_1} \cdot{hyper()} + a_2 \cdot x^{b_2} \cdot{hyper()} \dots\)

这是非常有用的,因为我们现在可以使用 hyperexpand 找到符号表达式/函数。

实例

>>> from sympy.holonomic.holonomic import HolonomicFunction, DifferentialOperators
>>> from sympy import ZZ
>>> from sympy import symbols
>>> x = symbols('x')
>>> R, Dx = DifferentialOperators(ZZ.old_poly_ring(x),'Dx')
>>> # sin(x)
>>> HolonomicFunction(Dx**2 + 1, x, 0, [0, 1]).to_hyper()
x*hyper((), (3/2,), -x**2/4)
>>> # exp(x)
>>> HolonomicFunction(Dx - 1, x, 0, [1]).to_hyper()
hyper((), (), x)

转化为Meijer G函数的线性组合#

HolonomicFunction.to_meijerg()[源代码]#

返回Meijer G函数的线性组合。

实例

>>> from sympy.holonomic import expr_to_holonomic
>>> from sympy import sin, cos, hyperexpand, log, symbols
>>> x = symbols('x')
>>> hyperexpand(expr_to_holonomic(cos(x) + sin(x)).to_meijerg())
sin(x) + cos(x)
>>> hyperexpand(expr_to_holonomic(log(x)).to_meijerg()).simplify()
log(x)

参见

to_hyper

转换为表达式#

HolonomicFunction.to_expr()[源代码]#

将完整函数转换回初等函数。

实例

>>> from sympy.holonomic.holonomic import HolonomicFunction, DifferentialOperators
>>> from sympy import ZZ
>>> from sympy import symbols, S
>>> x = symbols('x')
>>> R, Dx = DifferentialOperators(ZZ.old_poly_ring(x),'Dx')
>>> HolonomicFunction(x**2*Dx**2 + x*Dx + (x**2 - 1), x, 0, [0, S(1)/2]).to_expr()
besselj(1, x)
>>> HolonomicFunction((1 + x)*Dx**3 + Dx**2, x, 0, [1, 1, 1]).to_expr()
x*log(x + 1) + log(x + 1) + 1