8.数値微分・積分・微分方程式 工学的問題においては 解析的に微分値や積分値を求めたり, 微分方程式を解くことが難しいケースも多い。 このような場合は数値的に解かざるを得ない。
8.1 数値微分 (1)差分法を用いる 関数 の における微分係数 の定義 : 刻み幅 差分近似 [前進差分近似] [中心差分近似] 8.1 数値微分 (1)差分法を用いる 関数 の における微分係数 の定義 : 刻み幅 差分近似 [前進差分近似] [中心差分近似] [後退差分近似]
(2)差分法の誤差 ①刻み幅が大きいと, 誤差が大きい(打切り誤差)。 ②刻み誤差が小さ過ぎると, 丸め誤差による誤差が大きくなる。
①前進差分法の打切り誤差 前進差分では,以下のテーラ展開から導く を代入して,整理すると。 に比例した打切り誤差
②後退差分法の打切り誤差 後退差分では,以下のテーラ展開から導く を代入して,整理すると。 に比例した打切り誤差
③中心差分法の打切り誤差 後退差分では,以下の2つのテーラ展開から導く を代入して,整理すると。 に比例した打切り誤差
誤差の比較(1) 前進差分,後退差分,中心差分をExcelで式定期
前進差分や後退差分に比べ,中心差分の誤差が少ない!! 誤差の比較(2)
微分値は,ほとんど中心差分と重なっているが… 誤差の比較(3) 細かくみると 誤差はある…
刻み幅が小さくなると誤差が減るが 刻み幅による誤差の比較 小さすぎると丸め誤差が大きくなる 誤差 刻み幅 h
[参考] 刻み幅による誤差データの生成プログラム(1) Function FX(X) As Single X2 = X * X: X3 = X2 * X: X4 = X3 * X FX = X4 + X3 + X2 + X + 1 End Function Function DFX(X) As Double X2 = X * X: X3 = X2 * X DFX = 4 * X3 + 3 * X2 + 2 * X + 1 誤差の影響を大きくするために,あえて関数値はSingle, 微分値はDoubleにしてある。 次のページの変数値も同様である。
[参考] 刻み幅による誤差データの生成プログラム(2) Sub ボタン1_Click() Dim DF1 As Single: Dim DF2 As Single With Worksheets("Sheet2") h = 0.1 For i = 1 To 100 DF = DFX(1) ‘ 真値 DF1 = (FX(1 + h) - FX(1)) / h ‘ 前進差分 DF2 = (FX(1 + h) - FX(1 - h)) / (2 * h) ‘ 中心差分 G1 = Abs(DF1 - DF) ‘ 誤差の計算 G2 = Abs(DF2 - DF) .Cells(i + 1, 1) = h .Cells(i + 1, 2) = G1 .Cells(i + 1, 3) = G2 h = h / 1.2 Next End With End Sub
VBAによる表現 ①Excelシートの定義 EFG列は,2行目以降は空白にして, 差分の結果を入れるセルとする。
VBAによる表現 ②データ宣言とデータ設定 VBAによる表現 ②データ宣言とデータ設定 Private DX As Double Private Y() As Double Private DY() As Double Private N As Double Sub データ設定() With Worksheets("Sheet4") i = 2 ‘ 入っているデータをカウントする。 Do While .Cells(i, 2) <> "": i = i + 1: Loop N = i - 2 ReDim Y(N), DY(N) DX = .Cells(2, 1) For i = 1 To N Y(i) = .Cells(i + 1, 3) Next End With End Sub
VBAによる表現 ③結果設定とボタンのClickイベントハンドラ Sub 結果設定(DY, Ist, N, ID) With Worksheets("Sheet4") For i = Ist To N .Cells(i + 1, ID) = DY(i) Next End With End Sub Sub Sheet4_ボタン1_Click() データ設定 前進差分 DX, Y, DY, N 結果設定 DY, 1, N - 1, 5 後退差分 DX, Y, DY, N 結果設定 DY, 2, N, 6 中心差分 DX, Y, DY, N 結果設定 DY, 2, N - 1, 7 Sub 前進差分(DX, Y, DY, N) For i = 1 To N - 1 DY(i) = (Y(i + 1) - Y(i)) / DX Sub 後退差分(DX, Y, DY, N) For i = 2 To N DY(i) = (Y(i) - Y(i - 1)) / DX Sub 中心差分(DX, Y, DY, N) For i = 2 To N - 1 DY(i) = (Y(i + 1) - Y(i - 1)) / (2 * DX)
VBAによる表現 ④各差分の定義 Sub 前進差分(DX, Y, DY, N) For i = 1 To N - 1 VBAによる表現 ④各差分の定義 Sub 前進差分(DX, Y, DY, N) For i = 1 To N - 1 DY(i) = (Y(i + 1) - Y(i)) / DX Next End Sub Sub 後退差分(DX, Y, DY, N) For i = 2 To N DY(i) = (Y(i) - Y(i - 1)) / DX Sub 中心差分(DX, Y, DY, N) For i = 2 To N - 1 DY(i) = (Y(i + 1) - Y(i - 1)) / (2 * DX)
(3)高次の差分法 をテーラ展開し
(3)高次の差分法 を1次の式に代入し したがって, 2次の前進差分
(3)高次の差分法 同様に,2次の後退差分,中心差分も求めることができる。 2次の後退差分 2次の中心差分
前進差分における1次と2次の誤差 同様に,2次の後退差分,中心差分でも確認してみよう。