- 締切済み
大学のC言語の課題で
ルンゲクッタ法を用いたバネの単振動を解析する課題をやっています。以下の部分まで作ったのですが、 どうしても最後のほうがわかりません。 関数fとf2のreturn やメイン関数を変更すればいいとおもうのですが、どうやっても満足な結果が得られません。どなたか詳しい方教えてもらえない? #include<stdio.h> #include<math.h> double f(double t,double y1) { return y1; } double f2(double t2,double y2) { double w=5.0,k=0.5; return -w*w*f(t2,y2)-2.0*k*y2; } int main(void) { int count,bunkatu,npr; double t_0,T; double k1,k2,k3,k4; double y,t,dt,dt_2,dt_6; t_0 = 0.0; T=10.0; bunkatu=2000; npr=1000; y=1.0; printf("\n# [t_0,T]=[%6.4lf,%6.4lf] N=%d\n",t_0,T,bunkatu); t=t_0; dt=(T-t_0)/(double)bunkatu; dt_2=dt/2.0; dt_6=dt/6.0; for(count=0;count <=bunkatu;count++) { if(count %(bunkatu/npr)==0) printf("\n %5.2lf %10.5f",t,y); k1=f2(t,y); k2=f(t+dt_2,y+k1*dt_2); k3=f(t+dt_2,y+k2*dt_2); k4=f(t+dt,y+k3*dt); y+=(k1+2.0*k2+2.0*k3+k4)*dt_6; t+=dt; } printf("\n"); return 0; }
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
1階微係数って記憶しなくてもいいんだっけ?
- dra2jp
- ベストアンサー率25% (18/72)
本当に教えてほしいんでしょうかね。 配布されたものらしきプログラムを投げつけ ルンゲクッタ法を用いたバネの単振動を解析する課題 としか説明せず みんながよくわからないなりに必死に読んでくれてるにもかかわらず、補足要求に たいしても 「初期値を決めて解析する方法」 としか言わず。 本当に教えてもらいたいなら プログラムの注釈をこまかくかいたり、 どこでどのような処理をするプログラムか、説明を書いたり、 物理の様々な式を計算しているなら 最低限計算している式を書くのが常識です。 私も読みましたがルンゲクッタ法がよくわからないのでプログラムをどう改良したらよいかもよくわかりませんでした。 詳しい補足要求お願いします。
- mizuneko
- ベストアンサー率16% (3/18)
物理わからないなりに読んでみましたが、 まず、fとf2の二種類あるのがよくわかりません。 また、"単振動を解析"だけでは何を求めるのかわかりませんが、 仮に求めるのが、時刻tにおける位置yのグラフであるなら、 関数f()は時刻tにおける速度sを返すはずです。 return y1; が速度でないということはわかりますが、どうでしょうか。 時刻tにおける速度sを求める計算式は、私にはわからないので ご自身で数学的に求めてください^^。
- sirn
- ベストアンサー率14% (8/55)
これはプログラミングするとき全般に言えることですが、 「他人に見せるコードにはわかりやすくコメントしましょう」を守ってください(^^; 私は大学に入って間もないのでルンゲクッタをよく知りません。 それで式と照らし合わそうと努力したのですが、大変な苦労です。 どの変数がルンゲクッタの式の何に対応しているのか教えてください。
- sirn
- ベストアンサー率14% (8/55)
まず、どういう処理をしているか書いてください。 何処が分からないのか分かりません。 ルンゲ=クッタ法の方法通りにやってください。
補足
y''=-w^2y'-2.0ky で初期値を決めて解析する方法です。