1. 程式人生 > >matlab二分法,單點弦截法,牛頓切線迭代法

matlab二分法,單點弦截法,牛頓切線迭代法

二分法

%p222task2_3
%二分法求[email protected](x)1-x-sin(x)零點
clc,clear;
[email protected](x)1-x-sin(x)
b=1;a=0;
f(0)
f(1)
ezplot(f,[0,1])
hold on
ezplot(@(x)0,[0,1])

while b-a>0.0001
    m=(a+b)/2;
    if f(m)==0
        break;
    end
    if f(a)*f(m)>0
        a=m;
    else
        b=m;
    end
end
m

單點弦截法

單點弦截法適用於導數值計算較為困難,且f(x)在區間(a,b)內凹向不變的函式。

%p228task3_2
%單點弦截法求x^2+x-3=0近似解
clc,clear
[email protected](x)x^2+x-3
ezplot(f,[-3,2])
grid%畫出網格線
%根在[-2.5,2],[1,1.5]之間
a=-2.5;
b=-2;

digits 8
while abs(f(a))>0.00001
    a=b-f(b)*(b-a)/(f(b)-f(a));
end
a

牛頓切線迭代法

牛頓切點迭代法的條件是:f(x)在閉區間[a,b]上有二階導數,f(a)*f(b)<0,且f’(x)與f”(x)在[a,b]上不變號。

%p228task4
%牛頓切線迭代法求x^2-2*x*exp(x)+exp(-x)=0的根
clc,clear
syms x;
[email protected](x)x^2-2*x*exp(x)+exp(-x)
d1f=diff(f(x))
d2f=diff(d1f)
% ezplot(@(x)0)
figure(1)
ezplot(f(x),[0,0.5])
grid
figure(2)
ezplot(d1f,[0,0.5])
grid
figure(3)
ezplot(d2f,[0,0.5])
grid
%作圖可知,一階導數、二階導數都小於0;符合牛頓切線弦截法的要求
%根在0.3到0.35之間
a=0.3; b=0.35 if subs(f,a)*subs(d2f,a)>0 x0=a; else x0=b; end dlt=1.0e-5;%設定精度 m=min(abs(subs(d1f,a)),abs(subs(d1f,b)));%m的作用就是使達到精度要求後停止迴圈 k=1; while abs(subs(f,x0))>m*dlt x1=x0-subs(f,x0)/subs(d1f,x0); x0=x1; fprintf('k=%d,x=%.7f\n',k,x0); k=k+1; end solve(f)

此處用到一個新知識,用subs求符號函式在某一點的函式值,
如:

>> f=@(x)x^2-2*x*exp(x)+exp(-x)

f =

  包含以下值的 function_handle:

    @(x)x^2-2*x*exp(x)+exp(-x)

>> subs(f,2)

ans =

exp(-2) - 4*exp(2) + 4

>> vpa(subs(f,2))

ans =

-25.420889112485988217027710347328

可見subs的用法:subs(f,x0)可求出在x0處的f的值,但對於sin,exp等函式,不會直接顯示近似數值,呼叫vpa函式即可令其顯示數值。