ONLY DO WHAT ONLY YOU CAN DO

こけたら立ちなはれ 立ったら歩きなはれ

Pascal で非線形方程式を解く (2分法)

非線形方程式の解法(2分法)を利用して2の平方根を求める

f:id:fornext1119:20140531160605p:plain
1. まず, 条件 a < b, f(a) < 0, f(b) > 0 を満たす点 a, b を考えると,
関数 f(x) の解は, 区間 (a,b) の中に存在する.
2. 次に, 区間 (a,b) の中点 c = (a + b) / 2 を考えると,
f(c) < 0 であれば, 解は区間 (c,b) の中に存在し,
同様に, f(c) > 0 であれば, 区間 (a,c) の中に存在する.
3. この作業を繰り返して, 区間を絞り込んで行くことで解を求める.

※ちなみに, 区間 (a,b) とは, 両端を含まない数の集合で, 開区間という
 (a, b) = \{x | a < x < b\}
また, 両端を含む数の集合は, 閉区間という
 [a, b] = \{x | a ≤ x ≤ b\}

Program Pas0901(arg);
{$MODE delphi}

uses
    SysUtils, Math;

function f(x:Double):Double;
begin
    result := x * x - 2.0;
end;

var
    a:  Double = 1.0;
    b:  Double = 2.0;
    c:  Double;
    fc: Double;
begin
    while true do
    begin
        { 区間 (a, b) の中点 c = (a + b) / 2 }
        c := (a + b) / 2;
        writeln(format('%12.10f'#9'%13.10f', [c, c - sqrt(2)]));

        fc := f(c);
        If Abs(fc) < 0.0000000001 then break;
      
        if fc < 0 then
        begin
            { f(c) < 0 であれば, 解は区間 (c, b) の中に存在 }
            a := c;
        end
        else
        begin
            { f(c) > 0 であれば, 解は区間 (a, c) の中に存在 }
            b := c;
        end;
    end;
end.
1.5000000000	 0.0857864376
1.2500000000	-0.1642135624
1.3750000000	-0.0392135624
1.4375000000	 0.0232864376
1.4062500000	-0.0079635624
1.4218750000	 0.0076614376
1.4140625000	-0.0001510624
1.4179687500	 0.0037551876
1.4160156250	 0.0018020626
1.4150390625	 0.0008255001
1.4145507813	 0.0003372189
1.4143066406	 0.0000930783
1.4141845703	-0.0000289921
1.4142456055	 0.0000320431
1.4142150879	 0.0000015255
1.4141998291	-0.0000137333
1.4142074585	-0.0000061039
1.4142112732	-0.0000022892
1.4142131805	-0.0000003818
1.4142141342	 0.0000005718
1.4142136574	 0.0000000950
1.4142134190	-0.0000001434
1.4142135382	-0.0000000242
1.4142135978	 0.0000000354
1.4142135680	 0.0000000056
1.4142135531	-0.0000000093
1.4142135605	-0.0000000019
1.4142135642	 0.0000000019
1.4142135624	 0.0000000000
参考文献