用Meijer G函数计算积分#
本文旨在较详细地描述用Meijer G-函数计算定积分和不定积分所涉及的步骤和细节。我们将完全忽略证据。
概述#
计算的算法 \(\int f(x) \mathrm{{d}}x\) 或 \(\int_0^\infty f(x) \mathrm{{d}}x\) 一般包括三个步骤:
使用Meijer G函数(一个或两个)重写被积函数。
应用积分定理,得到答案(通常用另一个G函数表示)。
在命名特殊函数中展开结果。
步骤(3)在函数hyperexpand(q.v.)中实现。步骤(1)和(2)如下所述。此外,G-函数通常是分枝的。因此,我们首先描述分支函数的处理。
其他一些积分(例如。 \(\int_{{-\infty}}^\infty\) )也可以通过第一次重铸成上述形式之一来计算。这里涉及到很多选择,而且算法充其量是启发式的。
极数与分枝函数#
Meijer G函数和超几何函数都是典型的分支(可能的分支点是 \(0\) , \(\pm 1\) , \(\infty\) ). 这在将单个超几何函数扩展为命名的特殊函数时并不十分重要,因为可以将分支排序留给人类用户。不过,至少需要理解一些粗略的算法和技巧。
首先,我们考虑一下 \(\mathcal{{S}} = \{{(r, \theta) : r > 0, \theta \in \mathbb{{R}}\}}\) . 我们有地图 \(p: \mathcal{{S}}: \rightarrow \mathbb{{C}}-\{{0\}}, (r, \theta) \mapsto r e^{{i \theta}}\) . 把它定为局部双全形 \(\mathcal{{S}}\) 拓扑结构和复杂结构。这个黎曼曲面通常被称为对数的黎曼曲面,原因如下:我们可以定义映射 \(\operatorname{{Exp}}: \mathbb{{C}} \rightarrow \mathcal{{S}}, (x + i y) \mapsto (\exp(x), y)\) 和 \(\operatorname{{Log}}: \mathcal{{S}} \rightarrow \mathbb{{C}}, (e^x, y) \mapsto x + iy\) . 它们都可以被证明是全纯的,并且确实是相互的逆。
我们有时也会正式附加一点“零” (\(0\) 到 \(\mathcal{{S}}\) 并表示结果对象 \(\mathcal{{S}}_0\) . 值得注意的是,附近没有定义复杂的结构 \(0\) . 邻里关系的基本制度由 \(\{{\operatorname{{Exp}}(z) : \Re(z) < k\}}\) ,它至少定义了一个拓扑。元素 \(\mathcal{{S}}_0\) 称为极数。我们进一步定义函数 \(\operatorname{{Arg}}: \mathcal{{S}} \rightarrow \mathbb{{R}}, (r, \theta) \mapsto \theta\) 和 \(|.|: \mathcal{{S}}_0 \rightarrow \mathbb{{R}}_{{>0}}, (r, \theta) \mapsto r\) . 这些都有明显的意义,而且在任何地方都是连续的。
使用这些映射可以扩展许多操作 \(\mathbb{{C}}\) 到 \(\mathcal{{S}}\) . 我们定义 \(\operatorname{{Exp}}(a) \operatorname{{Exp}}(b) = \operatorname{{Exp}}(a + b)\) 对于 \(a, b \in \mathbb{{C}}\) ,也用于 \(a \in \mathcal{{S}}\) 和 \(b \in \mathbb{{C}}\) 我们定义 \(a^b = \operatorname{{Exp}}(b \operatorname{{Log}}(a))\) . 使用这些定义可以很容易地检查出,许多代数性质都适用于正实数(例如。 \((ab)^c = a^c b^c\) )能坚持住吗 \(\mathbb{{C}}\) 只有某些数字(因为分支切断)才适用于所有极性数。
作为一个特点,应该提到的是,极数的加法通常没有定义。然而,极数的形式和可以用来表示分支行为。例如,考虑函数 \(F(z) = \sqrt{{1 + z}}\) 和 \(G(a, b) = \sqrt{{a + b}}\) 在哪里 \(a, b, z\) 是极数。在一般意义上,极性圆的定义是连续的,这是因为它们的定义是连续的。因此如果 \(S(z)\) 表示平方根函数的标准分支 \(\mathbb{{C}}\) ,我们不得不定义
(我们省略了 \(|z| = 1\) 在这里,这对于集成来说并不重要。)最后我们定义 \(G(a, b) = \sqrt{{a}}F(b/a)\) .
在Argand平面上表示分支函数#
假设 \(f: \mathcal{{S}} \to \mathbb{{C}}\) 是一个全纯函数。我们想定义一个函数 \(F\) 关于复数的(部分) \(\mathbb{{C}}\) 代表着 \(f\) 尽可能接近。这个过程被称为“引入分支切割”。在我们的情况下,实际上有一个规范的方法来做这件事(在所有的SymPy中都是这样),如下:引入“切复平面” \(C = \mathbb{{C}} \setminus \mathbb{{R}}_{{\le 0}}\) . 定义函数 \(l: C \to \mathcal{{S}}\) 通过 \(re^{{i\theta}} \mapsto r \operatorname{{Exp}}(i\theta)\) . 在这里 \(r > 0\) 和 \(-\pi < \theta \le \pi\) . 然后 \(l\) 是全纯的,我们定义 \(G = f \circ l\) . 这在整个SymPy文档中被称为“提升到主要分支”。
表查找和逆Mellin变换#
假设我们有一个被积函数 \(f(x)\) and are trying to rewrite it as a single G-function. To do this, we first split \(f(x)\) into the form \(x^s g(x)\) (where \(g(x)\) is supposed to be simpler than \(f(x)\)). This is because multiplicative powers can be absorbed into the G-function later. This splitting is done by _ 分割`
。然后,我们将在 \(f\) (e.g. if \(f(x) = e^x \cos{{x}}\), we would assemble the tuple \((\cos, \exp)\)). This is done by the function _ 我的类型(f,x)
。接下来,我们索引一个查找表(使用 _create_lookup_table()
)用这个元组。这(希望)会产生一个包含这些函数的Meijer G函数公式的列表,然后我们对它们进行模式匹配。如果合适的话,我们成功了,否则就不行了,我们必须尝试其他方法。
假设我们要重写为两个G函数的乘积。为了做到这一点,我们(试图)找到所有不相等的分裂方式 \(f(x)\) into a product \(f_1(x) f_2(x)\). We could try these splittings in any order, but it is often a good idea to minimize (a) the number of powers occurring in \(f_i(x)\) and (b) the number of different functions occurring in \(f_i(x)\). Thus given e.g. \(f(x) = \sin{{x}}\, e^{{x}} \sin{{2x}}\) we should try \(f_1(x) = \sin{{x}}\, \sin{{2x}}\), \(f_2(x) = e^{{x}}\) first. All of this is done by the function _ 两个部分(f)
。
最后,我们可以尝试递归Mellin变换技术。由于Meijer G函数本质上定义为一个特定的逆mellin变换,如果我们要写一个函数 \(f(x)\) 作为一个G函数,我们可以计算它的mellin变换 \(F(s)\) .如果 \(F(s)\) 如果形式正确,则可以读取G函数表达式。这种技术概括了许多标准重写,例如。 \(e^{{ax}} e^{{bx}} = e^{{(a + b) x}}\) .
一个扭曲是有些函数没有mellin变换,即使它们可以写成G函数。这是真的,例如 \(f(x) = e^x \sin{{x}}\) (函数增长太快,无法进行mellin变换)。然而,如果函数被认为是解析的,那么我们可以尝试计算 \(f(ax)\) 对于参数 \(a\) 用解析延拓法推导了G函数表达式。(检查分析性很容易。由于我们无论如何只能处理函数的某个子集,所以我们只需过滤掉那些不可分析的。)
函数 _rewrite_single
执行表查找和递归mellin转换。功能 _rewrite1
和 _rewrite2
分别使用上述助手和 _rewrite_single
将它们的参数分别重写为一个或两个G函数。
应用积分定理#
如果被积函数被重铸成G-函数,计算积分相对容易。我们首先做一些替换来降低g函数的自变量的指数为单位(参见 _rewrite_saxena_1
和 _rewrite_saxena
,分别用于一个或两个G函数)。下一步我们将介绍积分定理适用的一系列条件。它可能会失败,主要有两个原因:要么是积分不存在,要么是推导定理的操作可能不被允许(更多细节,请看这里) [BlogPost]) .
有时这可以通过减少所涉及的G函数的参数来修正。例如,很明显G函数表示 \(e^z\) 满足 \(G(\operatorname{{Exp}}(2 \pi i)z) = G(z)\) 为了所有 \(z \in \mathcal{{S}}\) .功能 meijerg.get_period()
可以用来发现这个函数 principal_branch(z, period)
在里面 functions/elementary/complexes.py
可以用来利用信息。这是通过集成代码透明地完成的。
G函数积分定理#
本节将详细展示代码中使用的定积分定理。下面两个公式可以追溯到Meijer(事实上,他证明了更一般的公式;事实上,在文献中,公式通常以更一般的形式存在。然而,从我们这里给出的公式很容易推导出一般公式。似乎最好保持定理尽可能简单,因为它们无论如何都很复杂。):
- \[\国际机场\]
- \[\国际机场\]
更有趣的问题是这些公式在什么条件下有效。下面我们详细介绍在SymPy中实现的条件。它们是在 [Prudnikov1990] 和 [Luke1969]; 如果您发现任何错误,请告诉我们。
积分的收敛条件(1)#
我们可以不失概括性地假设 \(p \le q\) ,因为指数的G函数 \(m, n, p, q\) 和指数 \(n, m, q, p\) 可以很容易地联系起来(参见。 [Luke1969], 第5.3节)。我们介绍以下符号:
收敛条件将在几个“情况”中详细说明,编号为1到5。对于以后的使用,将条件“无穷大”与“零”分开是很有帮助的。我们所说的“无穷大”条件,是指那些只依赖于被积函数的行为的条件 \(x\) ,而条件“在零”是指只依赖于被积函数的行为的条件 \((0, \epsilon)\) 对于任何 \(\epsilon > 0\) . 因为我们所有的条件都是以G函数的参数来指定的,所以这种区别并不是立即可见的。然而,它们在数学上有着非常明显的特点;在无穷远处的条件尤其难以控制。
为了使积分定理有效,条件 \(n\) 对某些人来说,“零”和“无限”都必须实现 \(n\) .
以下是“无限”的条件:
- \[\delta>0\wedge |\arg(\eta)|<\delta\pi\wedge(A\vee B\vee C),\]
在哪里?
\[A=1\le n\楔块p<q\楔块1\le m\]\[B=1\le p\楔块1\le m\楔块q=p+1\楔块\]\[C=1\le n\wedge q=p\楔|\arg(\eta)|\ne(\delta-2k)\pi\] - \[n=0\楔形p+1\le m\楔形|\arg(\eta)|<\delta\pi\]
- \[(p<q\wedge 1\le m\wedge\delta>0\wedge |\arg(\eta)|=\delta\pi)\]
- \[p=q\楔形物\δ=0\楔形物\ arg(\eta)=0\楔形物\预计到达时间\ne 0\]
- \[\增量>0\楔形|\arg(\eta)|<\delta\pi\]
这些是“零”条件:
- \[\预计到达时间\]
- \[C_3\]
- \[楔块3\楔块4\]
- \[C_3\]
- \[C_3\]
积分(2)的收敛条件#
我们介绍以下符号:
以下条件将有所帮助:
注意 \(C_{{16}}\) 和 \(C_{{17}}\) 是我们分开积分(1)的收敛条件的原因。
建立此符号后,实现的收敛条件可以列举如下:
- \[m n s t \neq 0 \wedge 0 < b^{*} \wedge 0 < c^{*} \wedge C_{1} \wedge C_{2} \wedge C_{3} \wedge C_{10} \wedge C_{12}\]
- \[u = v \wedge b^{*} = 0 \wedge 0 < c^{*} \wedge 0 < \sigma \wedge \Re{\rho} < 1 \wedge C_{1} \wedge C_{2} \wedge C_{3} \wedge C_{12}\]
- \[p = q \wedge u = v \wedge b^{*} = 0 \wedge c^{*} = 0 \wedge 0 < \sigma \wedge 0 < \omega \wedge \Re{\mu} < 1 \wedge \Re{\rho} < 1 \wedge \sigma \neq \omega \wedge C_{1} \wedge C_{2} \wedge C_{3}\]
- \[p = q \wedge u = v \wedge b^{*} = 0 \wedge c^{*} = 0 \wedge 0 < \sigma \wedge 0 < \omega \wedge \Re\left(\mu + \rho\right) < 1 \wedge \omega \neq \sigma \wedge C_{1} \wedge C_{2} \wedge C_{3}\]
- \[p = q \wedge u = v \wedge b^{*} = 0 \wedge c^{*} = 0 \wedge 0 < \sigma \wedge 0 < \omega \wedge \Re\left(\mu + \rho\right) < 1 \wedge \omega \neq \sigma \wedge C_{1} \wedge C_{2} \wedge C_{3}\]
- \[q < p \wedge 0 < s \wedge 0 < b^{*} \wedge 0 \leq c^{*} \wedge C_{1} \wedge C_{2} \wedge C_{3} \wedge C_{5} \wedge C_{10} \wedge C_{13}\]
- \[p < q \wedge 0 < t \wedge 0 < b^{*} \wedge 0 \leq c^{*} \wedge C_{1} \wedge C_{2} \wedge C_{3} \wedge C_{4} \wedge C_{10} \wedge C_{13}\]
- \[v < u \wedge 0 < m \wedge 0 < c^{*} \wedge 0 \leq b^{*} \wedge C_{1} \wedge C_{2} \wedge C_{3} \wedge C_{7} \wedge C_{11} \wedge C_{12}\]
- \[u < v \wedge 0 < n \wedge 0 < c^{*} \wedge 0 \leq b^{*} \wedge C_{1} \wedge C_{2} \wedge C_{3} \wedge C_{6} \wedge C_{11} \wedge C_{12}\]
- \[q < p \wedge u = v \wedge b^{*} = 0 \wedge 0 \leq c^{*} \wedge 0 < \sigma \wedge \Re{\rho} < 1 \wedge C_{1} \wedge C_{2} \wedge C_{3} \wedge C_{5} \wedge C_{13}\]
- \[p < q \wedge u = v \wedge b^{*} = 0 \wedge 0 \leq c^{*} \wedge 0 < \sigma \wedge \Re{\rho} < 1 \wedge C_{1} \wedge C_{2} \wedge C_{3} \wedge C_{4} \wedge C_{13}\]
- \[p = q \wedge v < u \wedge 0 \leq b^{*} \wedge c^{*} = 0 \wedge 0 < \omega \wedge \Re{\mu} < 1 \wedge C_{1} \wedge C_{2} \wedge C_{3} \wedge C_{7} \wedge C_{11}\]
- \[p = q \wedge u < v \wedge 0 \leq b^{*} \wedge c^{*} = 0 \wedge 0 < \omega \wedge \Re{\mu} < 1 \wedge C_{1} \wedge C_{2} \wedge C_{3} \wedge C_{6} \wedge C_{11}\]
- \[p < q \wedge v < u \wedge 0 \leq b^{*} \wedge 0 \leq c^{*} \wedge C_{1} \wedge C_{2} \wedge C_{3} \wedge C_{4} \wedge C_{7} \wedge C_{11} \wedge C_{13}\]
- \[q < p \wedge u < v \wedge 0 \leq b^{*} \wedge 0 \leq c^{*} \wedge C_{1} \wedge C_{2} \wedge C_{3} \wedge C_{5} \wedge C_{6} \wedge C_{11} \wedge C_{13}\]
- \[q < p \wedge v < u \wedge 0 \leq b^{*} \wedge 0 \leq c^{*} \wedge C_{1} \wedge C_{2} \wedge C_{3} \wedge C_{5} \wedge C_{7} \wedge C_{8} \wedge C_{11} \wedge C_{13} \wedge C_{14}\]
- \[p < q \wedge u < v \wedge 0 \leq b^{*} \wedge 0 \leq c^{*} \wedge C_{1} \wedge C_{2} \wedge C_{3} \wedge C_{4} \wedge C_{6} \wedge C_{9} \wedge C_{11} \wedge C_{13} \wedge C_{14}\]
- \[t=0\wedge0<s\wedge0<b^{*}\wedge0<\phi\wedge C{1}\wedge C{2}\wedge C{10}\]
- \[s=0\wedge 0<t\wedge 0<b^{*}\wedge\phi<0\wedge C{1}\wedge C{3}\wedge C{10}\]
- \[n=0\wedge0<m\wedge0<c^{*}\wedge\phi<0\wedge c{1}\wedge c{2}\wedge c{12}\]
- \[m=0\wedge 0<n\wedge 0<c^{*}\wedge 0<\phi\wedge c{1}\wedge c{3}\wedge c{12}\]
- \[s t = 0 \wedge 0 < b^{*} \wedge 0 < c^{*} \wedge C_{1} \wedge C_{2} \wedge C_{3} \wedge C_{10} \wedge C_{12}\]
- \[m n = 0 \wedge 0 < b^{*} \wedge 0 < c^{*} \wedge C_{1} \wedge C_{2} \wedge C_{3} \wedge C_{10} \wedge C_{12}\]
- \[p < m + n \wedge t = 0 \wedge \phi = 0 \wedge 0 < s \wedge 0 < b^{*} \wedge c^{*} < 0 \wedge \lvert{\operatorname{arg}\left(\omega\right)}\rvert < \pi \left(m + n - p + 1\right) \wedge C_{1} \wedge C_{2} \wedge C_{10} \wedge C_{14} \wedge C_{15}\]
- \[q < m + n \wedge s = 0 \wedge \phi = 0 \wedge 0 < t \wedge 0 < b^{*} \wedge c^{*} < 0 \wedge \lvert{\operatorname{arg}\left(\omega\right)}\rvert < \pi \left(m + n - q + 1\right) \wedge C_{1} \wedge C_{3} \wedge C_{10} \wedge C_{14} \wedge C_{15}\]
- \[p = q -1 \wedge t = 0 \wedge \phi = 0 \wedge 0 < s \wedge 0 < b^{*} \wedge 0 \leq c^{*} \wedge \pi c^{*} < \lvert{\operatorname{arg}\left(\omega\right)}\rvert \wedge C_{1} \wedge C_{2} \wedge C_{10} \wedge C_{14} \wedge C_{15}\]
- \[p = q + 1 \wedge s = 0 \wedge \phi = 0 \wedge 0 < t \wedge 0 < b^{*} \wedge 0 \leq c^{*} \wedge \pi c^{*} < \lvert{\operatorname{arg}\left(\omega\right)}\rvert \wedge C_{1} \wedge C_{3} \wedge C_{10} \wedge C_{14} \wedge C_{15}\]
- \[p < q -1 \wedge t = 0 \wedge \phi = 0 \wedge 0 < s \wedge 0 < b^{*} \wedge 0 \leq c^{*} \wedge \pi c^{*} < \lvert{\operatorname{arg}\left(\omega\right)}\rvert \wedge \lvert{\operatorname{arg}\left(\omega\right)}\rvert < \pi \left(m + n - p + 1\right) \wedge C_{1} \wedge C_{2} \wedge C_{10} \wedge C_{14} \wedge C_{15}\]
- \[q + 1 < p \wedge s = 0 \wedge \phi = 0 \wedge 0 < t \wedge 0 < b^{*} \wedge 0 \leq c^{*} \wedge \pi c^{*} < \lvert{\operatorname{arg}\left(\omega\right)}\rvert \wedge \lvert{\operatorname{arg}\left(\omega\right)}\rvert < \pi \left(m + n - q + 1 \right) \wedge C_{1} \wedge C_{3} \wedge C_{10} \wedge C_{14} \wedge C_{15}\]
- \[n = 0 \wedge \phi = 0 \wedge 0 < s + t \wedge 0 < m \wedge 0 < c^{*} \wedge b^{*} < 0 \wedge \lvert{\operatorname{arg}\left(\sigma\right)}\rvert < \pi \left(s + t - u + 1\right) \wedge C_{1} \wedge C_{2} \wedge C_{12} \wedge C_{14} \wedge C_{15}\]
- \[m = 0 \wedge \phi = 0 \wedge v < s + t \wedge 0 < n \wedge 0 < c^{*} \wedge b^{*} < 0 \wedge \lvert{\operatorname{arg}\left(\sigma\right)}\rvert < \pi \left(s + t - v + 1\right) \wedge C_{1} \wedge C_{3} \wedge C_{12} \wedge C_{14} \wedge C_{15}\]
- \[n = 0 \wedge \phi = 0 \wedge u = v -1 \wedge 0 < m \wedge 0 < c^{*} \wedge 0 \leq b^{*} \wedge \pi b^{*} < \lvert{\operatorname{arg}\left(\sigma\right)}\rvert \wedge \lvert{\operatorname{arg}\left(\sigma\right)}\rvert < \pi \left(b^{*} + 1\right) \wedge C_{1} \wedge C_{2} \wedge C_{12} \wedge C_{14} \wedge C_{15}\]
- \[m = 0 \wedge \phi = 0 \wedge u = v + 1 \wedge 0 < n \wedge 0 < c^{*} \wedge 0 \leq b^{*} \wedge \pi b^{*} < \lvert{\operatorname{arg}\left(\sigma\right)}\rvert \wedge \lvert{\operatorname{arg}\left(\sigma\right)}\rvert < \pi \left(b^{*} + 1\right) \wedge C_{1} \wedge C_{3} \wedge C_{12} \wedge C_{14} \wedge C_{15}\]
- \[n = 0 \wedge \phi = 0 \wedge u < v -1 \wedge 0 < m \wedge 0 < c^{*} \wedge 0 \leq b^{*} \wedge \pi b^{*} < \lvert{\operatorname{arg}\left(\sigma\right)}\rvert \wedge \lvert{\operatorname{arg}\left(\sigma\right)}\rvert < \pi \left(s + t - u + 1\right) \wedge C_{1} \wedge C_{2} \wedge C_{12} \wedge C_{14} \wedge C_{15}\]
- \[m = 0 \wedge \phi = 0 \wedge v + 1 < u \wedge 0 < n \wedge 0 < c^{*} \wedge 0 \leq b^{*} \wedge \pi b^{*} < \lvert{\operatorname{arg}\left(\sigma\right)}\rvert \wedge \lvert{\operatorname{arg}\left(\sigma\right)}\rvert < \pi \left(s + t - v + 1 \right) \wedge C_{1} \wedge C_{3} \wedge C_{12} \wedge C_{14} \wedge C_{15}\]
- \[C{17}\wedget=0\wedge u<s\wedge 0<b^{*}\wedge C{10}\wedge C{1}\wedge C{2}\wedge C{3}\]
- \[C{17}\wedge s=0\wedge v<t\wedge 0<b^{*}\wedge C{10}\wedge C{1}\wedge C{2}\wedge C{3}\]
- \[C{16}\wedge n=0\wedge p<m\wedge 0<C^{*}\wedge C{12}\wedge C{1}\wedge C{2}\wedge C}{3}\]
- \[C{16}\wedgem=0\wedge q<n\wedge 0<C^{*}\wedge C{12}\wedge C{1}\wedge C{2}\wedge C}{3}\]
G函数的Laplace逆变换#
Meijer G函数的拉普拉斯逆变换可以表示为另一个G函数。这是计算这种变换的一种相当通用的方法。然而,我在文献中找不到细节,所以我在这里计算。在 [Luke1969], 第5.6.3节,有一个G-变元函数的拉普拉斯逆变换公式 \(bz\) 并给出了收敛条件。然而,我们需要一个公式来论证 \(bz^a\) 理性的 \(a\) .
我们被要求计算
为正实数 \(t\) . 出现了三个问题:
这个积分何时收敛?
我们如何计算积分?
我们的计算什么时候有效?
如何计算积分#
我们暂时正式工作。用表示 \(\Delta(s)\) 在定义中出现的伽马函数的乘积 \(G\) ,这样
因此
我们交换积分的顺序
内积分很容易看出 \(\frac{{1}}{{\Gamma(-as)}} \frac{{1}}{{t^{{1+as}}}}\) . (使用柯西定理和乔丹引理使轮廓变形 \(-\infty\) 到 \(-\infty\) ,包围 \(0\) 一次是消极的。为 \(as\) 实数大于一,这个轮廓可以推到负实轴上,积分被认为是正弦函数和伽马函数的乘积。然后利用gamma函数的函数方程证明了该公式,并借助解析延拓将其推广到原积分的整个收敛域
这是一个所谓的Fox H函数 \(\frac{{b}}{{t^a}}\) ). 理性的 \(a\) ,这可以用gamma函数乘法定理表示为Meijer G函数。
当计算有效时#
在这项计算中有许多障碍。积分交换只有在所有积分都绝对收敛的情况下才有效。特别是内积分必须收敛。另外,为了使最终积分的Fox H/Meijer G-函数的辨识是正确的,新得到的gamma函数的极点必须正确分离。
很容易检查内积分是否绝对收敛 \(\Re(as) < -1\) . 因此轮廓 \(L\) 必须从队伍的左边跑 \(\Re(as) = -1\) . 在这种情况下,新引入的gamma函数的极点得到了适当的分离。
It remains to observe that the Meijer G-function is an analytic, unbranched function of its parameters, and of the coefficient \(b\). Hence so is \(f(t)\). Thus the final computation remains valid as long as the initial integral converges, and if there exists a changed set of parameters where the computation is valid. If we assume w.l.o.g. that \(a > 0\), then the latter condition is fulfilled if \(G\) converges along contours (2) or (3) of [Luke1969], section 5.2, i.e. either \(\delta \ge \frac{a}{2}\) or \(p \ge 1, p \ge q\).
当积分存在时#
使用 [Luke1969], 第5.10节,对于任何给定的meijer G-函数,我们可以找到形式的一个主项 \(z^a e^{{bz^c}}\) (尽管这个表达式可能不是最好的,因为取消了)。
我们必须这样调查
(这个主值积分是拉普拉斯反演定理中使用的精确陈述) \(z = c + i \tau\) . 然后 \(arg(z) \to \pm \frac{{\pi}}{{2}}\) ,等等 \(e^{{zt}} \sim e^{{it \tau}}\) (何处) \(\sim\) 应始终表示“渐近等价于正实相乘常数”)。阿尔索 \(z^{{x + iy}} \sim |\tau|^x e^{{i y \log{{|\tau|}}}} e^{{\pm x i \frac{{\pi}}{{2}}}}.\)
集合 \(\omega_{{\pm}} = b e^{{\pm i \Re(c) \frac{{\pi}}{{2}}}}\) . 我们有三个案子:
\(b=0\) 或 \(\Re(c) \le 0\) . 在这种情况下,如果 \(\Re(a) \le -1\) .
\(b \ne 0\) , \(\Im(c) = 0\) , \(\Re(c) > 0\) . 在这种情况下,如果 \(\Re(\omega_{{\pm}}) < 0\) .
\(b \ne 0\) , \(\Im(c) = 0\) , \(\Re(c) > 0\) , \(\Re(\omega_{{\pm}}) \le 0\) ,以及至少一个 \(\Re(\omega_{{\pm}}) = 0\) . 这里与(1)中的条件相同。
实现的G函数公式#
算法的一个重要部分是一个表,将各种函数表示为Meijer G函数。这本质上是一张梅林变换的伪装表。以下自动生成的表格显示了当前在SymPy中实现的公式。条目“generated”意味着对应的G函数具有可变数量的参数。当算法推导新公式的能力提高时,此表将在将来缩小。当然,每当要处理一类新的特殊函数时,它就必须增长。
基本功能:
涉及的函数 \(\theta\left(z^{{q}} p - b\right)\) :
涉及的函数 \(\left|{{z^{{q}} p - b}}\right|\) :
涉及的函数 \(e^{{z^{{q}} p e^{{i \pi}}}}\) :
涉及的函数 \(\sinh{{\left(z^{{q}} p \right)}}\) :
涉及的函数 \(\cosh{{\left(z^{{q}} p \right)}}\) :
涉及的函数 \(\sin{{\left(z^{{q}} p \right)}}\) :
涉及的函数 \(\cos{{\left(z^{{q}} p \right)}}\) :
涉及的函数 \(\operatorname{{sinc}}{{\left(z^{{q}} p \right)}}\) :
Functions involving \(\log{\left(z^{q} p \right)}\), \(\theta\left(- z^{q} p + 1\right)\):
涉及的函数 \(\log{{\left(z^{{q}} p \right)}}\) :
涉及的函数 \(\operatorname{{Ei}}{{\left(z^{{q}} p \right)}}\) :
涉及的函数 \(\operatorname{{Si}}{{\left(z^{{q}} p \right)}}\) :
涉及的函数 \(\operatorname{{Ci}}{{\left(z^{{q}} p \right)}}\) :
涉及的函数 \(\operatorname{{Shi}}{{\left(z^{{q}} p \right)}}\) :
涉及的函数 \(\operatorname{{Chi}}\left(z^{{q}} p\right)\) :
涉及的函数 \(\operatorname{{E}}_{{a}}\left(z^{{q}} p\right)\) :
涉及的函数 \(\operatorname{{erf}}{{\left(z^{{q}} p \right)}}\) :
涉及的函数 \(\operatorname{{erfc}}{{\left(z^{{q}} p \right)}}\) :
涉及的函数 \(\operatorname{{erfi}}{{\left(z^{{q}} p \right)}}\) :
涉及的函数 \(S\left(z^{{q}} p\right)\) :
涉及的函数 \(C\left(z^{{q}} p\right)\) :
涉及的函数 \(J_{{a}}\left(z^{{q}} p\right)\) :
涉及的函数 \(Y_{{a}}\left(z^{{q}} p\right)\) :
涉及的函数 \(I_{{a}}\left(z^{{q}} p\right)\) :
涉及的函数 \(K_{{a}}\left(z^{{q}} p\right)\) :
涉及的函数 \(K\left(z^{{q}} p\right)\) :
涉及的函数 \(E\left(z^{{q}} p\right)\) :
内部API引用#
通过将函数重写为Meijer G函数来集成函数。
sympy库的其他部分可以使用三个用户可见的函数来解决各种集成问题:
meijerint_indefinite
meijerint_definite
meijerint_inversion
它们可分别用于计算不定积分、实线区间上的定积分和拉普拉斯型逆积分(来自c-I oo到c+I 哦)。有关详细信息,请参见相应的docstring。
主要参考文献如下:
- [L] Luke,Y.L.(1969),《特殊函数及其逼近》,
第1卷
- [R] 凯利·B·罗奇。Meijer G函数表示。
1997年国际符号与代数计算研讨会论文集,205-211页,纽约,1997年。ACM公司。
- [P] A、 P.Prudnikov,余。A、 Brychkov和O.I.Marichev(1990年)。
积分与级数:更特殊的函数,第三卷,。戈登和突破科学出版社
- sympy.integrals.meijerint._check_antecedents_1(g, x, helper=False)[源代码]#
返回g的mellin变换存在的条件。任何x的幂都已经被G函数吸收了,所以这只是\(\int_0^\infty G\,dx\)。
见 [五十、 第5.6.1条] . (注意s=1。)
如果
helper
为True,仅检查MT是否存在于无穷远处,即如果\(\int_1^\infty g\,dx\)存在。
- sympy.integrals.meijerint._condsimp(cond, first=True)[源代码]#
对
cond
.解释
注意,这个例程完全是临时的,简化规则是根据需要添加的,而不是遵循任何逻辑模式。
实例
>>> from sympy.integrals.meijerint import _condsimp as simp >>> from sympy import Or, Eq >>> from sympy.abc import x, y >>> simp(Or(x < y, Eq(x, y))) x <= y
- sympy.integrals.meijerint._dummy(name, token, expr, **kwargs)[源代码]#
返回一个假人。如果同一个token+name被多次请求,并且它还不在expr中,那么它将返回同一个伪对象。这是为了便于缓存。
- sympy.integrals.meijerint._exponents(expr, x)[源代码]#
求的指数
x
(不包括零)在expr
.实例
>>> from sympy.integrals.meijerint import _exponents >>> from sympy.abc import x, y >>> from sympy import sin >>> _exponents(x, x) {1} >>> _exponents(x**2, x) {2} >>> _exponents(x**2 + x, x) {1, 2} >>> _exponents(x**3*sin(x + x**y) + 1/x, x) {-1, 1, 3, y}
- sympy.integrals.meijerint._find_splitting_points(expr, x)[源代码]#
求一个数a,这样线性代换x->x+a可以(希望)简化表达式。
实例
>>> from sympy.integrals.meijerint import _find_splitting_points as fsp >>> from sympy import sin >>> from sympy.abc import x >>> fsp(x, x) {0} >>> fsp((x-1)**3, x) {1} >>> fsp(sin(x+3)*x, x) {-3, 0}
- sympy.integrals.meijerint._get_coeff_exp(expr, x)[源代码]#
当已知expr是c形式时 x *b、 如果c和/或b可能是1,则返回c,b。
实例
>>> from sympy.abc import x, a, b >>> from sympy.integrals.meijerint import _get_coeff_exp >>> _get_coeff_exp(a*x**b, x) (a, b) >>> _get_coeff_exp(x, x) (1, 1) >>> _get_coeff_exp(2*x, x) (2, 1) >>> _get_coeff_exp(x**3, x) (1, 3)
- sympy.integrals.meijerint._inflate_fox_h(g, a)[源代码]#
设d表示G函数定义中的被积函数
g
. 考虑用相同的方式定义的函数H,但使用积分d/Gamma(a*s)(轮廓惯例与往常一样)。If
a
is rational, the function H can be written as C*G, for a constant C and a G-function G.此函数返回C,G。
- sympy.integrals.meijerint._int0oo(g1, g2, x)[源代码]#
在满足必要条件的前提下,用G函数表示从零到无穷大的积分g1*g2。
实例
>>> from sympy.integrals.meijerint import _int0oo >>> from sympy.abc import s, t, m >>> from sympy import meijerg, S >>> g1 = meijerg([], [], [-S(1)/2, 0], [], s**2*t/4) >>> g2 = meijerg([], [], [m/2], [-m/2], t/4) >>> _int0oo(g1, g2, t) 4*meijerg(((0, 1/2), ()), ((m/2,), (-m/2,)), s**(-2))/s**2
- sympy.integrals.meijerint._int0oo_1(g, x)[源代码]#
假设满足必要条件,使用g函数计算\(\int_0^\infty g\,dx\)。
实例
>>> from sympy.abc import a, b, c, d, x, y >>> from sympy import meijerg >>> from sympy.integrals.meijerint import _int0oo_1 >>> _int0oo_1(meijerg([a], [b], [c], [d], x*y), x) gamma(-a)*gamma(c + 1)/(y*gamma(-d)*gamma(b + 1))
- sympy.integrals.meijerint._meijerint_definite_2(f, x)[源代码]#
试着把f dx从零积分到无穷大。
此函数的主体计算各种“简化”f1、f2、。。。f的(例如,通过调用expand_mul()、trigexpand()-请参阅“猜测”展开)并连续调用“meijerint”definal_3。如果_meijerint_define_3成功处理任何简化函数,则返回此结果。
- sympy.integrals.meijerint._meijerint_definite_3(f, x)[源代码]#
试着把f dx从零积分到无穷大。
此函数调用_meijerint_definite_4来尝试计算积分。如果失败,它会尝试使用线性。
- sympy.integrals.meijerint._meijerint_definite_4(f, x, only_double=False)[源代码]#
试着把f dx从零积分到无穷大。
解释
该函数试图应用文献中的积分定理,即试图将f改写为两个G函数的一个或一个乘积。
参数
only_double
在递归算法中内部使用,以禁用将f重写为单个G函数的尝试。
- sympy.integrals.meijerint._mul_args(f)[源代码]#
返回列表
L
这样的话Mul(*L) == f
.如果
f
不是一个Mul
或Pow
,L=[f]
.如果f=g**n
对于整数n
,L=[g]*n
.如果f
是一个Mul
,L
来自申请_mul_args
所有因素f
.
- sympy.integrals.meijerint._mul_as_two_parts(f)[源代码]#
Find all the ways to split
f
into a product of two terms. Return None on failure.解释
尽管从multiset_分区得到的顺序是规范的,但这不一定是处理这些术语的最佳顺序。例如,如果删除len(gs)==2的情况,并且允许multiset对术语进行排序,则某些测试将失败。
实例
>>> from sympy.integrals.meijerint import _mul_as_two_parts >>> from sympy import sin, exp, ordered >>> from sympy.abc import x >>> list(ordered(_mul_as_two_parts(x*sin(x)*exp(x)))) [(x, exp(x)*sin(x)), (x*exp(x), sin(x)), (x*sin(x), exp(x))]
- sympy.integrals.meijerint._my_principal_branch(expr, period, full_pb=False)[源代码]#
消除多余的因素,使expr更接近其主要分支。这个函数可以 not 保证产生主分支,以避免引入不透明的principal_branch()对象,除非full_pb=True。
- sympy.integrals.meijerint._mytype(f: Basic, x: Symbol) tuple[type[Basic], ...] [源代码]#
创建一个描述f类型的散列实体。
- sympy.integrals.meijerint._rewrite1(f, x, recursive=True)[源代码]#
Try to rewrite
f
using a (sum of) single G functions with argument a*x**b. Return fac, po, g such that f = fac*po*g, fac is independent ofx
. and po = x**s. Here g is a result from _rewrite_single. Return None on failure.
- sympy.integrals.meijerint._rewrite2(f, x)[源代码]#
Try to rewrite
f
as a product of two G functions of arguments a*x**b. Return fac, po, g1, g2 such that f = fac*po*g1*g2, where fac is independent of x and po is x**s. Here g1 and g2 are results of _rewrite_single. Returns None on failure.
- sympy.integrals.meijerint._rewrite_saxena(fac, po, g1, g2, x, full_pb=False)[源代码]#
Rewrite the integral
fac*po*g1*g2
from 0 to oo in terms of G functions with argumentc*x
.解释
Return C, f1, f2 such that integral C f1 f2 from 0 to infinity equals integral fac
po
,g1
,g2
from 0 to infinity.实例
>>> from sympy.integrals.meijerint import _rewrite_saxena >>> from sympy.abc import s, t, m >>> from sympy import meijerg >>> g1 = meijerg([], [], [0], [], s*t) >>> g2 = meijerg([], [], [m/2], [-m/2], t**2/4) >>> r = _rewrite_saxena(1, t**0, g1, g2, t) >>> r[0] s/(4*sqrt(pi)) >>> r[1] meijerg(((), ()), ((-1/2, 0), ()), s**2*t/4) >>> r[2] meijerg(((), ()), ((m/2,), (-m/2,)), t/4)
- sympy.integrals.meijerint._rewrite_saxena_1(fac, po, g, x)[源代码]#
重写积分fac po g dx,从零到无穷大,作为积分fac G、 其中G有自变量a x、 注:po=x*s。返回fac,G。
- sympy.integrals.meijerint._rewrite_single(f, x, recursive=True)[源代码]#
试着把f重写成C形式的单个G函数的和 x s G(a) x b), where b is a rational number and C is independent of x. We guarantee that result.argument.as_coeff_mul(x) returns (a, (x *b、 )或(a,())。返回元组(C,s,G)和条件cond的列表。失败时返回None。
- sympy.integrals.meijerint._split_mul(f, x)[源代码]#
拆分表达式
f
转化为fac,po,g,其中fac是一个常数因子,对于一些独立于s的s,po=x**s,g是“其余的”。实例
>>> from sympy.integrals.meijerint import _split_mul >>> from sympy import sin >>> from sympy.abc import s, x >>> _split_mul((3*x)**s*sin(x**2)*x, x) (3**s, x*x**s, sin(x**2))
- sympy.integrals.meijerint.meijerint_definite(f, x, a, b)[源代码]#
整合
f
间隔时间 [a
,b
] ,将其重写为两个G函数的乘积,或作为单个G函数重写。Return res,cond,其中cond是收敛条件。
实例
>>> from sympy.integrals.meijerint import meijerint_definite >>> from sympy import exp, oo >>> from sympy.abc import x >>> meijerint_definite(exp(-x**2), x, -oo, oo) (sqrt(pi), True)
此函数被实现为一系列函数meijerint_defined,_meijerint_defined_2,_meijerint_defined_3,_meijerint_defined_4。列表中的每个函数调用下一个函数(大概)数次。这意味着打电话给meijerint_definal可能会非常昂贵。
- sympy.integrals.meijerint.meijerint_indefinite(f, x)[源代码]#
计算不定积分
f
把它改写成G函数。实例
>>> from sympy.integrals.meijerint import meijerint_indefinite >>> from sympy import sin >>> from sympy.abc import x >>> meijerint_indefinite(sin(x), x) -cos(x)
- sympy.integrals.meijerint.meijerint_inversion(f, x, t)[源代码]#
Compute the inverse laplace transform \(\int_{c+i\infty}^{c-i\infty} f(x) e^{tx}\, dx\), for real c larger than the real part of all singularities of
f
.注意
t
总是假设是真实的和积极的。如果积分不存在或无法计算,则返回None。
实例
>>> from sympy.abc import x, t >>> from sympy.integrals.meijerint import meijerint_inversion >>> meijerint_inversion(1/x, x, t) Heaviside(t)