解方程——對分法

對分法的理論依據是:設f是區間[a,b]上得連續函數,知足f(a)f(b)<0,那麼f在a和b之間有一個根r,使得f(r) = 0算法

算法分析:函數

1.首先肯定r在(a,b)區間內spa

2.令c0 = (a0 + b0)/2code

if f(c0)f(a0) < 0blog

b1 = c0; a1 = a0io

else function

a1 = c0; b1 = b0class

3.以此類推 error

matlab代碼實現:di

%代碼運行前先要創建一個內聯函數,好比f=inline('x^3 + x - 1')
function xc = bisect(f,a,b,tol)
if sign(f(a))*sign(f(b)) >= 0
    error('f(a)f(b)<0 not satisfied!')
end

fa = f(a);
fb = f(b);
k = 0;
while (b - a)/2 > tol %這裏的tol是指求根時要求的精度
    c = (a + b)/2;
    fc = f(c);
    if fc ==0
        break
    end
    if sign(fc)*sign(fa) < 0
        b = c;
        fb = fc;
    else
        a = c;
        fa = fc;
    end
end

xc = (a + b)/2

算法的精度:

設[a0,b0]爲初始區間,

第一次對分後變爲[a1,b1],長度變爲(b0 - a0)/2

第一次對分後變爲[a2,b2],長度變爲(b0 - a0)/2^2

... ...

第n次對分後變爲[an,bn],長度變爲(b0 - a0)/2^n

咱們取xc = (an + bn)/2 爲根的近似,

則偏差爲:|xc - r| < (b0 - a0)/2^(n+1)

 

咱們定義:若是偏差小於0.5x10^(-p),那麼解精確到P位小數

這樣一來,咱們就能夠根據所要求的解的精確度來肯定須要對分的次數n了。

例子:在區間[0,1]上求f(x)=cosx - x的根,精確到6位小數

根據偏差公式:(1-0)/2^(n+1) < 0.5*10^(-6)

能夠求得 n >= 19.9

也就是說至少要對分20次才能達到所要求的精度。

相關文章
相關標籤/搜索