metoda Newtona - kod C++

Awatar użytkownika
trawa696
Użytkownik
Użytkownik
Posty: 111
Rejestracja: 18 gru 2009, o 14:14
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 20 razy

metoda Newtona - kod C++

Post autor: trawa696 »

METODA NEWTONA przybliżonego rozwiązywanie równań

Znalazłem taki program implementacja tą metodę:

Kod: Zaznacz cały

#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstdlib>

using namespace std;

const double EPS0 = 0.0000000001; // dokładność porównania z zerem
const double EPSX = 0.0000000001; // dokładność wyznaczenia pierwiastka

double f(double x)
{
  return 2*x - tan (x); // nasza funkcja

}

double fp(double x)
{
  return 2 - (1 / (cos(x) * cos(x))); // pochodna naszej funkcji
}

int main()
{

  double x0,x1,f0,f1;
  int    i;

  cout << setprecision(8)     // 8 cyfr po przecinku
       << fixed;              // format stałoprzecinkowy

  cout << "Podaj punkt startowy\n";
  cout << "\nx0 = "; cin >> x0;
  cout << "\n";
  x1 = x0 - 1; f0 = f(x0); 
  i = 50;   // limit iteracji
  while (i && (fabs(x1 - x0) > EPSX) && (fabs(f0) > EPS0))
  {
    f1 = fp(x0);
    if(fabs(f1) < EPS0)
    {
      cout << "Zly punkt startowy\n";
      i = 0;
      break;
    }
    x1 = x0;
    x0 = x0 - f0 / f1;
    f0 = f(x0);
    if(!(--i)) cout << "Przekroczony limit obiegow\n";
  }
  if (x0==0)
     {cout << "Rozwiazanie nie spelnia zalozen naszego zadania\n";
     }
      else
  if(i) 
  cout << "\nZnaleziony pierwiastek to x = " << x0;
  cout << "\n\n";
  system("pause");
  return 0;
}
program działa poprawnie, ale nie rozumiem niektórych fragmentów. Chodzi mianowicie i liniki: 34, 36, 42, 48, i 54. Nie do końca rozumiem dlaczego tak a nie inaczej. Bardzo proszę o pomoc w zrozumieniu tego programu :)


Nie chodzi mi tyle i wyjasnienie jak dziala metoda Newtona, tylko o działanie samego kodu, np jaki warunek sprawdza while jeżeli chodiz o 'i' oraz wzgledem czego sprawdza if 'i' w linice 54 skoro nie ma warunku oraz co oznacz if(!(--i))
kod3r
Użytkownik
Użytkownik
Posty: 61
Rejestracja: 9 sty 2010, o 22:06
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 2 razy

metoda Newtona - kod C++

Post autor: kod3r »

A opis algorytmu czytałeś? Ten program jest na stronce razem z opisem działania metody jak i opisem algorytmu.
34 // pod x1 podstawiasz wartość wczytaną x0 - 1 to chyba widać, f0 to wartość funkcji w punkcie x0
36 //pętla while sprawdza warunki, gdy dokładności są mniejsze od obliczanych wartości to się wykonuje dalej, szuka tego miejsca zerowego (jak najdokładniejszego), gdy warunek nie jest spełniony to pętla się nie wykona
42 // wartość i ustawiona jest na 0 po to by przerwać działanie pętli i wypisać odpowiedni komunikat gdy fabs(f1) < EPS0
48 // if(!(--i)) , ! oznacza negację, --i zmniejszanie wartości za każdym obiegiem o 1, jako że warunek w if'ie jest negowany to wypisanie komunikatu nastąpi wtedy gdy zmienna i będzie miała wartość 0.
54 // tutaj gdy i będzie różne od zera, czyli znaleziony zostanie pierwiastek, nastąpi jego wypisanie.
ilość iteracji określona w programie to 50, być może program szybciej znajdzie pierwiastek np. przy 25 kroku

Co do if'ów, generalnie działają one tak:

Kod: Zaznacz cały

if(prawda) wykona się to gdy prawda
else
wykona się to gdy fałsz
Komputer oblicza sobie wartość wyrażenia w if'ie i nadaje mu wartość 0 gdy fałsz bądź 1 gdy prawda.

Ogólnie polecam czytać co jest napisane na stronie z której ściągasz program, bardzo dobrze jest tam wszystko wyjaśnione i napisane. Branie czegoś na żywca, bezmyślnie tak się właśnie później kończy, program jest, ładny krótki, ale jak działa? Tego już ściągający nie wie...
Awatar użytkownika
trawa696
Użytkownik
Użytkownik
Posty: 111
Rejestracja: 18 gru 2009, o 14:14
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 20 razy

metoda Newtona - kod C++

Post autor: trawa696 »

Czytałem opis algorytmu, jednak nie do, który w miarę wydawał mi się zrozumiały, jednak już sama implementacja do C++ trochę mniej..

34 - dlaczego pod x1 podstawiamy x0-1? dlaczego coś odejmujemy i dlaczego akurat 1?
36 - nie rozumiem według jakiego kryterium sprawdzane jest nasz 'i' skoro nie ma przy nim żadnego warunku typu > , < , =
48 - if to instrukcja sprawdzająca wiec dlaczego jest w warunku czynność i:=i-1?
54 - dlaczego 'i' jest porównywane do zera skoro nic takie nie jest tam napisane ( dlaczego wiec nie jest if(i==0) )
Awatar użytkownika
Errichto
Użytkownik
Użytkownik
Posty: 1629
Rejestracja: 17 mar 2011, o 18:55
Płeć: Mężczyzna
Lokalizacja: Suwałki
Podziękował: 28 razy
Pomógł: 272 razy

metoda Newtona - kod C++

Post autor: Errichto »

if(i) - nie wykona się gdy i jest zerem. Samo \(\displaystyle{ i}\) zwraca wartość true dla \(\displaystyle{ i}\) różnych od zera, false dla zera.
A czemu nie może być czynność? Ważne aby to coś w nawiasie zwróciło w końcu true albo false.
W 48 masz najpierw zmniejszenie \(\displaystyle{ i}\) a potem sprawdzenie czy jest zerem.
54 - to już raczej by było if(i!=0) - ale po co skoro można krócej?
kod3r
Użytkownik
Użytkownik
Posty: 61
Rejestracja: 9 sty 2010, o 22:06
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 2 razy

metoda Newtona - kod C++

Post autor: kod3r »

trawa696 pisze: 34 - dlaczego pod x1 podstawiamy x0-1? dlaczego coś odejmujemy i dlaczego akurat 1?
Bo jest to kolejny krok algorytmu, zawężanie obszaru szukania pierwiastka, popatrz sobie na wykres przy opisie, bardzo ładnie to pokazuje.
ODPOWIEDZ