区間$(a,b)$上の関数$f$の根を計算するために、二分法が使用されます。
関数$f=x^3-2$を例にして、区間$(0,3)$の中で$f(x)=0$の解の計算方法を説明します。
まず、$y=f(x)$のグラフを書いておきます。
注意:
function value=f(x)
value = x.^3-2;
end
function draw_f(a,b)
x=a:(b-a)/100:b;
y=f(x);
hold on
grid on
plot(x,y*0,'b-') % x軸を描く
plot(x,y,'r-') % y=f(x)のグラフを描く
p=(a+b)/2;
plot(p,f(p),'r+') % pにおける関数の値を描く
end
関数$f$のグラフを描く。
$a=0,b=3$にすると、$f(a)<0$, $f(b)>0$ が分かります。中間値の定理によって、$a$と$b$の間に$f(x)=0$の解が存在します。
a=0;
b=3;
draw_f(a,b)
$$ f(a)\cdot f(p)<0 $$
%f(a)とf(p)の符号を比較して、pの値を更新します。
p=(a+b)/2;
if f(a)*f(p) < 0
b = p;
else
a = p;
end
[a,b]
draw_f(a,b)
新しい$a=0,b=1.5$について、中点$p$で$f(p)<0$ が分かります。また、$f(b)>0$であるので、以下のことが分かる。
$$ f(a)\cdot f(p)>0 \quad \mbox{すなわち} \quad f(b)\cdot f(p)<0 $$
中間値の定理によって、$p$と$b$の間に$f(x)=0$の解が存在します。
この場合、$a$を$p$にすると、新しい$(a,b)$で解の計算を進むことができます。
%f(a)とf(p)の符号を比較して、pの値を更新します。
p = (a+b)/2;
if f(a)*f(p) < 0
b = p;
else
a = p;
end
[a,b]
draw_f(a,b)
上記の計算を繰り返してすると、解の存在範囲を小さくすることができます。$a$と$b$が十分近いであれば、$(a+b)/2$が$f(x)=0$の近似解となれます。
$|b-a|<0.02$まで、上記のコードを繰り返して計算してください。ただし、毎回の計算では、aを更新するか、bを更新するか、調整するのは必要です。
上記のコードをforループに書き直してください。
注意:
ループを終了するとき、breakを使用すること。すなわち、
for k=1:100
%ここで繰り返し計算のコードを書く。
if (b-a)< 0.02
break;
end
end
% 演習1のコードをここに書いてください。