2017-11-19 4 views
-3

私は最近、このコードの背後にあるコンセプトに関してこのコードに関する質問を投稿しましたが、私は今これを分類しました。しかし、コードでは間違った値が出力されているので、その理由を特定できません。ここで、コードは次のとおりです。ここでなぜ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

すべてのヘルプは、おかげでいただければ幸いです!

+1

したがって、正しい値は何でしょうか?なぜこれらは間違っていますか?説明してください。画像を投稿するのではなく、代わりにテキストを投稿してみてください。 Windowsコンソールからテキストをコピーする方法がわからない場合は、Webを検索するだけで簡単です。 –

+0

デバッグ中に何が起こっているのかをよりよく理解するために、 'k2y'や' k2z'などの他の値も表示することをお勧めします。それは私の仕事で使っているテクニックです。 –

+0

あなたのコードはコンパイルされますか? 'rk2'の宣言中に仮引数' z'と 'y'を設定することはできません。これは違法です。投稿したコードが完全なコピーであり、コンパイルされていることを確認してください。 –

答えて

0

5つの引数を指定してrk2を呼び出すように見えますが、3でしか宣言していないようです。

+0

私はそれが実際のコードを反映しているとは思わない。 OPは質問を更新しませんでしたが、コードはこのようなエラーでコンパイルされませんでした。問題のコードは、OPが実行していた実際のコードではありません。そのようなエラーがそこにあると、上記の私のコメントに気づくでしょう。 –

関連する問題