Metody nieliniowe
Zastosować metodę Newtona do obliczania 1/x bez dzielenia. Zastosować do obliczenia 1/a dla a=2.1 z x_0=0.5 i 1001 z x_0=1e-3 - zbadać eksperymentalnie, czy mamy zbieżność kwadratową, tzn. liczyć e_{n+1}/(e_n*e_n) dla kolejnych n (e_n=|x_n-1/a|).
W raporcie: błędy |e_n| i |e_{n+1}/(e_n*e_n)| dla kolejnych n - za warunek stopu |1-x_n*a| < 1e-10*|x0| lub |x_{n+1}-x_n| < 1e-10 lub ilość iteracji przekroczy 30 (obliczenia w arytmetyce podwójnej precyzji).
program zad4;
var e,x:array[0..50] of double;
n:integer;
a:double;
procedure e_n;
begin
e[n]:=(x[n] - 1/a);
end;
begin
writeln('dla a=2.1 i x_0=0.5');
a:=2.1;
x[0]:=0.5;
n:=0;
repeat
e_n;
write(n,'. ',abs(e[n]),' |');
x[n+1]:=2*x[n] - a*x[n]*x[n];
n:=n+1;
e_n;
writeln(abs(e[n]/(e[n-1]*e[n-1])));
until (n > 31) or (abs(1 - x[n-1]*a) < 0.0000000001*abs(x[0])) or (abs(x[n]-x[n-1]) < 0.0000000001);
writeln;
writeln('dla a=1001 i x_0=1e-3');
a:=1001;
x[0]:=0.001;
n:=0;
repeat
x[n+1]:=2*x[n] - a*x[n]*x[n];
e_n;
write(n,'. ',abs(e[n]),' |');
n:=n+1;
e_n;
writeln(abs(e[n]/(e[n-1]*e[n-1])));
until (n > 31) or (abs(1 - x[n-1]*a) < 0.0000000001*abs(x[0])) or (abs(x[n]-x[n-1]) < 0.0000000001);
end.Wynik z konsoli:
maniek@maniek:~$ ./zad4
dla a=2.1 i x_0=0.5
0. 2.3809523809523829E-0002 | 2.1000000000000002E+0000
1. 1.1904761904761925E-0003 | 2.0999999999958052E+0000
2. 2.9761904761845415E-0006 | 2.0999990931275731E+0000
3. 1.8601182443303554E-0011 | 1.8174277792319519E+0004
dla a=1001 i x_0=1e-3
0. 9.9900099900101984E-0007 | 1.0009999998947988E+0003
1. 9.9900099889604959E-0010 | 1.0009836974136574E+0003
2. 9.9898472876109104E-0016 | 8.4875550648696237E+0008
HTML w komentarzach jest wyłączony, możesz jednak skorzystać z Textile Lite.
16 Mar 2008, 01:12:19 | Permalink
Ciekawy dział, tylko czy byłaby możliwość zapisu w nieco czytelniejszy sposób? może wzorki przez latex’a przepuścić i skonwertować do html’a. Oczywiście da się to odczytać, ale zawsze to ładniej :) I jeszcze fajnie byłoby zobaczyć output z tego programu, bo nie każdy ma kompilator do Turbo Pascala(???), co prawda może sobie do innego języka np:C zawsze przepisać ale … :) output by się przydał.
16 Mar 2008, 12:25:52 | Permalink
karski: właśnie miałem zamiar wrzucać „wynik” moich programów, a co do Latex’a to szczerze mówiąc, nie bardzo chce mi się bawić dla kilku wzorków, ale może z czasem o tym pomyśle ;)
18 Mar 2008, 19:49:12 | Permalink
Ok, dodałem output programów.