分からないです!至急アドバイスお願いします!

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
occhan
記事: 2
登録日時: 7年前

分からないです!至急アドバイスお願いします!

#1

投稿記事 by occhan » 7年前

C言語初心者です。以下のようなNewton法に関するC言語プログラミングを作ったのですが、コンパイルすると-nanが無限ループしてしましました。何故ですか?

#include <stdio.h>
#include <math.h>
double func (double x);
double df (double x);
int main()
{
double x0,x1;
double delta=1.0e-5;
x0=0.5;


for(;;){

x1=x0-func(x0)/df(x0);

if(fabs(func(x1))<delta){
printf("答えは%lfです。\n",x1);
break;
}
else{
printf("%lfは答えではありません\n",x1);

x0=x1;
}
}
return 0;
}
double func(double x){
double y;
y=x*x*x*x*x-30*x*x*x*x+300*x*x*x-1200*x*x+1800*x-720;
return y;
}
double df(double x){
double y;
y=5*x*x*x*x-120*x*x*x+900*x*x-2400*x+1800;
return y;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 分からないです!至急アドバイスお願いします!

#2

投稿記事 by みけCAT » 7年前

ソースコードを提示する際は、BBCodeが有効な(向こうにしていない)状態でBBCodeのcodeタグで囲んでいただけると、見やすくてありがたいです。
また、インデントもきちんと整えましょう。
occhan さんが書きました:コンパイルすると-nanが無限ループしてしましました。何故ですか?
コンパイルするだけでなくプログラムの実行もしても、「-nanが無限ループする」という現象は発生しませんでした。
実行結果

コード:

0.604088は答えではありません
0.616847は答えではありません
0.617031は答えではありません
答えは0.617031です。
コンパイルするだけで「-nanが無限ループする」ということは、おそらくコンパイラが壊れているか不良品なのでしょう。
本当はコンパイルするだけでは「-nanが無限ループ」せず、実行すると「-nanが無限ループする」場合は、
本当に意図したプログラムをコンパイル・実行しているか、例えばコンパイラを起動する端末の作業ディレクトリが正しいかや最新のソースコードを保存してからコンパイルしているかなどを確認してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

metaphor

Re: 分からないです!至急アドバイスお願いします!

#3

投稿記事 by metaphor » 7年前

https://ja.wikipedia.org/wiki/%E4%BA%94 ... B%E5%BC%8F
五次方程式の実根予測法はよくしりませんが4.610833と0.617031が見つかりました。
(普通の思いつくのはグラフを描いてX軸との交点を見ればいいはずです)

コード:

#include <stdio.h> 
#include <math.h>
double func(double x) {
	double y;
	y = x*x*x*x*x - 30 * x*x*x*x + 300 * x*x*x - 1200 * x*x + 1800 * x - 720;
	return y;
}
int main(void){
    double x0=0.0; int i;
    printf("%f\t", func(4.610833));
    printf("%f\t", func(0.617031));
    for(i=0;i<100;++i){
        x0 += 0.1; 
        printf("%f[%f]\t", func(x0),x0);
    }
    x0=0.0;////////////////////////////
    for(i=0;i<100;++i){
        x0 += -0.1; 
        printf("%f[%f]\t", func(x0),x0);
    }
    return 0;
}

metaphor

Re: 分からないです!至急アドバイスお願いします!

#4

投稿記事 by metaphor » 7年前

Newton法のプログラムは問題ありません。

コード:

#include <stdio.h>
#include <math.h>
double func(double x);
double df(double x);
int main()
{
	double x0, x1;
	double delta = 1.0e-5;// deltaX=>0:無限小として認識できる値:0の代わり
	x0 = 4.7; //0.5;初期値:この値によって収束する値が決まる

	printf("%f\n\n", func(4.7));

	for (;;) { // while(1)と同じ:無限ループ
		                             
		x1 = x0 - func(x0) / df(x0);  // df(x0)(x1-x0) + func(x0) = 0 を変形
                                     // df(x0)はx0における微分係数
		if  (fabs(func(x1))<delta) {//値が無限小なったら終了
			printf("答えは%lfです。\n", x1);
			break;                //再帰終了
		}
		else {
			printf("%lfは答えではありません\n", x1);

			x0 = x1;         //前回の計算値に置き換えて再帰処理
		}
	}
	return 0;
}
double func(double x) { //この関数の実根を求める
	double y;
	y = x*x*x*x*x - 30 * x*x*x*x + 300 * x*x*x - 1200 * x*x + 1800 * x - 720;
	return y;
}
double df(double x) { // func(x0)の微分係数: x*x*x*x*xの微分係数は 5 * x*x*x*xので正しい
	double y;
	y = 5 * x*x*x*x - 120 * x*x*x + 900 * x*x - 2400 * x + 1800;
	return y;
}

occhan
記事: 2
登録日時: 7年前

Re: 分からないです!至急アドバイスお願いします!

#5

投稿記事 by occhan » 7年前

>みけCATさん
返信ありがとうございます!
このような、友達のプログラミングと意味合いがほぼ同じなのに答えが違うなどの症状が多々出てたので、もしかしたらコンパイル自体の問題もあるかもしれませんね…
今度、教授に聞いてみます!

box
記事: 2002
登録日時: 14年前

Re: 分からないです!至急アドバイスお願いします!

#6

投稿記事 by box » 7年前

metaphor さんが書きました:

コード:

			break;                //再帰終了
			x0 = x1;         //前回の計算値に置き換えて再帰処理
再帰っていう表現を使っていいものかどうか、疑問ありです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

metaphor

Re: 分からないです!至急アドバイスお願いします!

#7

投稿記事 by metaphor » 7年前

あ、再帰ではなく反復法でした。失礼しました。

metaphor

Re: 分からないです!至急アドバイスお願いします!

#8

投稿記事 by metaphor » 7年前

あ、再帰ではなく反復法でした。失礼しました。

閉鎖

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