[C++] Metoda siecznych

davidos101
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 22 lut 2015, o 14:58
Płeć: Mężczyzna
Lokalizacja: bezdomny

[C++] Metoda siecznych

Post autor: davidos101 »

Witam, mam do napisania program znajdujący rozwiązanie dla równania nieliniowego z dokładnością e metodą siecznych. Niestety nie rozumiem jak to zrobić. Mógłbym prosić o jakąś pomoc. Programowanie miałem zupełne podstawy a ktoś mi tu wyjeżdża z taką pracą na zaliczenie. W ogóle nie rozumiem na czym polega do końca rozwiązywanie tą metodą. Czytałem, że podajemy przedział dwóch punktów i obliczamy pierwiastek zerowy ale o co chodzi z tą dokładnością wtedy. Jakie warunki muszą być spełnione by dało się obliczyć takie równanie? Dopiero zacząłem a termin mnie goni. Na tą chwilę mam tylko to:

Kod: Zaznacz cały

#include <iostream>
#include <iomanip>
#include <math.h>

using namespace std;


int main()
{
    int a, b;
  double x0,x1,x2;

  cout <<"Obliczanie pierwiastka funkcji y=ax+b - metoda siecznych z dokladnoscia e."<<endl;
  cout<<"Podaj wspolczynniki a i b"<<endl;
  cout<<"a= ";
  cin>>a;
  cout<<"b= ";
  cin>>b;
  if (b==0)
  {
      cout<<"Twoje rownanie to: y="<<a<<"x"<<endl;
  }
  if (b>0)
  {
     cout<<"Twoje rownanie to: y="<<a<<"x+"<<b<<endl;
  }
  if (b<0)
  {
      cout<<"Twoje rownanie to: y="<<a<<"x"<<b<<endl;
  }
  if (a==0)
  {
      cout<<"Twoje równanie to y=0"<<endl;
       return 0;
  }
  cout<<"Podaj punkty poczatkowe <x1,x2>"<<endl;
  cout <<"x1 = ";
  cin >> x1;
  cout << "x2 = ";
  cin >> x2;



   return 0;
  }
Ostatnio zmieniony 22 lut 2015, o 19:19 przez Afish, łącznie zmieniany 2 razy.
Powód: [code][/code]
Awatar użytkownika
jarzabek89
Użytkownik
Użytkownik
Posty: 1337
Rejestracja: 11 lis 2007, o 21:36
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 4 razy
Pomógł: 181 razy

[C++] Metoda siecznych

Post autor: jarzabek89 »

Piszesz:
davidos101 pisze: rozwiązanie dla równania nieliniowego
Tworzysz równanie liniowe:
davidos101 pisze:

cout<<"Podaj wspolczynniki a i b"<<endl;
cout<<"a= ";
cin>>a;
cout<<"b= ";
cin>>b;

...
}
Gdzie tu widzisz jakiś sens?
davidos101
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 22 lut 2015, o 14:58
Płeć: Mężczyzna
Lokalizacja: bezdomny

[C++] Metoda siecznych

Post autor: davidos101 »

No dobrze \(\displaystyle{ 2x- \sin \left( x \right) =y}\) będzie równaniem nieliniowym. Co dalej z tym począć. Mój błąd. Proszę o podanie przedziału, wpisuję to w wzór rekurencyjny. O co chodzi w tym przybliżeniu? Przecież podstawiając to wychodzi mi wynik co nie?
Ostatnio zmieniony 23 lut 2015, o 20:39 przez Afish, łącznie zmieniany 1 raz.
Powód: Całe wyrażenia matematyczne umieszczaj w tagach [latex] [/latex].
Awatar użytkownika
jarzabek89
Użytkownik
Użytkownik
Posty: 1337
Rejestracja: 11 lis 2007, o 21:36
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 4 razy
Pomógł: 181 razy

[C++] Metoda siecznych

Post autor: jarzabek89 »

No dobrze. To popraw to co napisałeś, tak aby to miało jakiś sens.
Z dokładnością chodzi o to, że jeżeli spełniony zostanie warunek:
\(\displaystyle{ \left| f(x)\right| \le e}\)
Program ma zakończyć działanie i przyjąć x za wystarczające przybliżenie.
Swoją drogą raczej powinno być \(\displaystyle{ \frac{1}{e}}\) lub cokolwiek innego nieco mniejszego od e.
davidos101
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 22 lut 2015, o 14:58
Płeć: Mężczyzna
Lokalizacja: bezdomny

[C++] Metoda siecznych

Post autor: davidos101 »

Kod: Zaznacz cały

#include <iostream>
#include <iomanip>
#include <math.h>

using namespace std;


int main()
{
double x0,x1,x2;

cout <<"Obliczanie pierwiastka funkcji y=sin(x) - metoda siecznych z dokladnoscia e."<<endl;
cout<<"Podaj punkty poczatkowe <x1,x2>"<<endl;
cout <<"x1 = ";
cin >> x1;
cout << "x2 = ";
cin >> x2;
if (y=<2,71828182845904523536028747135266249775724709369995)
{

}
else
{
return 0;
}

return 0;
}
Teraz gdzie mam podstawić te wartości co mi poda użytkownik i jaki to powinien być zakres, by tą metodą dało się obliczyć?
Ostatnio zmieniony 23 lut 2015, o 20:40 przez Afish, łącznie zmieniany 1 raz.
Powód: Stosuj tagi.
Awatar użytkownika
jarzabek89
Użytkownik
Użytkownik
Posty: 1337
Rejestracja: 11 lis 2007, o 21:36
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 4 razy
Pomógł: 181 razy

[C++] Metoda siecznych

Post autor: jarzabek89 »

Używaj klamerek code, do pisania kodów.

To co napisałeś nie w ogóle sensu.

Kod: Zaznacz cały

if (y=<2,71828182845904523536028747135266249775724709369995)
{

}
else
{
return 0;
}
Co Ty chcesz tutaj zrobic?
Metoda siecznych to metod iteracyjna, więc podpowiem, że przyda się pętla.
i jaki to powinien być zakres, by tą metodą dało się obliczyć?
Ty mi odpowiedz na to pytanie, to Ty masz napisać ten program, ja mogę jedynie pomóc. Proszę dowiedzieć się jak działa ta metoda i wszystko będzie jasne.
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10218
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2361 razy

[C++] Metoda siecznych

Post autor: Dasio11 »

Wtrącę się: raczej nie chodzi o liczbę Eulera \(\displaystyle{ e \approx 2{,}718281828\ldots,}\) tylko o \(\displaystyle{ \varepsilon,}\) czyli zadaną z góry niewielką liczbę rzeczywistą, zdefiniowaną w programie jako stała.
davidos101
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 22 lut 2015, o 14:58
Płeć: Mężczyzna
Lokalizacja: bezdomny

[C++] Metoda siecznych

Post autor: davidos101 »

Kod: Zaznacz cały

#include <iostream> 
#include <iomanip> 
#include <math.h> 

using namespace std; 


double funkcja(double x) 
{ 
  return sin(x); 
} 

int main() 
{ 
  double eps; 
  double x0,x1,x2,fsin0,fsin1,fsin2; 
  int    ile; 

  cout << "Obliczanie pierwiastka funkcji sin(x)- metoda siecznych"<<endl;

 /*podanie punktow poczatkowych*/ 
  cout << "x1 = "; 
  cin >> x1; 
  cout << "x2 = "; 
  cin >> x2; 
  cout<<"Podaj EPS: "; 
  cin>>eps; 

  fsin1 = funkcja(x1); 
  fsin2 = funkcja(x2); 
  cout<<"

		Ile cykli wykonac: "; 
  cin>>ile; 

  while(ile && (fabs(x1 - x2) > eps)) 
  { 
    if(fabs(fsin1 - fsin2) <eps) 
    { 
      cout << "

		Nie zostaly spelnione warunki"; 
      ile=0; 
      break; 
    } 
    x0 = x1 - fsin1 * (x1 - x2) / (fsin1 - fsin2); 
    fsin0 = funkcja(x0); 

    if(fabs(fsin0) < eps) 
     break; 
    x2 = x1; 
    fsin2 = fsin1; 
    x1 = x0; 
    fsin1 = fsin0; 
    if(!(ile -1)) 
    { 
    cout << "

		Nie znaleziono miejsca zerowego "; 
    cin.ignore(); 
    getchar(); 
    return 0; 
   } 
  } 

  if(ile) 
  cout << "

		x0 = " <<" "<< x0; 

  cout<<"

"; 
  system("pause"); 
  return 0; 
} 
Znalazłem taki program teraz trzeba go poprawić bo nie kompiluje. Wiem na czym polega ta metoda ale nie rozumiem tego. Jakie warunki muszą być spełnione, by ten odcinek był uznany za liniowy. To te "eps" to jest nasze e? To "podaj ile" to nasze nmax? Mógłby ktoś pokrótce mi to wytłumaczyć? Bo ciężko pisać coś o czym nie ma się pojęcia. W toku studiów w ogóle o tym ani słowa nie było. Z kosmosu nagle to wytrzasnął, bo nie z zajęć. Co oznacza fabs? Jest tu coś dobrze, co mógłbym wykorzystać w programie?
Awatar użytkownika
jarzabek89
Użytkownik
Użytkownik
Posty: 1337
Rejestracja: 11 lis 2007, o 21:36
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 4 razy
Pomógł: 181 razy

[C++] Metoda siecznych

Post autor: jarzabek89 »

Wiem na czym polega ta metoda
ciężko pisać coś o czym nie ma się pojęcia
To w końcu jak jest?

Zasada jest banalna.
Wybierasz przedział a,b;
gdzie:
\(\displaystyle{ f(a)\cdot f(b) < 0}\)
Wtedy mamy pewność że gdzieś pomiędzy jest miejsce zerowe.

Wzór na kolejne przybliżenia miejsca zerowego to:
\(\displaystyle{ x _{n+1}= x _{n}-\frac{f(x _{n})(x _{n}-x _{n-1})}{f(x _{n})-f(x _{n-1})}}\)
Masz tak długo wyznaczać miejsce zerowe, aż zostanie spełniony warunek:
\(\displaystyle{ \left| f(x) \right| \le \varepsilon}\)
Co oznacza fabs
Gdybyś choć minimalnie zastanowił się nad swoim problemem to byś wpisał w google "fabs c++" i byś wiedział, że to funkcja, która zwraca wartość bezwzględną.
To te "eps" to jest nasze e?
W Twoim przypadku tak, ale wydaję się oczywistym, że źle przepisałeś. Z punktu widzenia programowania przyjęcie za \(\displaystyle{ \varepsilon}\) e ma jakiś sens. Z punktu widzenia inżynierskiego nie ma żadnego.
To "podaj ile" to nasze nmax?
Nie wiem czym jest Twoje nmax, ale w tym programie oznacza ona maksymalną ilość iteracji.
Jest tu coś dobrze, co mógłbym wykorzystać w programie?
Nie zagłębiałem się dokładnie w to, ale jest na pierwszy rzut oka poprawnie. Gdybyś samodzielnie to napisał, mógłbym wskazać ewentualne błędy.
ODPOWIEDZ