ďťż

Ł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
  •