二分反復法は方程式の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のソースコードを二分法で求める
コードの中のflagは実は精度で、ここの精度は1 E-6で、つまり10のマイナス6回です.ここの精度は必要に応じて自分で調整できます.
もし皆さんが間違ったところを見たら、コメントの中で指摘してほしいです.ありがとうございます.
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回です.ここの精度は必要に応じて自分で調整できます.
もし皆さんが間違ったところを見たら、コメントの中で指摘してほしいです.ありがとうございます.