Facebook
From horner, 2 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 207
  1. #include <iostream>
  2. #include <cmath>
  3. #include <limits.h>
  4.  
  5. using namespace std;
  6.  
  7.  
  8.  
  9. double tryg (double x)
  10. {
  11.   return sin(2*x+1)-tan(x)+1;
  12. }
  13.  
  14. double wielomian (double x)
  15. {
  16.     return 3*x*x*x+5*x*x+2*x+5;
  17. }
  18.  
  19. double wykladnicza(double x) //funkcja w postaci f(x)=5^x-25
  20. {
  21.     return 2*exp(x/2)-3;
  22. }
  23.  
  24.  
  25. void bisekcja (double (*funkcja)(double), double a, double b, double epsilon, unsigned int ilosc)
  26. {
  27.     unsigned int i=0;
  28.     double x;
  29.     do
  30.     {
  31.         x=(a+b)/2;
  32.         if (funkcja(a)*funkcja(x)<0)
  33.             b=x;
  34.         else
  35.             a=x;
  36.         i++;
  37.     }while(((funkcja(x)>epsilon)||(funkcja(x)<0-epsilon))&&(i<ilosc));
  38.     cout<<"wynik to "<<x<<endl;
  39.     cout<<"wykonano "<<i<<" iteracji"<<endl;
  40.  
  41. }
  42. void sieczne (double (*funkcja)(double), double a, double b, double epsilon, unsigned int ilosc)
  43. {
  44.     unsigned int i=0;
  45.     double x;
  46.     do
  47.     {
  48.         x=((a-funkcja(a)*(a-b))/(funkcja(a)-funkcja(b)));
  49.         a=b;
  50.         b=x;
  51.         i++;
  52.     }while(((funkcja(x)>epsilon)||(funkcja(x)<0-epsilon))&&(i<ilosc)&&(a!=b));
  53.     cout<<"wynik to "<<x<<endl;
  54.     cout<<"wykonano "<<i<<" iteracji"<<endl;
  55.  
  56. }
  57.  
  58. int main()
  59. {
  60.     double a;
  61.     double b;
  62.     double epsilon=-1;
  63.     unsigned int ilosc=UINT_MAX;
  64.     char wybor;
  65.     bool stop;
  66.     cout<<"wybierz, czy chcesz operowac na funkcji trygonometrycznej (0), wielomianowej (1) czy wykladniczej (2)"<<endl;
  67.     cin>>wybor;
  68.     cout<<"Teraz podaj przedzial na ktorym szukamy miejsc zerowych"<<endl;
  69.     cout<<"Podaj lewe ograniczenie przedzialu:"<<endl;
  70.     cin>>a;
  71.     cout<<"Podaj prawe ograniczenie przedzialu:"<<endl;
  72.     cin>>b;
  73.     cout<<"wybierz, czy warunkiem stopu ma byc zadana ilosc iteracji (0), czy osiagniecie zadanej dokladnosci obliczen (1)"<<endl;
  74.     cin>>stop;
  75.       if (stop)
  76.     {
  77.         cout<<"podaj wartosc epsilon"<<endl;
  78.         cin>>epsilon;
  79.     }
  80.     else
  81.     {
  82.         cout<<"podaj ilosc iteracji"<<endl;
  83.         cin>>ilosc;
  84.     }
  85.     if (wybor=='0')
  86.     {
  87.         if(tryg(a)*tryg(b)>0)
  88.         {
  89.             cout<<"nieprawidlowy przedzial"<<endl;
  90.             return 0;
  91.         }
  92.         bisekcja(tryg, a, b, epsilon, ilosc);
  93.         sieczne(tryg, a, b, epsilon, ilosc);
  94.  
  95.     }
  96.     else if (wybor=='1')
  97.     {
  98.         if(wielomian(a)*wielomian(b)>0)
  99.         {
  100.             cout<<"nieprawidlowy przedzial"<<endl;
  101.             return 0;
  102.         }
  103.         bisekcja(wielomian, a, b, epsilon, ilosc);
  104.         sieczne(wielomian, a, b, epsilon, ilosc);
  105.     }
  106.     else if (wybor=='2')
  107.     {
  108.         if(wykladnicza(a)*wykladnicza(b)>0)
  109.         {
  110.             cout<<"nieprawidlowy przedzial"<<endl;
  111.             return 0;
  112.         }
  113.         bisekcja(wykladnicza, a, b, epsilon, ilosc);
  114.         sieczne(wykladnicza, a, b, epsilon, ilosc);
  115.     }
  116.  
  117.     return 0;
  118. }
  119.