• ベストアンサー

C言語の二分法のプログラムについて

二分法によりルート2の近似値を求めるプログラム、ってどうやって作ったらいいんですか? ちなみに初期値は2で、収束条件は10^-5です。 収束までの回数も求めなきゃいけません(ニュートン法と比較するため。ちなみにニュートン法はできました。) 似たような質問を見つけたのですが、どれも、難しいプログラムばかりで解読ができません。 関数とかif else文とかwhile文とかfor文とか、そういう簡単なのしか習ってないので、それで作れる範囲で教えてくださる方、 いらっしゃいましたら、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#119918
noname#119918
回答No.4

これでどうでしょう。 if文判定、及びwhile文判定を修正しました。 #include <stdio.h> #include <math.h> #define f(x)(x*x-2.0) int main(void) { int i=0; double m,x1=2.0,x2=1.0,eps=1.0e-5; do{ ++i; m=(x1+x2)/2; if (f(m)>0) { x1 = m; } else { x2 = m; } } while (fabs(x1-x2)>eps); printf("%f,%d\n",m,i); return 0; }

Shauetsu
質問者

お礼

うわー、すごい!! できました!!本当にありがとうございます!!

その他の回答 (3)

noname#119918
noname#119918
回答No.3

手抜きですが、こんな感じですか… #include <stdio.h> /* sqrt(2.0) を二分探索法で求める left 探索範囲左限界 right 探索範囲右限界 conv_cond 収束条件 */ void solve(double left , double right , double conv_cond) { int count; /*試行回数*/ double center; /*中間値*/ for(count=0 ; ; count++) { center = (left + right) / 2.0; /*収束条件を満たしたか*/ if((center - left < conv_cond) && (right - center < conv_cond)) break; /*解は中間値よりも大きいか小さいか*/ if(center*center - 2 < 0) { left = center; } else { right = center; } } printf("%d %f\n" , count , center); } int main(void) { solve(0 , 2 , 1.0e-5); return 0; }

Shauetsu
質問者

お礼

ありがとうございました。 実行するとうまくいきました。 ちなみに、自力で作ってみました。 #include <stdio.h> #include <math.h> #define f(x)(x*x-2.0) main() { int i=0; double m,x1=2.0,x2=1.0,eps=1e-5; do{ ++i; m=(x1+x2)/2; if (f(m)*x1>0){ m=x1; } else m=x2; } while (fabs(x1-x2)<eps); printf("%f,%d\n",m,i); } これを実行すると、2.000000,1と出ます。 私はこの程度のプログラムしか習ってません。 つまり、ANo.3の方のプログラムだと、解読できないです。 もしよろしければ、自力でやったプログラムに訂正箇所があればお願いします。 ANO.1の方とお礼がかぶってしまい、申し訳ございません。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★リンクの紹介。 >二分法によりルート2の近似値を求めるプログラム、ってどうやって作ったらいいんですか?  ↑  次のリンクの『32ビットの整数の場合でループを展開したもの』をご覧下さい。  http://ayusya.hp.infoseek.co.jp/ProgramAlgorithm.html#Sqrt  これがアルゴリズムです。  実際に組むときはループ処理をさせれば良いです。  なお、この考え方は数値表現に2進数が使われている事に着目して 8192、4096、2048、1024…と  二分法で平方根を求めているのです。 >ちなみに初期値は2で、収束条件は10^-5です。  ↑  double 型を使うなら初期値の 2、4、8、16、32、…と徐々に大きくしていきチェックします。  次のリンクも参考にしてみて下さい。  http://kyutechzemi.hp.infoseek.co.jp/0013/jp0000.html→『平方根を二分法で計算する。』  ソースもダウンロードできるようです。  このソースでは10^(-4)乗が収束条件のようです。 ・以上。

参考URL:
http://kyutechzemi.hp.infoseek.co.jp/0013/jp0000.html
Shauetsu
質問者

お礼

ありがとうございました。 そうですか。。。 ちなみに、自力で作ってみました。 #include <stdio.h> #include <math.h> #define f(x)(x*x-2.0) main() { int i=0; double m,x1=2.0,x2=1.0,eps=1e-5; do{ ++i; m=(x1+x2)/2; if (f(m)*x1>0){ m=x1; } else m=x2; } while (fabs(x1-x2)<eps); printf("%f,%d\n",m,i); } これを実行すると、2.000000,1と出ます。 訂正箇所があればお願いします。 ANO.1の方とお礼がかぶってしまい申し訳ありません。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>関数とかif else文とかwhile文とかfor文とか、そういう簡単なのしか習ってないので その程度の範囲で書けるはずです。ニュートン法より易しいと思うのですが。

Shauetsu
質問者

お礼

そうですか。。。 ちなみに、自力で作ってみました。 #include <stdio.h> #include <math.h> #define f(x)(x*x-2.0) main() { int i=0; double m,x1=2.0,x2=1.0,eps=1e-5; do{ ++i; m=(x1+x2)/2; if (f(m)*x1>0){ m=x1; } else m=x2; } while (fabs(x1-x2)<eps); printf("%f,%d\n",m,i); } これを実行すると、2.000000,1と出ます。 訂正箇所があればお願いします。

関連するQ&A

  • C言語のプログラムについて

    C言語のプログラムについて 3桁の自然数の中で、自分自身を含めた約数が奇数になるものがいくつあるかを求めるプログラムを作りたいのですが、swich文を使って、6通りの方法で出そうとしていまして、 while 文、 for文、 do while文に加え、 for文のを、1つの関数として独立させたもの、 さらに、for文のを重ループ部分のそれぞれのループに対応して、2つの関数として独立させたもの、 そして、この2つの関数のどちらともをループを用いずに再帰呼び出しを用いたもの の6通りで出したいのですが、swich文を使うところは自力でできたのですが、あとの6つそれぞれのプログラムの組み方がわかりません。 教えていただけないでしょうか?ややこしい書き方をしてすいません・・・。

  • C++で二分法のプログラム

    C++で二分法のプログラムを作るんですが x1-x2が十分小さくなれば(10^-5)終了する 例 cos(x/2)の解を出す これどうやればいいんですか?whileを使うらしいですが。 文法というのは、 if系、while、switch、continue、for、break文くらいしかやってないんですが #include <iostream> #include <cmath> using namespace std; int main() { までは行きますが… 出力はcout 入力はcinでお願いできないでしょうか

  • C言語のプログラムについて

    下記は、何言語かわからないです。 これをC言語にするにはどうすればよいでしょうか。 プログラムは、「ニュートン法を用いて、方程式x^3(xの3乗)-4=0の近似解を求めるプログラム。ただし、実数解と、近似解の誤差は、0.0001以下とする。ここで、この方程式の導関数は、3x^2(3*xの二乗)である。」 100 DEF F(X)=X*X*X-4 110 DEF G(X)=3*X*X 120 INPUT PROMPT "初期値":A 130 LET B=A-F(A)/G(A) 140 IF ABS(A-B)<=.0001 THEN 170 150 LET A=B 160 GOTO 130 170 PRINT "近似解";B 180 END 以上です。 ご回答よろしくお願いいたします。

  • ニュートン法を使って解を求めるC言語プログラム

    C言語を使って y=x^2-4x のyの解をニュートン法を使って求める プログラムを作る課題を出されたんですが、ニュートン法が良く分かっていないので、いろいろ調べたり、人に聞いたりしたところ #include<stdio.h> #include<math.h> void main() { int counter=0; double an,g,f,sh=0.0001; printf("初期値を入力して下さい==>"); scanf("%ld",&an); do{ g=(an*an)/(2*an-4); f=2*an-4; counter++; }while(fabs(f)>sh); printf("反復回数 %d 回 y=%lf \n",counter,g); } でプログラムがこんな感じになったんですが、結局ニュートン法がどうなのかがわかりません。 なんか微分とかやるとか言われたんですが、工業系の学校で数学の授業が無いので微分についてがわかりません。 このプログラムは、コンパイルはできるんですが、動きません。 ニュートン法についてよくわからないのでどこが間違ってるかわかりません。 ニュートン法についてできるだけ分かりやすく解説してほしいです。

  • c言語の二分法、はさみうち法、NR法のプログラミングについて

    1/x=tanxの数値解を終了条件が|1/x-tanx|<1×10の-11乗で二分法、はさみうち法、NR法で解かなければならないのですが、プログラミングの知識がほとんどないためわかりません。学校でif文、 for文、 if else文を習った程度ですので、その範囲で教えてくださる方がいらっしゃいましたらよろしくお願いします。

  • 線形探索(番兵法)のプログラムについて。

    線形探索(番兵法)のプログラムについて考えています。 メイン関数からsearch関数に値を渡してそこで探索させるのですが、 int search(int a[], int n, int key) { int i = 0; a[n] = key; while (1) { if (a[i] == key) break; i++; } return (i == n ? -1 : i); } のwhileを使ったやり方からfor文を使ったやり方に変更したいと思っています。 色々な方法でプログラムを考えてみたいので。 そうすると、なんかうまくいきません。 for文だとどのように考えたらいいのでしょうか?

  • ニュートン・ラフソン法

    ルートについて、ニュートン・ラフソン法で解き、何回繰り返せば値が収束できるか確認するプログラムを作成するって課題がでたんですが、どんなことをすればいいのでしょうか? ニュートン・ラフソン法について調べたのですが、いまいち何をしていいか分からなかったので教えてください。

  • ニュートン法の収束性について

    http://maya.phys.kyushu-u.ac.jp/~knomura/education/numerical-physics/text1/node5.html ニュートン法は2次収束すると習ったのですが これはどんな関数でも2次収束すると言って 良いのでしょうか? 実際にプログラムを組んでみて y=X^4+7X^3-27X^2+29X-10 の収束性について調べてみました。 この関数は1で重解をもつので初期点を3にして 試してみた所1次収束性は確認できたのですが 2次収束性は確認できませんでした。 これはプログラム上のミスでしょうか? それともニュートン法の2次収束性は全ての関数には いえないものなのでしょうか?

  • 流れ図からプログラムに直してください!【C言語】

    その流れ図をC言語のプログラムに直してくれませんか? 処理2はscanf(..);って感じの内容です。 入口 処理1 for(処理2; 判断; 処理4){ 処理3 } 出口 って感じかなって思ったんですが、for文の中にscanfの文を入れてもいいのかわからずに悩んでます。 ループ文なのでwhile文、for文、do..while文のどれかかな?って思ったんですが違う気もして、わかるかたいらっしゃいませんか?

  • 自然数の和のプログラム

    if-else文とwhile文とfor文と1次元配列、このすべての条件を使って自然数の和を求めるプログラムを作りたいんですけど、これらの条件全てを使ってプログラムを作ることができません。 よろしければ教えてください。