アプリ版:「スタンプのみでお礼する」機能のリリースについて

一階の常微分方程式の解を求めるプログラムを書いてみたのですが、分からない事柄があったので質問させていただきました。

なお、このプログラムは 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

A 回答 (1件)

こんにちは、



>このプログラムを実行してみたところ、
>オイラー法で計算した値は正しいことが分かりました。
>しかし、ホイン法で計算した値が微妙に違っているようでした。
>(出力結果の模範解答と照らし合わせた結果)

理論的にはホイン法のほうが、正確な値になるはずです。

私的に作ると、

ホイン法の方が、厳密解に近いですが。

理論は、以下のURLに出ています。

http://akita-nct.jp/yamamoto/lecture/2004/5E/tes …

計算結果も、補足してください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!