我正在尝试为泰勒系列创建一个带有数学类的模块,以便其他项目可以轻松访问。因此,我希望尽可能优化它。
对于那些对泰勒系列不太熟悉的人来说,能够多次区分某一点的功能是必要的。鉴于函数的数学导数的正常定义将需要高阶导数的巨大精度,我决定使用Cauchy's integral formula代替。通过一些工作,我已经设法重新安排了一点公式,正如你在这张图片上看到的那样:Rearranged formula。这为高阶导数提供了比传统导数定义更准确的结果。以下是我目前用于区分某个功能的功能:
def myDerivative(f, x, dTheta, degree):
riemannSum = 0
theta = 0
while theta < 2*np.pi:
functionArgument = np.complex128(x + np.exp(1j*theta))
secondFactor = np.complex128(np.exp(-1j * degree * theta))
riemannSum += f(functionArgument) * secondFactor * dTheta
theta += dTheta
return factorial(degree)/(2*np.pi) * riemannSum.real
我已经在我的主函数中测试了这个函数,我仔细考虑了数学函数,我知道它的衍生物,即f(x)= sin(x)。
def main():
print(myDerivative(f, 0, 2*np.pi/(4*4096), 16))
pass
这些衍生物似乎在16度的衍生物周围吓坏了。我也试图玩dTheta,但没有运气。我也想获得更高的订单,但我担心我遇到了某种机器精确度。
我的问题是最简单的形式:我可以做些什么来改善这个功能,以便获得更高阶的衍生物?
答案 0 :(得分:1)
我似乎想出了解决问题的方法。我通过以不同的方式重新排列柯西的积分公式来做到这一点,通过利用初始轮廓积分可以是在微分点周围的任意大的圆。请注意,在复杂平面中对函数进行分析非常重要,以使其有效。
这也为区分提供了新的功能:
def myDerivative(f, x, dTheta, degree, contourRadius):
riemannSum = 0
theta = 0
while theta < 2*np.pi:
functionArgument = np.complex128(x + contourRadius*np.exp(1j*theta))
secondFactor = (1/contourRadius)**degree*np.complex128(np.exp(-1j * degree * theta))
riemannSum += f(functionArgument) * secondFactor * dTheta
theta += dTheta
return factorial(degree) * riemannSum.real / (2*np.pi)
这使我能够非常准确地区分高阶。例如,我能够毫无问题地区分f(x)= e ^ x 50次。
答案 1 :(得分:0)
好吧,既然你正在使用衍生物的离散近似(通过dTheta),迟早你必须遇到麻烦。我很惊讶你能得到至少15个准确的衍生品 - 干得好!但是要获得所有订单的衍生品,要么你必须限制你愿意接受的东西并说它足够好,要么象征性地计算衍生品。为此,请查看Sympy。 Sympy也可能有一些计算泰勒系列的功能。