• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:二分法の近似解について)

二分法で近似解を求める方法

このQ&Aのポイント
  • 二分法を使って方程式f(x)=0の近似解を求めるプログラムを作成するための問題です。
  • f(x)=x^2-aという方程式の解を求める問題で、aは正数とします。
  • 二分法では、区間内の両端の値を使って中点を求め、中点の値を更新しながら解に収束するまで繰り返します。

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

  • ベストアンサー
  • OKXavier
  • ベストアンサー率53% (135/254)
回答No.1

>これはaの平方根を小数点以下四桁まで求めろと解釈すれば >いいのですか? いいえ、違います。たまたまこのような簡単な関数を例にして (結果として、xがaの平方根になって)いるだけです。 区間[i,j]にあるf(x)=0の近似解を、逐次区間の幅を狭めながら、 求めようというものです。 basicプログラムのアルゴリズムを解読すれば、何を使用として いるか分かります。流れを図に書いて、よく考えてみましょう。 使用しているのは、 f(i)F(j)<0 ならば、f(x)=0 の解が、区間[i,j]に存在する。 ということです。 その後、区間の幅を1/2に狭めて、繰り返し調べることを行って います。

izayoi168
質問者

お礼

ありがとう御座います。 取りあえず、フローチャートを書いてみます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 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 以上です。 ご回答よろしくお願いいたします。

  • newton法での近似解の原理を教えてください!

    次の問題を教えてください!! 方程式 x^2+\exp(x)-\sin(x)-10=0 の近似解を newton 法で求める際,次の各項目の理由を newton 法の原理に基づいて説明せよ. * 初期値が 0 以下のとき,小さい方の近似解( x=-3.158・・・が求まる. * 初期値が 0 以上のとき,大きい方の近似解( x=1.9586・・・)が求まる. * 初期値が 0 のとき,近似解が求まらない.

  • プログラミング ニュートン法簡単な例の説明が欲しい

    これはニュートン法で√nを求めるプログラムですけど このプログラムを一行ずつ説明してもいいですか? DEF f(x)=x^2-a DEF g(x)=2*x ! g(x)=f'(x) PRINT "input" INPUT a LET x=a LET E=EPS(1)*10 <----これは何? DO  LET x1=x-f(x)/g(x)  PRINT x1   IF ABS((x1-x)/x)<E THEN EXIT DO  LET x=x1 LOOP END

  • 行列に関するプログラムについて

     『m×n 型行列Aの最大成分と最小成分を捜し、それぞれの行番号と列番号を出力するプログラムを作れ』という問題です。  以下のようにBACICで考えたのですが、うまく行番号と列番号を出力するプログラムを作れません。アドバイスいただければと思います。宜しくお願い致します。 100 INPUT m 110 INPUT n 120 DIM A(m,n) 130 MAT INPUT A 140 FOR i=1 TO m 150 FOR j=1 TO n-1 160 LET s=A(i,j) 170 LET t=A(i,j) 180 IF A(i,j)<A(i,j+1) THEN LET s=A(i,j+1) 190 IF A(i,j)>A(i,j+1) THEN LET t=A(i,j+1) 200 NEXT j 210 NEXT i 220 PRINT "最大成分は";s,"最小成分は";t

  • 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); }

  • 二分法について

    (1) f(x)=0の解aを内部に含む長さ1の区間から出発して、二分法で解の近似値を計算するとき、誤差が0.01以下になるようにするには、「中点におけるf(x)の値を求め、その符号を調べる」という計算を何回行う必要があるか。 (2)区間[1,2]から出発して、二分法でx^2-2=oの解√2の値を小数点以下第二桁まで正確に得るためには何回の計算が必要か。実際に縮小する区間列を計算によって求めることにより調べよ。 二分法の計算方法はわかるのですが(1)はとりかかり方がわからず、(2)は、縮小する区間列の計算がわかりません。 心優しい方、お助けねがいます。

  • 掃出法で連立一次方程式の解を求める

    掃出法で連立一次方程式の解を求めるプログラムを作ってみたのですが、ポインタと浮動小数点のエラーが出てしまい、実行できません。どこが間違っているのかさえ分からず困っています。訂正箇所を教えてください。宜しくお願い致します。 #include<stdio.h> #include<math.h> #include <float.h> #define N 3 #define EPSILON 1.0E-5 #define TRUE 1 #define FALSE 0 void sweep(int *flag); void swap(float *wk1,float *wk2); float a[N][N]={{ 2, 6, 3}, {-1, 5,-2}, {-2,-1, 6}}; float x[N],b[N]={6,3,14}; int flag; void main() { int i,j; for(i=0;i<N;i++) { for(j=0;j<N;j++) printf("%10.4f",a[i][j]); printf("%10.4f\n",b[i]); } flag=TRUE; sweep(&flag); if(flag==TRUE) { printf("連立方程式の解\n"); for(i=0;i=N;i++) printf("x[%d]=%10.4f\n",i+1,x[i]); } else printf("解なし\n"); } void swap(float *wk1,float *wk2) { float w; w=*wk1; *wk1=*wk2; *wk2=w; } void sweep(int *flag) { int i,j,k,ik; float ak,aik; for(k=0;k<N;k++) { ak=a[k][k]; if(fabs(ak)<=EPSILON) { ik=k+1; while((ik<N)&&(fabs(a[ik][k])<EPSILON)) ik++; if(ik<N) { for(j=k;j<N;j++) swap(&a[k][j],&a[ik][j]); swap(b[k],b[ik]); ak=a[k][k]; } else { printf("ピボットが零です\n"); *flag=FALSE; goto end; } } for(j=k;j<N;j++) a[k][j]=a[k][j]/ak; b[k]=b[k]/ak; for(i=0;i<N;i++) { if(i!=k) { aik=a[i][k]; for(j=k;j<N;j++) a[k][j]=a[i][j]-aik*a[k][j]; b[i]=b[i]-aik*b[k]; } } for(k=0;k<N;k++) x[k]=b[k]; end:; } }

  • BASICでモンテカルロ法

    モンテカルロ法で円周率の推定値を計算することを最近習ったのですが、定積分でもそれが可能なのを知り、どうやってプログラムを組めばいいのか分からず、困っています。 例えば、定積分∫[0→1]x^2dx=1/3~0.333([0→1]というのは、積分範囲です。)をモンテカルロ法で計算すると、どういうプログラムを組めばいいのでしょうか? わかる範囲で書いてみたのですが…積分の範囲をどうやってプログラミングすればいいのか、いまいち分かりませんでした。 教えていただけると、助かります。よろしくお願いします。 RANDOMIZE INPUT n SET WINDOW -0.1,1.1, -0.1,1.1 DRAW GRID SET POINT STYLE 1 LET sumin=0 FOR i=0 TO n LET x=RND LET y=RND SET POINT STYLE 2 IF y<x*x THEN SET POINT COLOR 4 LET sumin=sumin+1 END IF ! PRINT USING "(%.####, %.####)": x,y PLOT POINTS: x,y NEXT i PRINT 1*1*sumin/n END

  • fortarn 二分法

    プログラミング全くの初心者です fortarnを用いて二分法でf=x^2-2 の解を求めるプログラミングを作りたいのですがエラーがたくさんでます 学校の先生に聞いたりして途中まではできたのですが、結局よくわかりませんでした いろいろ間違っているところがあると思いますが、特によくわからないのは、f1*f2が0以上になるときどうすればよいか、範囲の再設定をどうすればよいか、です。 以下、途中までのプログラムです。 このプログラムが完成したものを知りたいです。 少し説明も付けてくださると助かります。 program main parameter(errmax=1.0d-10) parameter(nmax=100) real*8 x0,x1,x2 real*8 f0,f1,f2 real*8 err integer n,i *initial range x0:x1 x0=0.0D0 x1=2.0D0 f0=(x0)^2-2 f1=(x1)^2-2 if(f0*f1>0)then endif err=abs(x1-x0) do n-1,nmax x2=(x0+x1)/2 f2=x2^2-2 if(f0*f2<0)then x1=x2*2-x0 else if(f1*f2<0)then x0=x2*2-x1 else if(f2=0) write(*) x2 err=abs(x1-x0) if(err>f0)then stop'Ended with success' end if end do write(*,*)x0,f0 write(*,*)x1,f1 write(*,*)'Error: not converged' end

  • プログラムの意味がわからなくて困っています

    こんにちは。以下のプログラムの意味がわからなくて困っています。分数q/p(p、qはともに正の整数)に関係するもので、3/13を入力したときの出力と、配列R()がどんな変化をしていくかを教えてください。 100 option base 0 110 dim A(1000) 120 dim R(999) 130 let N=1000 140 for I=0 to N-1 150 let R(I)=0 160 Next I 170 do 180 print"分母p="; 190 input P 200 if (P>N) then 210 print"分母は1000以下にしてください” 220 end if 230 loop while(P>N) 240 print"分子q="; 250 input Q 260 let A(0)=int(Q/P) 270 let Q=mod(Q,P) 280 let K=0 290 Do 300 let K=K+1 310 let R(Q)=K 320 let Q=Q*10 330 let A(K)=int(Q/P) 340 let Q=mod(Q,P) 350 loop while (R(Q)=0) 360 print A(0);"."; 370 for I=1 to R(Q)-1 380 print A(I); 390 next I 400 if (R(Q)<K) or (A(K)<>0) then 410 print "{"; 420 for I=R(Q) to K 430 print A(I); 440 next I 450 print"}"; 460 end if 470 end 100から160までで配列Aを1000個、配列Rを999個準備し、配列Rの中身を0にしている。 170から230で分母Pに13を入れ分母が1000以下になることを確認している。1000以上であれば、1000以下になるまでループ内を繰り返す。 240以下で分子を入れているようですが、ここからよくわからなくなってしまいました。 よろしくお願いします。