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;
}
分からないです!至急アドバイスお願いします!
Re: 分からないです!至急アドバイスお願いします!
ソースコードを提示する際は、BBCodeが有効な(向こうにしていない)状態でBBCodeのcodeタグで囲んでいただけると、見やすくてありがたいです。
また、インデントもきちんと整えましょう。
実行結果 コンパイルするだけで「-nanが無限ループする」ということは、おそらくコンパイラが壊れているか不良品なのでしょう。
本当はコンパイルするだけでは「-nanが無限ループ」せず、実行すると「-nanが無限ループする」場合は、
本当に意図したプログラムをコンパイル・実行しているか、例えばコンパイラを起動する端末の作業ディレクトリが正しいかや最新のソースコードを保存してからコンパイルしているかなどを確認してください。
また、インデントもきちんと整えましょう。
コンパイルするだけでなくプログラムの実行もしても、「-nanが無限ループする」という現象は発生しませんでした。occhan さんが書きました:コンパイルすると-nanが無限ループしてしましました。何故ですか?
実行結果 コンパイルするだけで「-nanが無限ループする」ということは、おそらくコンパイラが壊れているか不良品なのでしょう。
本当はコンパイルするだけでは「-nanが無限ループ」せず、実行すると「-nanが無限ループする」場合は、
本当に意図したプログラムをコンパイル・実行しているか、例えばコンパイラを起動する端末の作業ディレクトリが正しいかや最新のソースコードを保存してからコンパイルしているかなどを確認してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 分からないです!至急アドバイスお願いします!
https://ja.wikipedia.org/wiki/%E4%BA%94 ... B%E5%BC%8F
五次方程式の実根予測法はよくしりませんが4.610833と0.617031が見つかりました。
(普通の思いつくのはグラフを描いてX軸との交点を見ればいいはずです)
五次方程式の実根予測法はよくしりませんが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;
}
Re: 分からないです!至急アドバイスお願いします!
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;
}
Re: 分からないです!至急アドバイスお願いします!
>みけCATさん
返信ありがとうございます!
このような、友達のプログラミングと意味合いがほぼ同じなのに答えが違うなどの症状が多々出てたので、もしかしたらコンパイル自体の問題もあるかもしれませんね…
今度、教授に聞いてみます!
返信ありがとうございます!
このような、友達のプログラミングと意味合いがほぼ同じなのに答えが違うなどの症状が多々出てたので、もしかしたらコンパイル自体の問題もあるかもしれませんね…
今度、教授に聞いてみます!
Re: 分からないです!至急アドバイスお願いします!
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。