二分反復法は方程式の0根のプログラムの実現を求めます——c——新しい人文

5027 ワード

f(x)が区間[a,b]で連続し、かつf(a)*f(b)<0である場合、連続関数の性質からf(x)=0が[a,b]で少なくとも1本であることが分かる.f(x)が区間[a,b]で単調であれば、f(x)=0が[a,b]で唯一の本であることがわかる.
flagが正小数であると仮定し、f(x)=0方程式のルートを二分反復法で求める簡単な考え方は以下の通りである:(1)区間[a,b]の中点m=(a+b)/2を計算し、mの絶対値がflagより小さい場合、mをこの方程式のゼロルートと近似することができる.f(m)の絶対値がflagより大きい場合、(2)(2)f(b)*f(m)>0を実行すると、b=mとなる.そうでなければf(b)*f(m)<0であればa=mとなる.実行を続行(1)
注:同じ理屈でf(a)をf(a)*f(m)>0と比較すると、a=mとなります.そうでなければf(a)*f(m)<0,b=m
以下は2 x 3-4 x 2+3*x-6=0のソースコードを二分法で求める
#include
#include

double f( double x )
{
	return 2*x*x*x-4*x*x+3*x-6;
}
int main( void )
{
	double flag=1E-6;	
	double x1=-10,x2=10,m,result;  //x1 x2     
	m=(x1+x2)/2;
	
	while( fabs( f( m ) )>=flag ){
 	if( f( x2 )*f( m )>0 ){
 		x2=m;
  	}else{
  		x1=m;
  	}
  	m=(x1+x2)/2;
  	}
  	result=m;
 	printf("      %f
"
,result); return 0; }

コードの中のflagは実は精度で、ここの精度は1 E-6で、つまり10のマイナス6回です.ここの精度は必要に応じて自分で調整できます.
もし皆さんが間違ったところを見たら、コメントの中で指摘してほしいです.ありがとうございます.