• ベストアンサー

二分法の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% (2126/6288)
回答No.5

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

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答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% (2126/6288)
回答No.3

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

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答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

  • 方程式を2分法を用いて解くプログラム

    学校で出されたCプログラムの課題で、1問だけどうしても出来ない問題があるんです。 「方程式 f(x) = x2 - 2 = 0 を 2 分法を用いて解くプログラムを作成せよ。ここで、方程式 f(x) = x2 - 2 は関数として定義せよ。上位の方から 4 桁目まで正しい値が出たらループを止めるようにする。」 というものなのですが、この「2分法」というやり方もよく分かりません。 プログラムの作成方法と併せて教えて頂けると幸いです。

  • ニュートン法で問題が途中までしか解けません

    ニュートン法で初期値:x1=π として0=sinx-x/2の解を求めます。 |x(i+1)-xi|=10^-3 のときに収束したとしてx(i+1)を解とするのですが まず f(xi)=sinxi-xi/2 f'(x)=cosxi-1/2 として x(i+1)=xi-f(xi)/f'(xi)として解いていったのですが x1=π x2=2.094395102 x3=1.913222955 ここまでは順調だったのですがx4で値が急に4を超えてしまってわからなくなってしまいました。x4はx(i+1)=xi-f(xi)/f'(xi)のxiにx3の値を入れただけなのですが何度計算してもうまくいきません。 どこか方法が間違っていたら指摘お願いします。

  • C言語プログラム(二分法)について質問です。

    C言語プログラム(二分法)について質問です。 以下作成したプログラムでは、aを入力すると, x=b - (log(a)) - (a+x)/2の解が求まります。(今回式は適当ですが。) 二分法で解を求めるというプログラムは作成できたのですが、 このプログラムで、aを1~10まで変化させたときのxの値というようなループをプログラムでしたうえで、 a*xの値がもっとも大い点を求めるためにはどのようなプログラムを組めば(これを改良すれば)いいのでしょうか? 具体的に行いたいことは、この二分法のプログラムをaとxの関数とし、a*xの最大点を求めたいのです。 質問が分かりにくいかもしれませんが、お願いします。 以下作成したプログラムです。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define eps 1.0e-6 double b=0.3; double a=0; double f(double x); void nibun(void); int main() { nibun(); return 0; } void nibun(void) { int count; double x0,x1,m; printf("aの値\n"); scanf("%lf",&a); count=0; x0=-2*b; x1=b; do { count++; m=(x0+x1)/2.0; if(f(m)*f(x0)<0) x1=m; else x0=m; if(count==700) { printf("Error\n"); exit(1); } } while (!(fabs(x0-x1)<eps)); printf("解の値は %f\n",m); } double f(double x) { return(b - (log(a)) - (a+x)/2); }

  • 二分法のプログラムについて

    下の用なプログラムを作ったのですがどうしても正しい答えを導くことができません。自分でもいろいろ調べてみましたがわかりません。誰かご教授宜しくお願いします。 #include<stdio.h> #include<stdlib.h> #define MAX 10 int n , count; double c[MAX+1]; double a,b,e; void nyuuryoku(void) { int i; printf("nの入力>"); scanf("%d",&n); if(n>MAX){printf("最大次数を超えている");exit(1);} else if(n<0){printf("nが負");exit(2);} else{for(i=0;i<=n;i++){printf("係数の値>");scanf("%lf",&c[i]);} }} double f(double x) {double y; int i; y = c[0]; for(i=1;i<=n;i++){ y=y*x+c[i];} return y; } void hani(void){ printf("aの値>");scanf("%lf",&a); printf("bの値>");scanf("%lf",&b); printf("eの値>");scanf("%lf",&e); if(e<=0){printf("eが0または負"); exit(3);} if(f(a)==0){printf("%f",f(a)); exit(4);} if(f(b)==0){printf("%f",f(b)); exit(5);} if(f(a)*f(b)>0){printf("初期値異常"); exit(6);}} double nibun(void) {double c; if(b>a){ while(b-a>e){ count++; c=(a+b)/2; if(f(c)==0){ return c;} if(f(a)*f(c)<0){b=c;} if(f(b)*f(c)<0){a=c;} } return a;} if(a>b){ while(a-b>e){ count++; c=(a+b)/2; if(f(c)==0){ return c;} if(f(b)*f(c)<0){a=c;} if(f(a)*f(c)<0){b=c;} } return a;} } void syutsuryoku(double x){ printf("x=%lf\n",x); printf("f(x)=%lf\n",f(x)); printf("繰り返し回数=%d\n",count); } int main(void){ double ans; count=0; nyuuryoku(); hani(); ans = nibun(); syutsuryoku(ans); }

  • C言語 二分法

    初投稿です。 お恥ずかしながらパソコンが苦手で、Cゲッが難しくてできません。 今回二分法です。 途中まではやったのですができません。 演習 0~1の乱数を12個発生させ,これらの平均をxi,yi とする。(s,tは乱数) xi=1/12(x1i+x2i+....x12i) yi=1/12(y1i+y2i+....y12i) このようなを1000個作り,(xi,yi)で散布図 を作りなさい。またx,yのそれぞれの平均を求 めよ。 この演習で #include<stdio.h> #include<stdlib.h> #include<math.h> #define eps 1.0e-5 float f(double x); void nibuin(void); int main () { int count; double a,b,m; count=0; printf("範囲の左の値を入力してください。\n"); scanf("%lf",&a); printf("範囲の右の値を入力してください。\n"); scanf("%lf",&a); if(count==1000){ printf("収束しませんでした。\n"); exit(1); } } while(!(fabs(a-b)<eps)); printf("解の値は%f\n収束するのに%d回かかりました。"m,count); } float f(double x) { reurn x*sin(x)+log(x); } まではできたのですが、 scanf("%lf",&a);とif(count==1000){の間に入る命令が打てません。 よろしくお願いします。

  • 二分法のプログラム

    関数x^3-7x^2-6x+2を二分法で解くプログラムを作ったのですが、エラーが出てコンパイルできません。訂正箇所を教えて下さい。 宜しくお願い致します。 #include<stdio.h> #include<math.h> #define EPSILON 0.1E-5 #define TURE 1 #define FALSE 0 int kansu(int x); void Nibunho(left,right,sol,flag); double left,right; int flag; int main(void) { printf("区間の左端と右端は?\n"); scanf("%lf %lf",&left,&right); flag=FALSE; Nibunho(left,right,&root,&flag); if(flag) printf("解 = %e (繰り返し回数 = %d)\n",root,k); else { printf("入力した範囲で解は求まりませんでした。\n"); printf("f(%e) = %e \n",root,k); } return 0; } int kansu(int x) { int f(double x) f(x)=x*x*x-7.0*x*x-6.0*x+2.0; return(f(x)); } void Nibunho(left,right,sol,flag) { double left,right,*sol; int *flag; double a,b,c,fa,fb,fc; k=0; a=left; b=right; do { k++; c=(a+b)/2.0; fc=f(c); fa=f(a); fb=f(b); if(fabs(fc)<1.0e-10) { a=c; b=c; *flag=TRUE; } else { if( (fa * fc < 0.0) || (fb * fc < 0.0) ) { *flag = TRUE; if( (fa*fc) < 0.0 ) b=c; else a=c; } else { if( fabs(fa) > fabs(fb) ) a=c; else b=c; } } } while((b-a)>EPSILON) *sol=(a+b)/2.0; }

  • 2分法で方程式の複数の解を自動的に求めるには?

    2分法を授業で習い、アルゴリズムは理解できました。 そして、2分法で方程式の解を求めるプログラムも完成したのですが、 3次方程式などの全ての解を2分法で求める場合、本来ならば、 グラフなどを描き、適切な初期値を自分で変更していく必要があると思います。 しかし、方程式の複数の解を自動的に求めたいのです。 もし、2分法で方程式の複数の解を自動的に求めるアルゴリズムがあれば教えていただけないでしょうか。 よろしくお願いします。 ※ 私が作成したプログラム(C言語)も載せておきます。 #include <stdio.h> #include <math.h> double f(double x) { return ((x-1.0)*(x-2.0)*(x-3.0)); } int main () { int i; double a,b,x; double gosa = 1.0e-14; printf("aの値を入力してください。\n"); scanf("%lf",&a); printf("bの値を入力してください。\n"); scanf("%lf",&b); if(f(a)*f(b) >0) printf("aとbの範囲の中に適切な解が存在しません。\n"); while(1){ x = (a+b)/2.0; printf("%.14f\n",x); if(fabs(b-a)<gosa) break; if(f(a)*f(x)<=0){ b = x; } else{ a = x; } } return(0); }

  • 数値計算法の二分法、ニュートン法のc言語プログラムについて

    y=x^2-2x+8について二分法、ニュートン法より範囲[0, 1.5]でy=0となるxの値を求めるプログラムってどうやればいいですか?

  • ニュートン法のプログラムの問題です。

    ニュートン法のプログラムを書き換える問題なのですが、考えたものを実行してみても上手く値が求められなかったので質問させてください。 ・問題 ニュートン法でbのn乗根を求めるプログラムです。 これを、bを与えたときx/(x^2+1)=bとなるxを求めるプログラムに書き換えなさい。 10 input "n,b";n,b 20 x=1 30 f=x^n-b 40 d1=n*x^(n-1) 50 x1=x-f/d1 60 e=1*10^(-6) 70 if abs(f)<e then goto 100 80 x=x1 85 print x 90 goto 30 100 end 考えたものとしては、 f(x) = x^n - b を f(x) = x/(x^2 + 1) - b に、 d1(x) = n*x^(n - 1) を d1(x) = 1/(x^2 + 1) - 2*x^2*/((x^2 + 1)^2)に 改変するという方法だったんですが… 考え方とどのように改変すればこの値が求められるのか、わかる方教えてください! ちょっと急ぎなのでできれば簡潔に書いていただけると助かります… よろしくお願いします!

  • Javaプログラムのフローチャートについて

    下に記述したのは4次のルンゲクッタ法のJavaによるプログラム例です。このプログラムの簡単なフローチャートを作成してプレゼンしたいのですが、作成した経験がなく、本等をみてもいまいちわかりません。どなたかご教授いただきたく、お願い申し上げます。 // 2階常微分方程式に対する Runge-Kutta 法による積分メソッド public void Runge_Kutta(double x[], double y[]){ double xi, vi, k1, k2, k3, k4, l1, l2, l3, l4; for(int i = 0; i < iMax-1; i++){ xi = x[i]; vi=y[i]; k1 = dt*vi; l1 = dt*fun(vi, xi); k2 = dt*(vi+0.5*l1); l2 = dt*fun(vi+0.5*l1, xi+0.5*k1); k3 = dt*(vi+0.5*l2); l3 = dt*fun(vi+0.5*l2, xi+0.5*k2); k4 = dt*(vi+l3); l4 = dt*fun(vi+l3, xi+k3); x[i+1] = xi+(k1+2.0*(k2+k3)+k4)/6.0; y[i+1] = vi+(l1+2.0*(l2+l3)+l4)/6.0; if(y[i] < ymin){ Max=i; break;} if(Math.abs(y[i+1]-y[i]) < diff && Math.abs(x[i+1]-x[i])< diff){Max=i; break;} } }

    • ベストアンサー
    • Java