逆数のニュートンラフソン法について

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

逆数のニュートンラフソン法について

#1

投稿記事 by saigou » 8年前

逆数の計算をしているのですが、ニュートンラフソン法を用いるときに以下のプログラムにたどりついたのですが
整数を入力する際に20以上の数を入れると実行結果がおかしくなります
どこがへんでしょうか?

-------------------------------------------------------------------------
#include<stdio.h>
#include<math.h>
int main(void)
{

double x,a,b,c,sa;
int i;
const double EPS=0.0000000001;

printf("整数を入力してください:");
scanf("%lf", &x);

a =0.1;
sa=1;
printf("%fの逆数\n",x);
for(i=1;sa>=EPS;i++)
{

b=2*a-x*a*a;
sa=fabs(b-a);
a=b;

printf("%2d回目 %1.14f 誤差=%1.12f\n",i,b,sa);
}
printf("ループした回数%d\n",i);

return 0;
}
------------------------------------------------------------------------------------------
実行結果

整数を入力してください:5
5.000000の逆数
1回目 0.15950000000000 誤差=0.049500000000
2回目 0.19179875000000 誤差=0.032298750000
3回目 0.19966369749219 誤差=0.007864947492
4回目 0.19999943450312 誤差=0.000335737011
5回目 0.19999999999840 誤差=0.000000565495
6回目 0.20000000000000 誤差=0.000000000002

整数を入力してください:20
20.000000の逆数
1回目 -0.02200000000000 誤差=0.132000000000
2回目 -0.05368000000000 誤差=0.031680000000
3回目 -0.16499084800000 誤差=0.111310848000
4回目 -0.87442129447518 誤差=0.709430446475
5回目 -17.04109459358349 誤差=16.166673299108
6回目 -5842.06028813637931 誤差=5825.019193542796
7回目 -682605052.32497859001160 誤差=682599210.264690399170
8回目 -9318993150556944384.00000000000000 誤差=9318993149874339840.000000000000
9回目 -1736872666802545110342220546964287651840.00000000000000 誤差=1736872666802545110342220546964287651840.000000000000
10回目 -60334533213715703129327321135034777069335802622969353467058326752377474010578944.00000000000000 誤差=60334533213715703129327321135034777069335802622969353467058326752377474010578944.000000000000
11回目 -72805117962339265742559342162652732241978854702343864976185430697938208548253792650763038083901577746676911229143646541067405203284358016122116859982644097581056.00000000000000 誤差=72805117962339265742559342162652732241978854702343864976185430697938208548253792650763038083901577746676911229143646541067405203284358016122116859982644097581056.000000000000
12回目 -inf 誤差=inf
13回目 -inf 誤差=nan

non
記事: 1097
登録日時: 13年前

Re: 逆数のニュートンラフソン法について

#2

投稿記事 by non » 8年前

初期値は1/xより小さくないといけないんじゃないかな?f(x)=1/xは正の範囲と負の範囲は連続していないので。
non

saigou
記事: 21
登録日時: 8年前

Re: 逆数のニュートンラフソン法について

#3

投稿記事 by saigou » 8年前

non さんが書きました:初期値は1/xより小さくないといけないんじゃないかな?f(x)=1/xは正の範囲と負の範囲は連続していないので。

ソースコードでいうとどこがいけませんか?

non
記事: 1097
登録日時: 13年前

Re: 逆数のニュートンラフソン法について

#4

投稿記事 by non » 8年前

a=0.1 
です。
non

saigou
記事: 21
登録日時: 8年前

Re: 逆数のニュートンラフソン法について

#5

投稿記事 by saigou » 8年前

non さんが書きました:a=0.1 
です。
a=0.1をいろんな数でためしましたが結果が変わりませんでした。
どのようなソースコードにすればよいですか
.1;

アバター
usao
記事: 1887
登録日時: 11年前

Re: 逆数のニュートンラフソン法について

#6

投稿記事 by usao » 8年前

オフトピック
>実行結果

が,ずいぶんと変な精度(?) ですね.
x=20に対して初期値0.1の場合,1回目のbの計算結果が0になると思うのだけど…

saigou
記事: 21
登録日時: 8年前

Re: 逆数のニュートンラフソン法について

#7

投稿記事 by saigou » 8年前

ソースコードの何処がおかしいかわかりますか?

かずま

Re: 逆数のニュートンラフソン法について

#8

投稿記事 by かずま » 8年前

saigou さんが書きました:ソースコードの何処がおかしいかわかりますか?
わかりますが、その前に、最初のプログラムの printf(....); を
printf("%2d回目 %.20f 誤差=%.20f\n",i,b,sa); と変えて、もう一度、
入力が 5 の場合と、20の場合の結果を教えてもらえませんか?

閉鎖

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