python 中的衍生品

Derivatives in python

我正在尝试求出有限级数 $f(x) = \sum_n a_nx^n$ 的系数。要获得第 $m$ 个系数,我们可以将第 $m$ 个 derivative 计算为零。因此,第$m$个系数为

$$
a_n = \frac{1}{2\pi i } \oint_C \frac{f(z)}{z^{n+1}} dz
$$

我相信这个 使用上述轮廓积分对函数求导。

import math
import numpy

import matplotlib.pyplot as plt

def F(x):
    mean=10
    return math.exp(mean*(x.real-1))

def p(n):
    mean=10
    return (math.pow(mean, n) * math.exp(-mean)) / math.factorial(n)

def integration(func, a, n, r, n_steps):
    z = r * numpy.exp(2j * numpy.pi * numpy.arange(0, 1, 1. / n_steps))
    return math.factorial(n) * numpy.mean(func(a + z) / z**n)

ns = list(range(20))
f2 = numpy.vectorize(F)

plt.plot(ns,[p(n) for n in ns], label='Actual')
plt.plot(ns,[integration(f2, a=0., n=n, r=1., n_steps=100).real/math.factorial(n) for n in ns], label='Numerical derivative')

plt.legend()

但是,很明显,数值导数完全偏离了级数系数的实际值。我做错了什么?

Mathematics Stack Exchange answer 中用于推导 F 的幂级数展开系数的公式基于复数分析 - 例如来自柯西剩余定理(尽管其他推导是可能的)。使这些公式起作用所必需的假设之一是您具有全纯(即复数可微分)函数。

您对 F 的定义给出了一个非全纯函数。 (一方面,它总是为任何复数输入给出实数结果,这对于非常量全纯函数来说是不可能的。)但它很容易固定为全纯,同时继续 return 相同的结果实际输入。

这是 F 的固定版本,它将 x.real 替换为 x。由于 exp 的输入现在很复杂,因此还需要使用 cmath.exp 而不是 math.exp 来避免 TypeError:

import cmath

def F(x):
    mean=10
    return cmath.exp(mean*(x-1))

修复 F 之后,如果我 运行 你的代码,我会得到相当准确的结果。这是我得到的图表。 (我不得不打印出这些值以仔细检查该图表是否确实显示了两条线在另一条线之上。)