ルンゲ・クッタ法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
C初心者

ルンゲ・クッタ法

#1

投稿記事 by C初心者 » 16年前

始めまして。
大学にてC言語にてプログラミングの勉強しています。
明日までの課題なのですが、自力で解くことができないのでアドバイス頂けますと助かります。

ルンゲ・クッタ法にて、dy/dx=3y/1+Xを解きます。
初期値X0、Y0=1として、刻み幅h=0.1 0.05 0.025・・・・と1/2ずつ減じていきます。

ルンゲ・クッタ法の計算方法、プログラムは分かるのですが、「刻み幅を1/2ずつ減じていく」が分かりません。

ルンゲ・クッタ法のプログラムの中にfor文でループさせ、hを1/2ずつさせていけばいけばいいことは分かるのですが・・・・。

申し訳ありませんが、アドバイスを頂けますと助かります!
よろしくお願いします!

box

Re:ルンゲ・クッタ法

#2

投稿記事 by box » 16年前

刻み幅 h = 0.1 の場合のソースコードを提示してください。

C初心者

Re:ルンゲ・クッタ法

#3

投稿記事 by C初心者 » 16年前

わかってる範囲のソースコードを記載します。

#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


よろしくお願いします!



        






box

Re:ルンゲ・クッタ法

#4

投稿記事 by box » 16年前

全角空白を使って「見かけだけ」インデントしている
ソースはチェックしたくないです。

投稿時、インデントのために全角空白を使った時点で、
お手元のオリジナルのソースとこちらが見るソースとが
食い違ってしまいます。
その結果、質問者さんとこちらとが、
同じ土俵に立って話ができなくなります。

「規約と注意事項」をよくごらんになってから、
再投稿してください。

C初心者

Re:ルンゲ・クッタ法

#5

投稿記事 by C初心者 » 16年前

書き直させて頂きました。
申し訳ありませんでした。 チェックよろしくお願いします。

#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
}

asd

Re:ルンゲ・クッタ法

#6

投稿記事 by asd » 16年前

>C初心者さん

えーと、規約と注意事項をちゃんと読んでから再投稿してくださいと言われているのに
なぜちゃんと読まないのでしょうか?

ページを開いてすぐにでかでかと「ソースコードはpreタグで囲んでください」と書いているのに
見落としてしまったのでしょうか?

non

Re:ルンゲ・クッタ法

#7

投稿記事 by non » 16年前

>ルンゲ・クッタ法にて、dy/dx=3y/1+Xを解きます。

なぜ、3y/1+xなんだろう?
dx/dy=3y+x で良さそうなのに。

プログラムでも
>return 3y/1+x*x
って?最後のxはhを掛けるのでは、ないのでしょうか?
だとしたら
3*y/(1+x)でないと変ですよ。

試してないけど、添付されたプログラムって動かないのでは?

ねこ

Re:ルンゲ・クッタ法

#8

投稿記事 by ねこ » 16年前

とりあえずそれっぽく動くものをペタペタ。
ルンゲ・クッタ法については知らないので結果値が正常でないなら提示したソースに問題があると思います、多分。
#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使って無い投稿は他にも一杯あるのに何でここだけ突っ込まれてるんだろう(汗)

non

Re:ルンゲ・クッタ法

#9

投稿記事 by non » 16年前

>※確かに見辛いけどPre使って無い投稿は他にも一杯あるのに何でここだけ突っ込まれてるんだろう(汗)
それは、たぶん
>ルンゲ・クッタ法の計算方法、プログラムは分かるのですが、
プログラムがわかるというのに、他人が作ったプログラムを、どっからか持ってきて
貼り付けているからと誰でも思うからではないでしょうか。

ねこ

Re:ルンゲ・クッタ法

#10

投稿記事 by ねこ » 16年前

>>※確かに見辛いけどPre使って無い投稿は他にも一杯あるのに何でここだけ突っ込まれてるんだろう(汗)
>それは、たぶん
>>ルンゲ・クッタ法の計算方法、プログラムは分かるのですが、
>プログラムがわかるというのに、他人が作ったプログラムを、どっからか持ってきて
>貼り付けているからと誰でも思うからではないでしょうか。

なるほど・・検索して参考ソースを持ってくるのも努力の内だと思ってるのであまり気になりませんでした。
基礎基本は分かりますと言いつつ基本的な事の質問だったりすると気になったりしますが・・・
まぁ人それぞれですよね。
ちゃんと答え書けてるかも分からないのでこっそりしておきます。

asd

Re:ルンゲ・クッタ法

#11

投稿記事 by asd » 16年前

本題から反れている投稿で申し訳ないです。

> なるほど・・検索して参考ソースを持ってくるのも努力の内だと思ってるのであまり気になりませんでした。

検索して参考ソースを拾ってくるのもスキルの内だと思ってますのでそれはよいとしても、
検索できた=プログラムを理解したにはならないと思うのです。

アルゴリズムは分からないけど検索したらあったと言われると何を勉強してるのだろう?と疑問に思います。
それに加えて指摘されている文を読んでいないようなので確認の意味で「アドバイス読んでいますか?」と投稿した次第です。

#質問者さんが戻ってこないのは課題の期限が過ぎたからでしょうね(汗

閉鎖

“C言語何でも質問掲示板” へ戻る