跳至内容

数值方法导论/数值微分

来自维基教科书,开放的书籍,为开放的世界

数值微分

[编辑 | 编辑源代码]

目标

  • 解释数值微分的前向、后向和中心差分法的定义
  • 找到连续函数的一阶导数的近似值
  • 推断数字的精度
  • 找到离散函数的一阶导数的近似值(在离散数据点给出)

资源

前向差分法

[编辑 | 编辑源代码]

以下代码实现了此方法

from math import exp

def forward_diff(f, x, h=0.0001):
  df = (f(x+h) - f(x))/h
  return df

x = 0.5
df = forward_diff(exp, x)
print 'first derivative = ', df
print 'exp(', x, ') = ', exp(x)

后向差分法

[编辑 | 编辑源代码]

以下代码实现了此方法

from math import exp

def backward_diff(f, x, h=0.0001):
  df = (f(x) - f(x-h))/h
  return df

x = 0.5
df = backward_diff(exp, x)
print 'first derivative = ', df
print 'exp(', x, ') = ', exp(x)

中心差分法

[编辑 | 编辑源代码]

以下代码实现了此方法

from math import exp

def center_diff(f, x, h=0.0002):
  df = (f(x+h) - f(x-h))/(2.0*h)
  return df

x = 0.5
df = center_diff(exp, x)
print 'first derivative = ', df
print 'exp(', x, ') = ', exp(x)

二阶导数

[编辑 | 编辑源代码]

泰勒级数

[编辑 | 编辑源代码]

泰勒级数 允许我们将函数展开成无限级数。如果函数在数字 h 处无限可微,我们可以使用泰勒级数来近似该函数。我们可以使用泰勒级数推导出后向、前向和中心差分法,这也给出了近似误差的定量估计。

例如, 函数可以用截断的泰勒级数来近似

The sine function (blue) is closely approximated by its Taylor polynomial of degree 7 (pink) for a full period centered at the origin.

步长影响

[编辑 | 编辑源代码]

以下是使用不同h值,通过中心差分公式计算x=0.5时的一阶导数的程序。结果表明,随着步长的减小,近似值变得更加准确(有效数字更多),但当步长过小时,舍入误差变得显著。

from math import exp

def center_diff(f, x, h=0.0001):
  df = (f(x+h) - f(x-h))/(2.0*h)
  return df

x = 0.5
df = center_diff(exp, x)
print 'first derivative = ', df
print 'exp(', x, ') = ', exp(x)

h=0.125
for i in range(50):
  df = center_diff(exp, x, h)
  print "h=", h, "df=", df
  h = h/2.0
华夏公益教科书