跳至內容

數值方法導論/數值微分

來自華夏公益教科書,開放的書籍,為開放的世界

數值微分

[編輯 | 編輯原始碼]

目標

  • 解釋數值微分的前向、後向和中心差分法的定義
  • 找到連續函式的一階導數的近似值
  • 推斷數字的精度
  • 找到離散函式的一階導數的近似值(在離散資料點給出)

資源

前向差分法

[編輯 | 編輯原始碼]

以下程式碼實現了此方法

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
華夏公益教科書