C程式設計案例(二分法求方程的根)
阿新 • • 發佈:2018-12-05
原理
設函式f(x)在[a,b]上連續,且f(a)*f(b)<0,則表明f(x)在[a,b]上至少有一個零點。
微積分中的介值定理。然後通過二分割槽間,縮小區間範圍,當小到一定的精確度的時候,這個x就是我們所求的近似根了。
問題描述:
用二分法求下面方程在區間(a,b)之間的根:
問題分析:
1. 區間端點a, b由使用者輸入(確保輸入區間內有根)。
2. 計算至誤差小於10-6 為止。
3. 程式中,浮點型資料應定義為雙精度double型別。
二分法求方程根的步驟如下:
先將方程寫成 f(x)=0 的形式,再按照如下步驟計算:- 求出給出的兩個端點之間的值
1),
2)。
當 1)* 2)<0,則表明 1 和 2 之間必存在一根;
否則可能不存在根,則一直提示輸出 1 和 2 .(這也是 二分法的侷限性) - 一旦 1)* 2)<0,就表明在 1和 2之間有根,繼續判斷,求的 1和 2的中點值 ,求出 0).
- 在判斷
0)*
1)>0,則在
和
中間去找根,此時
不起作用,用
代替
,用
代替
.
要麼就在 和 中去找根,此時 不起作用,用 代替 ,用 代替 .
程式碼實現:
#include<stdio.h>
#include<math.h>
double f(double x);
const double eps = 1e-6; //定義我們計算的精度
int main()
{
double x0,x1=0,x2=0,fx0;//[x1,x2]為尋找區間,x0為中點,浮點型資料
scanf("%lf %lf",&x1, &x2);
if(f(x1)*f(x2)<0)
{
while(fabs(x2-x1)>eps)
{
x0=(x1+x2)/2.0;//取x1,x2的中點
fx0=f(x0);
if(fabs(fx0)<eps)//滿足精確度
break;
else if(f(x0)*f(x1)<0)
{
x2=x0; //修正區間,將[x1,x2]換成[x1,x0],這裡的x0是中點
}
else if(f(x0)*f(x2)<0)
{
x1=x0;//修正區間,將[x1,x2]換成[x0,x2],這裡的x0是中點
}
}
}
else{
//可以放入其他求方程的根的方法
}
printf("最終縮小到區間:%lf %lf",x1,x2);
x0=(x1+x2)/2;
printf("\n該方程組的近似根為:x*=%lf\n",x0);
return 0;
}
double f(double x) //定義函式(方程)
{
return 2*x*x*x-4*x*x+3*x-6;
}