- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:二階微分の数値計算法について)
二階微分の数値計算法について
このQ&Aのポイント
- 二階微分を数値計算する際に問題が生じることがあります。
- 一階微分と同様の計算方法を用いると計算結果が爆発的に大きくなることがあります。
- 無限小の次数の影響が計算結果に大きく関与している可能性があります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>f'(t)=(f(t+dt)-f(t))/dt >f'(t+dt)=(f((t+dt)+dt)-f(t+dt))/dt >なので、結局 >f''(t)=(f(t+2*dt)-f(t))/(dt*dt) はおかしいです。 f''(t)= (f'(t+dt) - f'(t)) / (dt) = (f(t+2*dt) + f(t) - 2*f(t+dt))/(dt*dt) が正しい。
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
回答No.2
きちんと紙の上で計算すれば #1 の通り. 実際には中心差分 f''(t) = [f(t+dt) - 2f(t) + f(t-dt)]/dt^2 で計算する方がちょっとだけうれしい.
質問者
お礼
回答ありがとうございました。 大変恥ずかしいミスをしていました。後に、「補足入力」にて、 ExcelVBAのサンプルプログラム(中心差分版)を作成し、 後の人のためになるかならないかということで、公開します。
質問者
補足
下に、中心差分、後退差分も含んだソースコードを書きました。 遅くなりもうしわけありません。 後の人のために、参考にしたものを、以下に補足的に記載します。 ■参考にしたWeb上の記事 http://ja.wikipedia.org/wiki/%E5%B7%AE%E5%88%86%E6%B3%95 http://d.hatena.ne.jp/nowokay/20080516/1210944893 http://d.hatena.ne.jp/nowokay/20080516/1210944893 http://okwave.jp/qa/q5935311.html http://okwave.jp/qa/q4942769.html http://workingout.jugem.jp/?cid=4
お礼
回答ありがとうございました。 おっしゃる通りです。大変恥ずかしいミスをしていました。 このまま、このスレを閉じてしまうと、単なるスレ汚しになってしまうので、 後で「補足」のところで、サンプルプログラム(VBA)と、簡単な考察を書きます。 のちに二階微分を計算しなきゃいけなくなった人のため…。
補足
中心差分、前進差分、後退差分を含むExcelVBAのプログラムを作成しました。遅くなりもうしわけありません。 【Excelのワークシート上の設定】 ExcelのCellには、 B4セルにtの値が、 C4には関数が、例えば=sin(B4)のように入力されているものとします。 D4セルには、dtの値が、例えば0.00001のように入力されているものとする。 【表示結果】 下記マクロを実行すると、 E4セルに中心差分による一階微分の値が表示されます。 F4セルに中心差分による二階微分の値が表示されます。 G4セルに前進差分による一階微分の値が表示されます。 H4セルに前進差分による一階微分の値が表示されます。 I4セルに前進差分による一階微分の値が表示されます。 J4セルに前進差分による一階微分の値が表示されます。 【ソースコード】 Sub 二階微分() t = Cells(4, 2) dt = Cells(4, 4) ft = Cells(4, 3) '============一階微分============ Cells(4, 2) = t + dt Lft = Cells(4, 3) Cells(4, 2) = t - dt Bft = Cells(4, 3) dCft = (Lft - Bft) / (2 * dt) dLft = (Lft - ft) / dt dBft = (Lft - ft) / dt Cells(i + 10, 4) = dft Cells(i + 10, 7) = dgt '============二階微分============ Cells(4, 2) = t + 2 * dt LLft = Cells(4, 3) Cells(4, 2) = t - 2 * dt BBft = Cells(4, 3) ddCft = (Lft - 2 * ft + Bft) / (dt ^ 2) ddLft = (LLft - 2 * Lft + ft) / (dt ^ 2) ddBft = (ft - 2 * Bft + BBft) / (dt ^ 2) '============表示============ Cells(4, 5) = dCft Cells(4, 6) = ddCft Cells(4, 7) = dLft Cells(4, 8) = ddLft Cells(4, 9) = dBft Cells(4, 10) = ddBft End Sub