私は最近、このコードの背後にあるコンセプトに関してこのコードに関する質問を投稿しましたが、私は今これを分類しました。しかし、コードでは間違った値が出力されているので、その理由を特定できません。ここで、コードは次のとおりです。ここでなぜRunge-Kutta 2次プログラムが間違った値を出力するのですか?
program rungekutta
implicit none
integer, parameter :: dp = selected_real_kind(15,300)
integer :: i
real(kind=dp) z, y, t
do i=1,100
call rk2(dydt, dzdt, z, y, t)
print *, z, y
end do
contains
subroutine rk2(z, y, t)
implicit none
integer, parameter :: dp = selected_real_kind(15,300)
real(kind=dp) :: k1y, k1z, k2y, k2z, n, h=0.1, y=1, z=0, t
k1y = dydt(y,z,t)*h
k1z = dzdt(y,z,t)*h
k2z = dzdt(y + (0.5*k1y), z + (0.5*k1z), t + (0.5*h))*h
k2y = dydt(y, z +(0.5*k1z), t)*h
y = y + k2y
z = z + k2z
end subroutine
function dzdt(y,z,t)
real(kind=dp) :: y, z, t, dzdt, omega=1, A=0, B, C=0, D=0
B = omega**2
dzdt = A*y**3 + B*y - C*z + D*sin(omega*t)
end function
function dydt(z)
real(kind=dp) :: z, dydt
dydt = z
end function
end program
は、端末の画面印刷です:https://prnt.sc/hchmv7
すべてのヘルプは、おかげでいただければ幸いです!
したがって、正しい値は何でしょうか?なぜこれらは間違っていますか?説明してください。画像を投稿するのではなく、代わりにテキストを投稿してみてください。 Windowsコンソールからテキストをコピーする方法がわからない場合は、Webを検索するだけで簡単です。 –
デバッグ中に何が起こっているのかをよりよく理解するために、 'k2y'や' k2z'などの他の値も表示することをお勧めします。それは私の仕事で使っているテクニックです。 –
あなたのコードはコンパイルされますか? 'rk2'の宣言中に仮引数' z'と 'y'を設定することはできません。これは違法です。投稿したコードが完全なコピーであり、コンパイルされていることを確認してください。 –