二分法求一元函數(shù)的根--北太天元學(xué)習(xí)12
二分法求一元函數(shù)的根--北太天元學(xué)習(xí)12
我們看到很多函數(shù)具有這樣的性質(zhì): 如果存在f(a) 和 f(b) 異號,那么在
a 和 b 之間存在 x , 使得 f(x) = 0 .

我們可以用下面的被稱為二分法的方法求得 x 的近似值。
在第一步中,我們選擇a和b的中點,稱之為c。
如果 f(a) 和 f(c) 異號,那么我們用點a和c重復(fù)這個過程,
, 如果 f(c)和f(b) 異號,那么用點c和b 重復(fù)這個過程。? ?
可以想象,在重復(fù)充分多的次數(shù)后,f的根就被確定在了一個足夠小的區(qū)間內(nèi),
取這個區(qū)間的中點就是f(x)的一個足夠好的近似根了。
我們還使用北太天元學(xué)習(xí)11中的例子, 求 f(x) = x^3-5x-2 的一個近似根.
clf
close all
clear all
a= -0.6;
b = -0.2;
tol=1e-4;%設(shè)定忍量
n=1;%設(shè)置索引
x(1) = (a+b)/2;
while abs(a-b)> 1e-4;%應(yīng)用二分法, 等到區(qū)間長度小于或者等于給定忍量跳出循環(huán)
?? ?if sign( f(x(n)) ) * sign( b ) < 0
?? ??? ?a = x(n);
?? ?else
?? ??? ?b = x(n);
?? ?end
?? ?n = n + 1; ;%更新索引
?? ?x(n) = (a+b)/2;
end
x(end) %輸出迭代的最后一個x點
%畫出迭代過程
hold on
plot(0:length(x)-1,x, 'r-', 'LineWidth', 3);
sh = scatter(0:length(x)-1, x, 'filled');
set(sh, 'SizeData', 500)
title(['二分法迭代 x(end) = ', num2str(x(end))]);
hold off
%定義一個子函數(shù)
function y = f(x)
?? ?y = x.^3 -5*x -2;
end

我們?nèi)绻胫赜枚址ǖ拇a,最好還是把上面的二分法的腳本寫成一個函數(shù)。
今天,我們介紹使用函數(shù)句柄作為m函數(shù)的輸入?yún)?shù)
% 二分法求 fh(x) =0 的解 ,
% 在實數(shù)范圍內(nèi)求解,
% fh: 實值函數(shù)的句柄
% x0, x1: 求解的范圍[x0,x1]
% ep: 誤差
% Nm: 最大的二分次數(shù)
function sol = bisectionEx1(fh, x0, x1, ep, Nm)
while (sign( fh(x1) ) *? sign( fh(x0) ) > 0)
?? ?fprintf('猜的初始范圍不對\n');
?? ?x0 = input ('請輸入x0:') ;
?? ?x1 = input ('請輸入x1:\n');
end
xlist = zeros(Nm,1);
xlist (1) = x0;
for i = 2 : Nm
?? ?barx = (x1 + x0) / 2;
?? ?if sign( fh(barx)? ) * sign( fh(x1) ) < 0
?? ??? ?x0 = barx;
?? ?else
?? ??? ?x1 = barx;
?? ?end
?? ?xlist (i) = barx;
?? ?if (abs(xlist(i) - xlist (i-1)) < ep)
?? ??? ?break
??? ?end
end
outStr = ['二分法求得根是', num2str(barx), '']
?? ?subplot(1,2,1)
?? ?sh = scatter(xlist(1:i),log( abs(? fh(xlist(1:i)) ) ) ,'filled');
?? ?set(sh, 'SizeData', 500);
?? ?for k= 1:i/2
?? ??? ?text(xlist(k), log(abs(fh(xlist(k)))), num2str(k),'FontSize',24);
?? ?end
?? ?xlabel('x'); ylabel('log( abs(? f(x) ) )')
?? ?subplot(1,2,2)
?? ?plot(1:i, xlist(1:i),'r-*','LineWidth', 3);
?? ?xlabel('迭代次數(shù):i'); ylabel('第i次迭代后得到的x')
?? ?title(['經(jīng)過', num2str(i), '次二分得到的根是', num2str(xlist(i))])
end

知識點小結(jié):
text:? 把字符串寫在圖中的某個位置
sign:? 符號函數(shù)
子函數(shù)? function?? 放在腳本代碼的后面
函數(shù)句柄??? fh = @(t) t.^2 - 1 ;? gh = @sin ;? gh = @test_bi_f; % best_bi_f 是一個m函數(shù)
函數(shù)句柄作為m函數(shù)的輸入?yún)?shù)
subplot(m,n,k)? mxn子圖, k