一階の常微分方程式の解を求めるプログラムを書いてみたのですが、分からない事柄があったので質問させていただきました。
なお、このプログラムは dy/dx = e^(3x)+2y という微分方程式の解をオイラー法とホイン法で計算する(厳密値も計算している)というものです。
このプログラムを実行してみたところ、オイラー法で計算した値は正しいことが分かりました。しかし、ホイン法で計算した値が微妙に違っているようでした。(出力結果の模範解答と照らし合わせた結果)
個人的にはプログラムの内容は正しいと思ったのですが、どこかに間違いがあるのでしょうか?
どなたか分かる方がいらっしゃいましたら、教えていただけると幸いです。
Option Explicit
Sub main()
Dim h As Double, xmax As Double
Dim x As Double, y As Double
Dim yS As Double, yE As Double, yH As Double
Dim k1 As Double, k2 As Double
Dim f As Double, g As Double
Dim n As Double
x = 0
yS = 1
yE = 1
yH = 1
h = 0.01
n = 2
xmax = 1
Sheet1.Cells(2, 1) = x
Sheet1.Cells(2, 2) = yE
Sheet1.Cells(2, 3) = yH
Sheet1.Cells(2, 4) = yS
With Worksheets("Sheet1")
Do
yS = Exp(3 * (x + h))
rhs x, yE, f
yE = yE + h * f
rhs x, yH, f
rhs2 x, yH, h, k1, g
k1 = h * f
k2 = h * g
yH = yH + (k1 + k2) / 2
x = x + h
n = n + 1
.Cells(n, 1) = x
.Cells(n, 2) = yE
.Cells(n, 3) = yH
.Cells(n, 4) = yS
Loop Until x >= xmax
End With
End Sub
Sub rhs(x As Double, y As Double, f As Double)
f = Exp(3 * x) + 2 * y
End Sub
Sub rhs2(x As Double, y As Double, h As Double, k1 As Double, g As Double)
g = Exp(3 * (x + h)) + 2 * (y + k1)
End Sub
Sub clear()
Sheet1.Columns(1).ClearContents
Sheet1.Columns(2).ClearContents
Sheet1.Columns(3).ClearContents
Sheet1.Columns(4).ClearContents
Sheet1.Cells(1, 1) = "xの値"
Sheet1.Cells(1, 2) = "オイラー法"
Sheet1.Cells(1, 3) = "ホイン法"
Sheet1.Cells(1, 4) = "厳密解"
End Sub
No.1ベストアンサー
- 回答日時:
こんにちは、
>このプログラムを実行してみたところ、
>オイラー法で計算した値は正しいことが分かりました。
>しかし、ホイン法で計算した値が微妙に違っているようでした。
>(出力結果の模範解答と照らし合わせた結果)
理論的にはホイン法のほうが、正確な値になるはずです。
私的に作ると、
ホイン法の方が、厳密解に近いですが。
理論は、以下のURLに出ています。
http://akita-nct.jp/yamamoto/lecture/2004/5E/tes …
計算結果も、補足してください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 単振り子とルンゲ・タック法 1 2022/07/15 00:05
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:07
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:13
- Visual Basic(VBA) vbaの計算 if elseと範囲について 6 2022/11/26 01:49
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Excel(エクセル) VBA オリジナル関数で選択セルの合計を作成したい 3 2023/03/19 19:45
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/01/11 08:33
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
数値計算の高速化 (cos, sin, exp)
-
Perlでのルートの計算
-
Vb6.0で三角関数が使えない
-
VBAの再計算が反映されない件に...
-
Visual C++でdebugとreleaseで...
-
[急募]Pythonについてです。
-
R言語での極小値の指数形式での...
-
スライムがつぶれていく様子を...
-
60進数の四則計算
-
VB6.0でのバイナリデータの扱い...
-
傾いた四角形内の範囲の条件式
-
EXCELなどで「返す」という表現
-
VB6で正確なミリ秒を計測したい...
-
CとFORTRANの計算速度はどちら...
-
Excel VBAの残業時間の合計計算...
-
VBでReplace
-
10進数から8進数へ
-
順列のプログラムについて(VB)
-
Javascrptの0の掛け算
-
エクセルで特定のセルのみを任...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
VBAの再計算が反映されない件に...
-
排他的論理和 BCC(水平パリテ...
-
EXCELなどで「返す」という表現
-
C言語の課題で、1年の秒数を計...
-
バッチファイルでウインドウを...
-
骨折リスク評価のFRAXについて...
-
変化させるセルが変化しない
-
CとFORTRANの計算速度はどちら...
-
なぜオーバーフローになるので...
-
数値計算の高速化 (cos, sin, exp)
-
モジュラス103の計算とは何でし...
-
C# 計算処理中に実行中ウィン...
-
モジュロ
-
引き放し法による除算アルゴリ...
-
60進数の四則計算
-
C言語についてです。 再帰を使...
-
Perlで時間の計算
-
CRC8を教えてください
-
傾いた四角形内の範囲の条件式
おすすめ情報