• ベストアンサー

二分法のprogram

連続するf(x)において f(xi)<0,f(xii)>0の場合、xi < x < xii の範囲で少なくとも 1つf(x)=0を満たすようなxを求めたいのですが… f(i)とf(ii)はどのように求めたらよいのでしょう? 許容範囲eは適当です どのようにしてプログラムを作成したらいいのか 色々二分法について調べていますが、難しくて理解できません… 何方か詳しければ教えてください お願いします

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

  • ベストアンサー
回答No.6

#include <stdio.h> #include <math.h> double bm(double xi, double xii, double eps); double f(double x); int main(void) { double xi, xii, eps; printf("左端 α = "); scanf("%lf", &xi); printf("右端 β = "); scanf("%lf", &xii); printf("許容精度 ε = "); scanf("%lf", &eps); printf("方程式の解 : m = %9.6f\n", bm(xi, xii, eps)); return 0; } double bm(double xi, double xii, double eps) { double m = (xi + xii) / 2.0; if (f(xi) * f(xii) > 0.0) { printf("Error!"); } else if (fabs(xi - xii) < eps) { return xi; } else if (f(xi) * f(m) > 0.0) { return bm(m, xii, eps); } else { return bm(xi, m, eps); } } double f(double x) { return cos(x) - x; }

その他の回答 (5)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.5

>これであっているのでしょうか? 合っているかどうか、まずはご自分で確認してください。 >c = (a + b)/2 >で最初aはマイナスなので、ちゃんとaからbの間の中間点を求められていないと思う aが最初マイナスである理由は何ですか?別にゼロでもプラスでもいいのではありませんか? また、初期値の符号が何であろうが、この式でaとbの中点が求まることをよく理解してください。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.4

#1さんの回答にある >f(a)f(c)<0であればa<x<cに,そうでないときはc≦x<bに解があるということです。 これをそのままコード化すればいいです。

popuraman2
質問者

お礼

直してみました これであっているのでしょうか? c = (a + b)/2 で最初aはマイナスなので、ちゃんとaからbの間の中間点を求められていないと思うのですが、サイトにはこう書いてあったのであっているのか分かりません #include <stdio.h> #include <math.h> int main() { int i, maxitr = 100; double alpha, beta, a, b, c, eps; double fa, fb, fc; double f(double); printf(" 左端α, 右端β, 精度ε="); scanf("%lf %lf %lf", &alpha, &beta, &eps); a = alpha; b = beta;; fa = f(a); fb = f(b); if (fa * fb > 0.0) { printf(" f(α) f(β) > 0 なので終了\n"); return 0; } else { for (i = 0; i < maxitr; i++){ c = (a + b) / 2; printf("(%lf + %lf)/2 = %lf\n", a, b, c); fc = f(c); if (fc == 0.0){ printf("fc = %lf\n", fc); break;} else if (fa * fc <= 0.0) { b = c; fb = fc; } else { a = c; fa = fc; } printf("f(%20.16f)=%9.2e, f(%20.16f)=%9.2e\n", a, fa, b, fb); if ((b - a) <= eps) break; } printf("fc(%20.16f)=%9.2e\n", c, fc); } return 0; } double f(double x) { return cos(x) - x; }

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

>else if(fxii * fm >= 0){ このif文は正しいでしょうか?

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

>それにf(xi)とf(xii)をプログラムでどう求めたらいいのかさっぱりです 例えば、今回はどういう方程式の解を求めようとしていますか? >最終的にどこで終了すればいいのかもよく分かりません… xi と xii がだんだん同じになっていこうとする、というのはわかりますか? 両者の差が、あらかじめ決めておいた値以下(あるいは未満)になれば、 そのときの xi あるいは xii を、その方程式の解とします。

popuraman2
質問者

お礼

ありがとうございます 一応作ってみたのですが ちゃんと動いてくれません; どこが間違っているのでしょうかぁ? #include <stdio.h> #include <math.h> int main() { int i; double xi, xii, m, e; double fxi, fxii, fm; double f(double); printf("左a, 右b:"); scanf("%lf %lf", &xi, &xii); printf("許容精度 = "); scanf("%lf", &e); fxi = f(xi); fxii = f(xii); if(fxi * fxii > 0){ puts("end"); return 0; } while(1){ m = (xi + xii) / 2; fm = f(m); if(f(m) == 0){ break; } else if(fxi * fm <= 0){ xii = m; fxii = fm; } else if(fxii * fm >= 0){ xi = m; fxi = fm; } printf("f(%lf) = %e, f(%lf) = %e\n", xi, fxi, xii, fxii); if((xii-xi) <= e) break; } puts("\n"); printf(":f(%lf) = %e\n", m, fm); return 0; } double f(double x) { return cos(x) - x; }

  • masa072
  • ベストアンサー率37% (197/530)
回答No.1

アルゴリズムはわかりますか? それさえわかればあとはその通りにプログラミングするだけです。 二分法は,f(a)f(b)<0のとき,c=(a+b)/2とすれば,f(a)f(c)<0であればa<x<cに,そうでないときはc≦x<bに解があるということです。 それを何度も繰り返してあるところまできたら終わりにすればいいのです。

popuraman2
質問者

お礼

ありがとうございます アルゴリズムはイマイチ理解できていません それにf(xi)とf(xii)をプログラムでどう求めたらいいのかさっぱりです 最終的にどこで終了すればいいのかもよく分かりません… 高校生には難しいです…

関連するQ&A