Facebook
From moj stary, 5 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 240
  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, bool stop)
  26. {
  27.     unsigned int i=0;
  28.     unsigned int ilosc=UINT_MAX;
  29.     double x;
  30.     double epsilon=-1;
  31.  
  32.     if (stop)
  33.     {
  34.         cout<<"podaj wartosc epsilon"<<endl;
  35.         cin>>epsilon;
  36.     }
  37.     else
  38.     {
  39.         cout<<"podaj ilosc iteracji"<<endl;
  40.         cin>>ilosc;
  41.     }
  42.     do
  43.     {
  44.         x=(a+b)/2;
  45.         if (funkcja(a)*funkcja(x)<0)
  46.             b=x;
  47.         else
  48.             a=x;
  49.         i++;
  50.     }while(((funkcja(x)>epsilon)||(funkcja(x)<0-epsilon))&&(i<ilosc));
  51.     cout<<"wynik to "<<x<<endl;
  52.     cout<<"wykonano "<<i<<" iteracji"<<endl;
  53.  
  54. }
  55. void sieczne (double (*funkcja)(double), double a, double b, bool stop)
  56. {
  57.     unsigned int i=0;
  58.     unsigned int ilosc=UINT_MAX;
  59.     double x;
  60.     double epsilon=-1;
  61.     if (stop)
  62.     {
  63.         cout<<"podaj wartosc epsilon"<<endl;
  64.         cin>>epsilon;
  65.     }
  66.     else
  67.     {
  68.         cout<<"podaj ilosc iteracji"<<endl;
  69.         cin>>ilosc;
  70.     }
  71.     do
  72.     {
  73.         x=((a-funkcja(a)*(a-b))/(funkcja(a)-funkcja(b)));
  74.         a=b;
  75.         b=x;
  76.         i++;
  77.     }while(((funkcja(x)>epsilon)||(funkcja(x)<0-epsilon))&&(i<ilosc)&&(a!=b));
  78.     cout<<"wynik to "<<x<<endl;
  79.     cout<<"wykonano "<<i<<" iteracji"<<endl;
  80.  
  81. }
  82.  
  83. int main()
  84. {
  85.     double a;
  86.     double b;
  87.     char wybor;
  88.     bool stop;
  89.     cout<<"wybierz, czy chcesz operowac na funkcji trygonometrycznej (0), wielomianowej (1) czy wykladniczej (2)"<<endl;
  90.     cin>>wybor;
  91.     cout<<"Teraz podaj przedzial na ktorym szukamy miejsc zerowych"<<endl;
  92.     cout<<"Podaj lewe ograniczenie przedzialu:"<<endl;
  93.     cin>>a;
  94.     cout<<"Podaj prawe ograniczenie przedzialu:"<<endl;
  95.     cin>>b;
  96.     cout<<"wybierz, czy warunkiem stopu ma byc zadana ilosc iteracji (0), czy osiagniecie zadanej dokladnosci obliczen (1)"<<endl;
  97.     cin>>stop;
  98.     if (wybor=='0')
  99.     {
  100.         if(tryg(a)*tryg(b)>0)
  101.         {
  102.             cout<<"nieprawidlowy przedzial"<<endl;
  103.             return 0;
  104.         }
  105.         bisekcja(tryg, a, b, stop);
  106.         sieczne(tryg, a, b, stop);
  107.  
  108.     }
  109.     else if (wybor=='1')
  110.     {
  111.         if(wielomian(a)*wielomian(b)>0)
  112.         {
  113.             cout<<"nieprawidlowy przedzial"<<endl;
  114.             return 0;
  115.         }
  116.         bisekcja(wielomian, a, b, stop);
  117.         sieczne(wielomian, a, b, stop);
  118.     }
  119.     else if (wybor=='2')
  120.     {
  121.         if(wykladnicza(a)*wykladnicza(b)>0)
  122.         {
  123.             cout<<"nieprawidlowy przedzial"<<endl;
  124.             return 0;
  125.         }
  126.         bisekcja(wykladnicza, a, b, stop);
  127.         sieczne(wykladnicza, a, b, stop);
  128.     }
  129.     /*dopa
  130.     {
  131.  
  132.     }
  133.     while(wybur(x, wybor)<epsilon&&wybur(x, wybor)>0-epsilon);*/
  134.  
  135.     return 0;
  136. }
  137.