1. 程式人生 > 實用技巧 >C語言實現二分法(方程近似解)

C語言實現二分法(方程近似解)

一、二分法

假設有這樣一個函式f(x)

函式與x軸有一個交點(也就是f(a)*f(b)<0,a<b),現在我們要求這個點的x值,也就是方程f(x)=0的一個實根

直接解顯然不合適,那麼接下來就輪到二分法出場了。

從圖中可以看出4<x<5,我們把[4,5]稱為這個根的一個隔離區間(記作[a,b]),你可以把它想象成一個夾板,把我們要求的數(記作ξ)夾在中間,

那麼我們只需要不斷縮小夾板間的距離就能求出較為精確的ξ值了。

首先,我們取隔離區間的中點(a+b)/2

如圖,令e=(a+b)/2,如果f(e)=0,那麼e就是我們要找的ξ值,如果f(e)和f(a)同號,那麼說明這兩點都在ξ的同一邊,用e替換掉a,

同理,如果f(e)和f(b)同號,用e替換掉b,這樣就實現了對ξ的不斷逼近,迴圈n次後誤差小於(1/(2^n))*(b-a)。

二、程式碼實現

廢話不多說,直接上程式碼

 1 double dichotomy(int n, double a, double b, double (*f)(double))
 2 {
 3     double f_a = (*f)(a);
 4     double f_b = (*f)(b);
 5     int i = 0;
 6     while (1)
 7     {
 8         double e = (a + b) / 2.0;
 9
if (i != n) 10 { 11 double f_e = (*f)(e); 12 if (f_e == 0) 13 { 14 return e; 15 } 16 else 17 { 18 if (f_a * f_e > 0) 19 { 20 a = e; 21 }
22 else 23 { 24 b = e; 25 } 26 27 } 28 ++i; 29 } 30 else 31 { 32 return e; 33 } 34 35 } 36 }

二分法的一個例子就是計算根號二(1.4142135623730951),也就是解x^2 - 2 = 0這個方程,程式碼如下

執行效果:

當然,你可以把dichotomy的int n換成long long int n,然後輸入一個超大的數,就可以獲得更加精確的根號二。