Facebook
From Round Hog, 10 Months ago, written in C++.
Embed
Download Paste or View Raw
Hits: 110
  1. #include <stdlib.h>
  2. #include <cmath>
  3. #include <iostream>
  4. #include <fstream>
  5. const double M_PI = 3.14159265358979323846;
  6.  
  7. using namespace std;
  8.  
  9. int n;
  10. int np;
  11. double a;
  12. double b;
  13. int iloscN;
  14. int iloscNP;
  15.  
  16. double *x;
  17. double *fx;
  18. double *xp;
  19. double *fxp;
  20. double *ai;
  21. double *Lnxp;
  22.  
  23.  
  24. //WPROWADZENIE DANYCH
  25. void funkcjaWprowadzajacaDane(){
  26.     cout << "Prosze wprowadzic wartosc n: " << endl;
  27.     //cin >> n;
  28.     n = 3;
  29.     iloscN = n+1;
  30.     cout << "Prosze wprowadzic wartosc np: " << endl;
  31.     //cin >> np;
  32.     np=50;
  33.     iloscNP = np+1;
  34.     cout << "Prosze wprowadzic lewa granice przedzialu: " << endl;
  35.     //cin >> a;
  36.     a = -1;
  37.     cout << "Prosze wprowadzic prawa granice przedzialu: " << endl;
  38.     //cin >> b;
  39.     b =1;
  40.  
  41.     x = new double[iloscN];
  42.     fx = new double[iloscN];
  43.     xp = new double[iloscNP];
  44.     fxp = new double[iloscNP];
  45.     ai= new double[iloscN];
  46.     Lnxp = new double[iloscNP];
  47. }
  48.  
  49. //TABLICOWANIE WEZLOW I WARTOSCI FUNKCJI DLA WEZLOW ROWNOODLEGLYCH
  50. void funkcjaTablicujacaWezlyRownoodlegleIWartosciFunkcjiInterpolowanej() {
  51.     for (int i = 0; i < iloscN; i++){
  52.         x[i] = a +i * ((b-a)/n);
  53.         fx[i] = abs(x[i]*x[i]*x[i])/(1+(x[i]*x[i]));
  54.     }
  55. }
  56.  
  57. //TABLICOWANIE WEZLOW I WARTOSCI FUNKCJI DLA WEZLOW DOBRANYCH OPTYMALNIE
  58. void funkcjaTablicujacaWezlyOptymalneIWartosciFunkcjiInterpolowanej() {
  59.     for (int i = 0; i < iloscN; i++){
  60.         x[i] = ((a+b)/2)-((b-a)/2)*cos((((2*i)+1)*M_PI)/((2*n)+2));
  61.         fx[i] = abs(x[i]*x[i]*x[i])/(1+(x[i]*x[i]));
  62.     }
  63. }
  64.  
  65. //WYZNACZENIE WSPOLCZYNNIKA WIELOMIANU NEWTONA (ILORAZY ROZNICOWE)
  66. void funkcjaWyznaczajacaWspolczynikiWielomianuNewtona(){
  67.         double tmp[iloscN][iloscN] = { 0 };
  68.         for (int i = 0; i < iloscN; i++){
  69.                 tmp[i][0] = fx[i];
  70.         }
  71.  
  72.         for (int i = 1; i < iloscN; i++){
  73.                 for (int j = 0+i; j < iloscN; j++){
  74.             tmp[j][i] = ((tmp[j][i - 1] - tmp[j-1][i - 1]) / (x[j] - x[j-i]));
  75.                 }
  76.         }
  77.         for (int i = 0; i < iloscN; i++){
  78.                 ai[i] = tmp[i][i];
  79.         }
  80. }
  81.  
  82. //WYZNACZENIE WARTOSCI WIELOMIANU NEWTONA W DOWOLNYM PUNKCIE
  83. double funkcjaWyznaczajacaWartosciWielomianuNewtonaWDowolnymPunkcie(const double &xi){
  84.         double tmp = 1.0, wynik = ai[0];
  85.         for (int j = 1; j < iloscN; j++){
  86.                 for (int i = 0; i < j; i++){
  87.                         tmp *= (xi - x[i]);
  88.                 }
  89.                 wynik += tmp * ai[j];
  90.                 tmp = 1.0;
  91.         }
  92.         return wynik;
  93. }
  94.  
  95. //WYPISANIE WYNIKĂ“W
  96. void funkcjaWyznaczajacaTablice(){
  97.     for (int i = 0; i < iloscNP; i++){
  98.         xp[i] = a + i * ((b-a)/np);
  99.         fxp[i] = abs(xp[i]*xp[i]*xp[i])/(1+(xp[i]*xp[i]));
  100.         //UZYCIE FUNKCJI WYZNACZAJACEJ WARTOSC WIELOMIANU NEWTONA W DOWOLNYM PUNKCIE
  101.         Lnxp[i] = funkcjaWyznaczajacaWartosciWielomianuNewtonaWDowolnymPunkcie(xp[i]);
  102.     }
  103.         ofstream file;
  104.         file.open("raport.txt");
  105.     file << "wartosc wezlow x:" << endl;
  106.     for(int i=0; i<iloscN; i++){
  107.         file << x[i] << endl;
  108.     }
  109.     file << endl;
  110.     file << endl;
  111.     file << "wartosc funkcji f(x):" << endl;
  112.     for(int i=0; i<iloscN; i++){
  113.         file << fx[i] << endl;
  114.     }
  115.     file << endl;
  116.     file << endl;
  117.     file << "wezly xp:" << endl;
  118.     for(int i=0; i<iloscNP; i++){
  119.         file << xp[i] << endl;
  120.     }
  121.     file << endl;
  122.     file << endl;
  123.     file << "wartosc funkcji f(xp):" << endl;
  124.     for(int i=0; i<iloscNP; i++){
  125.         file << fxp[i] << endl;
  126.     }
  127.     file << endl;
  128.     file << endl;
  129.     file << "wartosc wielomianu Ln(xp):" << "\n";
  130.     for(int i=0; i<iloscNP; i++){
  131.         file << Lnxp[i] << endl;
  132.     }
  133.     file << endl;
  134.     file << endl;
  135.     file << "blad interpolacji:" << "\n";
  136.     for(int i=0; i<iloscNP; i++){
  137.         file << abs(fxp[i] - Lnxp[i]) << endl;
  138.     }
  139.     file << endl;
  140.     file << endl;
  141.     file << "funkcja interpolujaca: " << "\n";
  142.     for(int i=0; i<iloscN; i++){
  143.         file << ai[i] <<" +" ;
  144.     }
  145.         file.close();
  146. }
  147.  
  148. int main(){
  149.     //WPROWADZENIE DANYCH
  150.     funkcjaWprowadzajacaDane();
  151.  
  152.     //WYBOR TYPU WEZLOW
  153.     char odp = 0;
  154.     cout << "Tablicowanie wezlow rownoodleglych - kliknij \"o\"" << endl;
  155.     cout << "Tablicowanie wezlow optymalnie dobranych - kliknij \"r\"" << endl;
  156.     cin >> odp;
  157.     if (odp == 'r'){
  158.         funkcjaTablicujacaWezlyRownoodlegleIWartosciFunkcjiInterpolowanej()
  159.     }
  160.     else if (odp == 'o'){
  161.         funkcjaTabli    cujacaWezlyOptymalneIWartosciFunkcjiInterpolowanej();
  162.     }
  163.  
  164.     //WYZNACZENIE WSPOLCZYNNIKA WIELOMIANU NEWTONA
  165.     funkcjaWyznaczajacaWspolczynikiWielomianuNewtona();
  166.     //WYZNACZENIE TABLIC PUNKTOW, WARTOSCI FUNKCJI INTERPOLOWANEJ I WARTOSCI WIELOMIANU NEWTONA
  167.         funkcjaWyznaczajacaTablice();
  168.  
  169.         delete [] x;
  170.     delete [] fx;
  171.     delete [] xp;
  172.     delete [] fxp;
  173.     delete [] ai;
  174.     delete [] Lnxp;
  175.  
  176.     return 0;
  177. }
  178.