C語言實現二分法(方程近似解)
阿新 • • 發佈:2020-08-05
一、二分法
假設有這樣一個函式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; 9if (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,然後輸入一個超大的數,就可以獲得更加精確的根號二。