Ĺadny brzuch
Ostatnio za zadanie maturalne miałem napiać funkcję liczącą pierwiastek kwadratowy jakiejś liczby rzeczywistej (nie chodzi mi o użycie sqrt). Wiem, żeby rozwiązać to zadanie muszę użyć metody Newtona-Raphsona, która działa mi bez zarzutu. Ale mam takie małe pytanie. Jeżeli została zastosowana tutaj iteracja to ile powtórzeń musi zostać zastosowanych. Nie chcę nadurzywać czasu wykonania zadania. Czasami po 4 lub po 5 powtórzeniu funkcji dostaję wynik, program wykonuje jeszcze przypóśćmy z 5 operacji. Oto kodzik:
function pierwiastek(a: real): real;
const max=9;
var
i: byte;
x: array [0..max] of real;
begin
x[0]:=r/2;
for i:=1 to 9 do
x[i]:=(x[i-1]+a/x[i-1])/2;
result:=x[9];
end;
Pomóżcie skrócić mi tą itarację.
PS Możecie jeszcze zajrzeć na moje inne pytanie? Oto link: http://www.ks-eksper...?TOPIC_ID=20511
pozdrawiam
kind
gg: 1482111
Nie powinno się w ten sposób kończyć obliczeń. Co prawda w przypadku takiego pierwiastka dość szybko dostaje się rozwiązanie - ale w przypadku wolnozbieżnym mógłbyś dostać wynik wyraźnie różny od rzeczywistego.
Lepiej, żebyś po każdej iteracji sprawdzał czy błąd względny rozwiązania zszedł poniżej zadanego.
Wyliczasz błąd np. tak e=(x[n]-x[n-1])/x[n] i jeśli jest on mniejszy od zadanego to kończysz obliczenia a w przeciwnym wypadku kontynuujesz je.
Dzięki temu wykonane zostanie tylko tyle iteracji ile potrzebujesz.
ICQ : 245-363-570 | TLEN : oxisoft | GG : 486-2-486
Jeszcze jedno małe pytanko: cytuje:"...czy błąd względny rozwiązania zszedł poniżej zadanego...". W jaki sposób mogę wyznaczyć byłąd zadany...
Możesz mi to wyjaśnić:?
pozdrawiam
kind
gg: 1482111
cytat:Kind_Pax napisał:
Jeszcze jedno małe pytanko: cytuje:"...czy błąd względny rozwiązania zszedł poniżej zadanego...". W jaki sposób mogę wyznaczyć byłąd zadany...
Możesz mi to wyjaśnić:?
Chodzi mi o to, że zakładasz z góry, że chcesz otrzymać wynik z dokładnośią do np. 0.01 - to jest ten błąd zadany.
Więc w programie wykonujesz kolejne iteracje dopóki błąd względny (patrz wcześniejszy post) nie będzie mniejszy niż ten który sobie zażyczyłeś - w tym wypadku 0.01
Możesz spytać użytkownika przed rozpoczęciem obliczeń - z jaką dokładnością chciałby otrzymać wynik. Możesz także samemu narzucić tą dokładność obliczeń - wpisując ją "na sztywno" do programu.
W kodzie który podałeś w pierwszym poście najlepiej byłoby zamienić pętlę for na np. repeat - until i w warunku jej zakończenia dać sprawdzanie błędu.
ICQ : 245-363-570 | TLEN : oxisoft | GG : 486-2-486
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
function pierwiastek(a: real): real;
const max=9;
var
i: byte;
x: array [0..max] of real;
begin
x[0]:=r/2;
for i:=1 to 9 do
x[i]:=(x[i-1]+a/x[i-1])/2;
result:=x[9];
end;
Pomóżcie skrócić mi tą itarację.
PS Możecie jeszcze zajrzeć na moje inne pytanie? Oto link: http://www.ks-eksper...?TOPIC_ID=20511
pozdrawiam
kind
gg: 1482111
Nie powinno się w ten sposób kończyć obliczeń. Co prawda w przypadku takiego pierwiastka dość szybko dostaje się rozwiązanie - ale w przypadku wolnozbieżnym mógłbyś dostać wynik wyraźnie różny od rzeczywistego.
Lepiej, żebyś po każdej iteracji sprawdzał czy błąd względny rozwiązania zszedł poniżej zadanego.
Wyliczasz błąd np. tak e=(x[n]-x[n-1])/x[n] i jeśli jest on mniejszy od zadanego to kończysz obliczenia a w przeciwnym wypadku kontynuujesz je.
Dzięki temu wykonane zostanie tylko tyle iteracji ile potrzebujesz.
ICQ : 245-363-570 | TLEN : oxisoft | GG : 486-2-486
Jeszcze jedno małe pytanko: cytuje:"...czy błąd względny rozwiązania zszedł poniżej zadanego...". W jaki sposób mogę wyznaczyć byłąd zadany...
Możesz mi to wyjaśnić:?
pozdrawiam
kind
gg: 1482111
cytat:Kind_Pax napisał:
Jeszcze jedno małe pytanko: cytuje:"...czy błąd względny rozwiązania zszedł poniżej zadanego...". W jaki sposób mogę wyznaczyć byłąd zadany...
Możesz mi to wyjaśnić:?
Chodzi mi o to, że zakładasz z góry, że chcesz otrzymać wynik z dokładnośią do np. 0.01 - to jest ten błąd zadany.
Więc w programie wykonujesz kolejne iteracje dopóki błąd względny (patrz wcześniejszy post) nie będzie mniejszy niż ten który sobie zażyczyłeś - w tym wypadku 0.01
Możesz spytać użytkownika przed rozpoczęciem obliczeń - z jaką dokładnością chciałby otrzymać wynik. Możesz także samemu narzucić tą dokładność obliczeń - wpisując ją "na sztywno" do programu.
W kodzie który podałeś w pierwszym poście najlepiej byłoby zamienić pętlę for na np. repeat - until i w warunku jej zakończenia dać sprawdzanie błędu.
ICQ : 245-363-570 | TLEN : oxisoft | GG : 486-2-486