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

ルンゲクッタ法を用いたバネの単振動を解析する課題をやっています。以下の部分まで作ったのですが、
どうしても最後のほうがわかりません。
関数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;
}

A 回答 (5件)

1階微係数って記憶しなくてもいいんだっけ?

    • good
    • 0

本当に教えてほしいんでしょうかね。


配布されたものらしきプログラムを投げつけ
ルンゲクッタ法を用いたバネの単振動を解析する課題
としか説明せず
みんながよくわからないなりに必死に読んでくれてるにもかかわらず、補足要求に
たいしても
「初期値を決めて解析する方法」
としか言わず。

本当に教えてもらいたいなら
プログラムの注釈をこまかくかいたり、
どこでどのような処理をするプログラムか、説明を書いたり、
物理の様々な式を計算しているなら
最低限計算している式を書くのが常識です。

私も読みましたがルンゲクッタ法がよくわからないのでプログラムをどう改良したらよいかもよくわかりませんでした。

詳しい補足要求お願いします。
    • good
    • 0

物理わからないなりに読んでみましたが、


まず、fとf2の二種類あるのがよくわかりません。

また、"単振動を解析"だけでは何を求めるのかわかりませんが、
仮に求めるのが、時刻tにおける位置yのグラフであるなら、
関数f()は時刻tにおける速度sを返すはずです。

return y1;
が速度でないということはわかりますが、どうでしょうか。
時刻tにおける速度sを求める計算式は、私にはわからないので
ご自身で数学的に求めてください^^。
    • good
    • 0

これはプログラミングするとき全般に言えることですが、


「他人に見せるコードにはわかりやすくコメントしましょう」を守ってください(^^;
私は大学に入って間もないのでルンゲクッタをよく知りません。
それで式と照らし合わそうと努力したのですが、大変な苦労です。
どの変数がルンゲクッタの式の何に対応しているのか教えてください。
    • good
    • 0

まず、どういう処理をしているか書いてください。


何処が分からないのか分かりません。
ルンゲ=クッタ法の方法通りにやってください。

この回答への補足

y''=-w^2y'-2.0ky
で初期値を決めて解析する方法です。

補足日時:2006/07/24 20:58
    • good
    • 0

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