Facebook
From mojstary, 4 Years ago, written in C++.
Embed
Download Paste or View Raw
Hits: 218
  1. #include <iostream>
  2. #include <cmath>
  3. #include <cstdlib>
  4.  
  5. using namespace std;
  6.  
  7. double liniowa (double x)
  8. {
  9.     return exp(-x)*(21*x-37);
  10. }
  11.  
  12. double horner (double x, double tab[], int rozmiar)
  13. {
  14.     int i;
  15.     double wynik;
  16.     wynik=tab[0];
  17.  
  18.     for (i=1; i<=rozmiar-1; i++)
  19.         wynik=wynik*x+tab[i];
  20.     return exp(-x)*wynik;
  21. }
  22.  
  23. double tryg (double x)
  24. {
  25.     return exp(-x)*cos(x)*4;
  26. }
  27.  
  28. double zlozenie (double x)
  29. {
  30.     return exp(-x)*fabs(x*x*sin(x));
  31. }
  32.  
  33. double wartosci(double x, double tab[], int wybor, int wyborwaga, double waga)
  34. {
  35.     double wynik;
  36.     if(wybor==1)
  37.         wynik=liniowa(x);
  38.     else if (wybor==2)
  39.         wynik=horner(x, tab, 4);
  40.     else if (wybor==3)
  41.         wynik=tryg(x);
  42.     else
  43.         wynik=zlozenie(x);
  44.     if(wyborwaga==1)
  45.         return wynik/exp(-x)*waga;
  46.     else
  47.         return wynik;
  48. }
  49.  
  50. double wartosci1(double x, double tab[], int wybor)
  51. {
  52.     if(wybor==1)
  53.         return liniowa(x)/exp(-x);
  54.     else if (wybor==2)
  55.         return horner(x, tab, 4)/exp(-x);
  56.     else if (wybor==3)
  57.         return tryg(x)/exp(-x);
  58.     else
  59.         return zlozenie(x)/exp(-x);
  60. }
  61.  
  62. double simpson (double a, double b, int wybor, int wybor2, double tab[], double &wynik, double &wynik1, int &n)
  63. {
  64.     double dx, suma2, suma, x;
  65.     int i;
  66.     n++;
  67.     wynik+=wynik1;
  68.     dx=(b-a)/(n);
  69.     suma2=0;
  70.     suma=0;
  71.     for (i=1; i<n; i++)
  72.     {
  73.         x=a+i*dx;
  74.         suma+=wartosci1(x-dx/2, tab, wybor);
  75.         suma2+=wartosci1(x, tab, wybor);
  76.     }
  77.     suma+=wartosci1(b-dx/2, tab, wybor);
  78.     if (wybor2==1)
  79.         wynik1=((b-a)/(6*n))*(wartosci1(a, tab, wybor)+wartosci1(b, tab, wybor)+2*suma2+4*suma);
  80.     else
  81.         wynik1=((b-a)/(6*n))*(wartosci1(a, tab, wybor)+wartosci1(b, tab, wybor)+2*suma2+4*suma);
  82.     return wynik1;
  83. }
  84.  
  85. double laguerre (int wybor, double tab[], double wezly[], double siema[], int n, double &wynik, double &wynik1, int wyborwaga, double waga)
  86. {
  87.     wynik=wynik1;
  88.     wynik1=0;
  89.     for (int i=0; i<=n; i++)
  90.         wynik1+=siema[i]*wartosci(wezly[i], tab, wybor, wyborwaga, waga);
  91.     return wynik1;
  92. }
  93.  
  94. int main()
  95. {
  96.     double tab[4]= {1, 5, -4, -20};
  97.     double a, b, eps, wynik=0, wynik1=0;
  98.     int wybor, wybor2, wyborwaga, n=1;
  99.     double waga=1;
  100.     double ile=0;
  101.     double x1[2]= {0.585789, 3.414214};
  102.     double x2[3]= {0.415775, 2.294280, 6.289945};
  103.     double x3[4]= {0.322548, 1.745761, 4.536620, 2.395071};
  104.     double x4[5]= {0.263560, 1.413403, 3.596426, 7.085810, 12.640801};
  105.  
  106.     double a1[2]= {0.853553, 0.146447};
  107.     double a2[3]= {0.711093, 0.278518, 0.010389};
  108.     double a3[4]= {0.603154, 0.357419, 0.038888, 0.000539};
  109.     double a4[5]= {0.521756, 0.398667, 0.075942, 0.003612, 0.000023};
  110.  
  111.     double *X[4]= {x1, x2, x3, x4};
  112.     double *A[4]= {a1, a2, a3, a4};
  113.     cout<<"Aby wybrac wlasna wage w obliczeniach metoda Laguerre'a wcisnij 1, jesli nie wpisz cokolwiek innego"<<endl;
  114.     cin>>wyborwaga;
  115.     if(wyborwaga==1)
  116.     {
  117.         cout<<"podaj wage"<<endl;
  118.         cin>>waga;
  119.     }
  120.     cout<<"Wybierz funkcje:"<<endl<<"1. funkcja liniowa"<<endl<<"2. wielomian"<<endl<<"3. funkcja trygonometryczna"<<endl<<"4. zlozenie"<<endl;
  121.     cin>>wybor;
  122.     if(wybor>=1 && wybor<=4)
  123.     {
  124.         cout << "1. Okreslony przedzial calkowania. \n2. Przedzial calkowania [0, inf]." << endl;
  125.         cin >> wybor2;
  126.         if (wybor2==1)
  127.         {
  128.             cout << "Okresl przedzial: " << endl;
  129.             cout << "Poczatek przedzialu: ";
  130.             cin >> a;
  131.             cout << "Koniec przedzialu: ";
  132.             cin >> b;
  133.             cout << "Podaj dokladnosc: ";
  134.             cin >> eps;
  135.             cout << endl;
  136.             a=0;
  137.             wynik1=0;
  138.             do
  139.                 {
  140.                     simpson(a,b,wybor,wybor2,tab,wynik,wynik1,n);
  141.                     ile++;
  142.                 }
  143.                 while (wynik1>eps);
  144.         }
  145.         else if (wybor2==2)
  146.         {
  147.             ile=0;
  148.             cout << "Podaj dokladnosc: ";
  149.             cin >> eps;
  150.             cout << endl;
  151.             a=0;
  152.             wynik1=0;
  153.             do
  154.             {
  155.                 simpson(a,a+1,wybor,wybor2,tab,wynik,wynik1,n);
  156.                 a+=1;
  157.                 ile++;
  158.             }
  159.             while (fabs(wynik-wynik1)>eps);
  160.         }
  161.         cout<<"Wynik metoda Newtona-Cotesa: "<<wynik1<<endl<<"Dla liczby przedzialow "<<ile<<endl;
  162.         int m=1;
  163.         wynik1=0;
  164.         do
  165.         {
  166.             laguerre(wybor,tab,X[m-1],A[m-1],m,wynik,wynik1,wyborwaga,waga);
  167.             m++;
  168.         }
  169.         while (fabs(wynik1-wynik)>eps and m<=4);
  170.         cout<<"Wynik metoda Laguerre'a: "<<wynik1<<endl<<"Dla liczby wezlow n = "<<m<<endl;
  171.     }
  172.     else
  173.         cout<<"Nie ma takiej funkcji :<"<<endl;
  174.  
  175.     return 0;
  176. }
  177.