使用Cauchy(CIF)进行数值微分

时间:2017-07-04 19:33:04

标签: python-3.x numpy math differentiation

我正在尝试为泰勒系列创建一个带有数学类的模块,以便其他项目可以轻松访问。因此,我希望尽可能优化它。

对于那些对泰勒系列不太熟悉的人来说,能够多次区分某一点的功能是必要的。鉴于函数的数学导数的正常定义将需要高阶导数的巨大精度,我决定使用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,但没有运气。我也想获得更高的订单,但我担心我遇到了某种机器精确度。

我的问题是最简单的形式:我可以做些什么来改善这个功能,以便获得更高阶的衍生物?

2 个答案:

答案 0 :(得分:1)

我似乎想出了解决问题的方法。我通过以不同的方式重新排列柯西的积分公式来做到这一点,通过利用初始轮廓积分可以是在微分点周围的任意大的圆。请注意,在复杂平面中对函数进行分析非常重要,以使其有效。

New formula

这也为区分提供了新的功能:

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也可能有一些计算泰勒系列的功能。