1. 程式人生 > >C程式設計案例(二分法求方程的根)

C程式設計案例(二分法求方程的根)

原理

設函式f(x)在[a,b]上連續,且f(a)*f(b)<0,則表明f(x)在[a,b]上至少有一個零點。
微積分中的介值定理。然後通過二分割槽間,縮小區間範圍,當小到一定的精確度的時候,這個x就是我們所求的近似根了。

問題描述:

用二分法求下面方程在區間(a,b)之間的根:
2 x 3

4 x 2 + 3 x
6 = 0 2x^3-4x^2+3x-6=0

問題分析:

1. 區間端點a, b由使用者輸入(確保輸入區間內有根)。
2. 計算至誤差小於10-6

為止。
3. 程式中,浮點型資料應定義為雙精度double型別。

二分法求方程根的步驟如下:

先將方程寫成 f(x)=0 的形式,再按照如下步驟計算:
  1. 求出給出的兩個端點之間的值 f ( x f(x 1), f x f(x 2)。
    f x f(x 1)* f x f(x 2)<0,則表明 x x 1 x x 2 之間必存在一根;
    否則可能不存在根,則一直提示輸出 x x 1 x x 2 .(這也是 二分法的侷限性)
  2. 一旦 f x f(x 1)* f x f(x 2)<0,就表明在 x x 1 x x 2之間有根,繼續判斷,求的 x x 1 x x 2的中點值 x 0 x_0 ,求出 f x f(x 0).
  3. 在判斷 f x f(x 0)* f x f(x 1)>0,則在 x 0 x_0 x 2 x_2 中間去找根,此時 x 1 x_1 不起作用,用 x 0 x_0 代替 x 1 x_1 ,用 f ( x 0 ) f(x_0) 代替 f ( x 1 ) f(x_1) .
    要麼就在 x 0 x_0 x 1 x_1 中去找根,此時 x 2 x_2 不起作用,用 x 0 x_0 代替 x 2 x_2 ,用 f ( x 0 ) f(x_0) 代替 f ( x 2 ) f(x_2) .

程式碼實現:

#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;
}

執行效果

在這裡插入圖片描述

參考文章

  1. https://blog.csdn.net/BBHHTT/article/details/75449031
  2. https://blog.csdn.net/Chen_dSir/article/details/70243602
  3. https://blog.csdn.net/jiezou007/article/details/7987922