始めまして。
大学にてC言語にてプログラミングの勉強しています。
明日までの課題なのですが、自力で解くことができないのでアドバイス頂けますと助かります。
ルンゲ・クッタ法にて、dy/dx=3y/1+Xを解きます。
初期値X0、Y0=1として、刻み幅h=0.1 0.05 0.025・・・・と1/2ずつ減じていきます。
ルンゲ・クッタ法の計算方法、プログラムは分かるのですが、「刻み幅を1/2ずつ減じていく」が分かりません。
ルンゲ・クッタ法のプログラムの中にfor文でループさせ、hを1/2ずつさせていけばいけばいいことは分かるのですが・・・・。
申し訳ありませんが、アドバイスを頂けますと助かります!
よろしくお願いします!
ルンゲ・クッタ法
Re:ルンゲ・クッタ法
わかってる範囲のソースコードを記載します。
#include<stdio.h>
#include<math.h>
#define EPS .00000001
double func_c(double,double);
int main(int argc,char **argv)
{
double x=1.0, y=1.0;
double h=0.1,dx=1.0,xmax=10.0;
double ddx=0.0,k1,k2,k3,k4;
printf("/tX/tY/n");
do{
if(x>=ddx+=dx;
printf("%8.41lf %8.4lf/n",x,y);
}
k1=func_f(x ,y);
k2=func_f(x+h/2.0,y+h*k1*h*k1*h/2.0);
k3=func_f(x+h/2.0,y+h*k1*h*k1*h/2.0);
k4=func_f(x+h ,y+k3*h);
y+=(h/6.0)*(k1+2.0*k2+2.0*k3+k4);
x+=h;
}while(x<=xmax);
return 0;
}
double func_f(double x,double y)
{
return 3y/1+x*x
}
よろしくお願いします!
#include<stdio.h>
#include<math.h>
#define EPS .00000001
double func_c(double,double);
int main(int argc,char **argv)
{
double x=1.0, y=1.0;
double h=0.1,dx=1.0,xmax=10.0;
double ddx=0.0,k1,k2,k3,k4;
printf("/tX/tY/n");
do{
if(x>=ddx+=dx;
printf("%8.41lf %8.4lf/n",x,y);
}
k1=func_f(x ,y);
k2=func_f(x+h/2.0,y+h*k1*h*k1*h/2.0);
k3=func_f(x+h/2.0,y+h*k1*h*k1*h/2.0);
k4=func_f(x+h ,y+k3*h);
y+=(h/6.0)*(k1+2.0*k2+2.0*k3+k4);
x+=h;
}while(x<=xmax);
return 0;
}
double func_f(double x,double y)
{
return 3y/1+x*x
}
よろしくお願いします!
Re:ルンゲ・クッタ法
全角空白を使って「見かけだけ」インデントしている
ソースはチェックしたくないです。
投稿時、インデントのために全角空白を使った時点で、
お手元のオリジナルのソースとこちらが見るソースとが
食い違ってしまいます。
その結果、質問者さんとこちらとが、
同じ土俵に立って話ができなくなります。
「規約と注意事項」をよくごらんになってから、
再投稿してください。
ソースはチェックしたくないです。
投稿時、インデントのために全角空白を使った時点で、
お手元のオリジナルのソースとこちらが見るソースとが
食い違ってしまいます。
その結果、質問者さんとこちらとが、
同じ土俵に立って話ができなくなります。
「規約と注意事項」をよくごらんになってから、
再投稿してください。
Re:ルンゲ・クッタ法
書き直させて頂きました。
申し訳ありませんでした。 チェックよろしくお願いします。
#include<stdio.h>
#include<math.h>
#define EPS .00000001
double func_f(double,double);
int main(int argc,char **argv)
{
double x=1.0,y=1.0;
double h=0.1,dx=1.0,xmax=10.0;
double ddx=0.0,k1,k2,k3,k4;
printf("/tX/tY/n");
do{
if(x>=ddx-EPS)
{
ddx+=dx;
printf("%8.4lf%8.4lf\n",x,y);
}
k1=func_f(x ,y);
k2=func_f(x+h/2.0,y+h*k1*h/2.0);
k3=func_f(x+h/2.0,y+h*k2*h/2.0);
k4=func_f(x+h ,y+k3*h);
y+=(h/6.0)*(k1+2.0*k2+2.0*k3+k4);
x+=h;
}while(x<=xmax);
return 0;
}
double func_f(double x,double y)
{
return 3y/1+x*x
}
申し訳ありませんでした。 チェックよろしくお願いします。
#include<stdio.h>
#include<math.h>
#define EPS .00000001
double func_f(double,double);
int main(int argc,char **argv)
{
double x=1.0,y=1.0;
double h=0.1,dx=1.0,xmax=10.0;
double ddx=0.0,k1,k2,k3,k4;
printf("/tX/tY/n");
do{
if(x>=ddx-EPS)
{
ddx+=dx;
printf("%8.4lf%8.4lf\n",x,y);
}
k1=func_f(x ,y);
k2=func_f(x+h/2.0,y+h*k1*h/2.0);
k3=func_f(x+h/2.0,y+h*k2*h/2.0);
k4=func_f(x+h ,y+k3*h);
y+=(h/6.0)*(k1+2.0*k2+2.0*k3+k4);
x+=h;
}while(x<=xmax);
return 0;
}
double func_f(double x,double y)
{
return 3y/1+x*x
}
Re:ルンゲ・クッタ法
>C初心者さん
えーと、規約と注意事項をちゃんと読んでから再投稿してくださいと言われているのに
なぜちゃんと読まないのでしょうか?
ページを開いてすぐにでかでかと「ソースコードはpreタグで囲んでください」と書いているのに
見落としてしまったのでしょうか?
えーと、規約と注意事項をちゃんと読んでから再投稿してくださいと言われているのに
なぜちゃんと読まないのでしょうか?
ページを開いてすぐにでかでかと「ソースコードはpreタグで囲んでください」と書いているのに
見落としてしまったのでしょうか?
Re:ルンゲ・クッタ法
>ルンゲ・クッタ法にて、dy/dx=3y/1+Xを解きます。
なぜ、3y/1+xなんだろう?
dx/dy=3y+x で良さそうなのに。
プログラムでも
>return 3y/1+x*x
って?最後のxはhを掛けるのでは、ないのでしょうか?
だとしたら
3*y/(1+x)でないと変ですよ。
試してないけど、添付されたプログラムって動かないのでは?
なぜ、3y/1+xなんだろう?
dx/dy=3y+x で良さそうなのに。
プログラムでも
>return 3y/1+x*x
って?最後のxはhを掛けるのでは、ないのでしょうか?
だとしたら
3*y/(1+x)でないと変ですよ。
試してないけど、添付されたプログラムって動かないのでは?
Re:ルンゲ・クッタ法
とりあえずそれっぽく動くものをペタペタ。
ルンゲ・クッタ法については知らないので結果値が正常でないなら提示したソースに問題があると思います、多分。
※確かに見辛いけどPre使って無い投稿は他にも一杯あるのに何でここだけ突っ込まれてるんだろう(汗)
ルンゲ・クッタ法については知らないので結果値が正常でないなら提示したソースに問題があると思います、多分。
#define EPS .00000001 double func_f(double,double); int main(int argc,char **argv){ double x = 1.0, y = 1.0; double h = 0.1, dx = 1.0, xmax = 10.0; double ddx = 0.0, k1, k2, k3, k4; int i = 0; printf("\tX\tY\n"); for( i = 0 ; i < 10; i++ ){ printf( "\n%2d回目(h=%.10lf)\n", i + 1, h ); x = 1.0; y = 1.0; ddx = 0.0; do{ if( x >= ddx - EPS ){ ddx += dx; printf( "%8.4lf %8.4lf\n", x, y ); } k1=func_f(x,y); k2=func_f(x+h/2.0,y+h*k1*h/2.0); k3=func_f(x+h/2.0,y+h*k2*h/2.0); k4=func_f(x+h ,y+k3*h); y+=(h/6.0)*(k1+2.0*k2+2.0*k3+k4); x+=h; }while( x <= xmax ); h /= 2.0; } return 0; } double func_f( double x, double y ) { return ( 3 * y ) / ( 1 + x ); }なんかおかしいところは適当に直しました。
※確かに見辛いけどPre使って無い投稿は他にも一杯あるのに何でここだけ突っ込まれてるんだろう(汗)
Re:ルンゲ・クッタ法
>※確かに見辛いけどPre使って無い投稿は他にも一杯あるのに何でここだけ突っ込まれてるんだろう(汗)
それは、たぶん
>ルンゲ・クッタ法の計算方法、プログラムは分かるのですが、
プログラムがわかるというのに、他人が作ったプログラムを、どっからか持ってきて
貼り付けているからと誰でも思うからではないでしょうか。
それは、たぶん
>ルンゲ・クッタ法の計算方法、プログラムは分かるのですが、
プログラムがわかるというのに、他人が作ったプログラムを、どっからか持ってきて
貼り付けているからと誰でも思うからではないでしょうか。
Re:ルンゲ・クッタ法
>>※確かに見辛いけどPre使って無い投稿は他にも一杯あるのに何でここだけ突っ込まれてるんだろう(汗)
>それは、たぶん
>>ルンゲ・クッタ法の計算方法、プログラムは分かるのですが、
>プログラムがわかるというのに、他人が作ったプログラムを、どっからか持ってきて
>貼り付けているからと誰でも思うからではないでしょうか。
なるほど・・検索して参考ソースを持ってくるのも努力の内だと思ってるのであまり気になりませんでした。
基礎基本は分かりますと言いつつ基本的な事の質問だったりすると気になったりしますが・・・
まぁ人それぞれですよね。
ちゃんと答え書けてるかも分からないのでこっそりしておきます。
>それは、たぶん
>>ルンゲ・クッタ法の計算方法、プログラムは分かるのですが、
>プログラムがわかるというのに、他人が作ったプログラムを、どっからか持ってきて
>貼り付けているからと誰でも思うからではないでしょうか。
なるほど・・検索して参考ソースを持ってくるのも努力の内だと思ってるのであまり気になりませんでした。
基礎基本は分かりますと言いつつ基本的な事の質問だったりすると気になったりしますが・・・
まぁ人それぞれですよね。
ちゃんと答え書けてるかも分からないのでこっそりしておきます。
Re:ルンゲ・クッタ法
本題から反れている投稿で申し訳ないです。
> なるほど・・検索して参考ソースを持ってくるのも努力の内だと思ってるのであまり気になりませんでした。
検索して参考ソースを拾ってくるのもスキルの内だと思ってますのでそれはよいとしても、
検索できた=プログラムを理解したにはならないと思うのです。
アルゴリズムは分からないけど検索したらあったと言われると何を勉強してるのだろう?と疑問に思います。
それに加えて指摘されている文を読んでいないようなので確認の意味で「アドバイス読んでいますか?」と投稿した次第です。
#質問者さんが戻ってこないのは課題の期限が過ぎたからでしょうね(汗
> なるほど・・検索して参考ソースを持ってくるのも努力の内だと思ってるのであまり気になりませんでした。
検索して参考ソースを拾ってくるのもスキルの内だと思ってますのでそれはよいとしても、
検索できた=プログラムを理解したにはならないと思うのです。
アルゴリズムは分からないけど検索したらあったと言われると何を勉強してるのだろう?と疑問に思います。
それに加えて指摘されている文を読んでいないようなので確認の意味で「アドバイス読んでいますか?」と投稿した次第です。
#質問者さんが戻ってこないのは課題の期限が過ぎたからでしょうね(汗