Advertisement
Guest User

Untitled

a guest
May 22nd, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.52 KB | None | 0 0
  1. #include <iostream>
  2. #include <utility>
  3. #include <functional>
  4. #include <vector>
  5. #include <cmath>
  6. #include <stdexcept>
  7. #include <algorithm>
  8. #define EPSILON 0,00001
  9.  
  10. double Koeficijenti (int i, int vel, int red, std::vector<std::pair<double, double>>cvorovi);
  11.  
  12. std::function <double(double)> BaricentricnaInterpolacija(std::vector<std::pair<double, double>>cvorovi, int red){
  13.  
  14. if (red < 0 || red > cvorovi.size()) throw std::domain_error ("Nedozvoljen red");
  15.  
  16. for (int i = 0; i < cvorovi.size(); i++){
  17. for (int j = 0; j < cvorovi.size(); j++){
  18.  
  19. if (j == i) continue;
  20. else if (fabs(cvorovi[i].first - cvorovi[j].first) < EPSILON) throw std::domain_error ("Neispravni cvorovi");
  21. }
  22. }
  23.  
  24. return [cvorovi, red] (double x){
  25.  
  26. int vel = cvorovi.size();
  27. double brojnici(0), nazivnici(0);
  28. double xi(0), yi(0), w(0);
  29.  
  30. for (int i = 0; i < vel; i++){
  31.  
  32. xi = cvorovi[i].first;
  33. yi = cvorovi[i].second;
  34.  
  35. if (fabs(xi - x) < EPSILON) return yi;
  36.  
  37. // dio sa tezinskim
  38. w = Koeficijenti(i, vel, red, cvorovi);
  39.  
  40. brojnici += ( w / (x - xi)) * yi;
  41. nazivnici += w / (x - xi);
  42. }
  43.  
  44. return brojnici / nazivnici;
  45. };
  46. }
  47.  
  48. double Koeficijenti (int i, int vel, int red, std::vector<std::pair<double, double>>cvorovi){
  49.  
  50. int gore = std::min(i+1, vel - red);
  51. int donja = std::max(1, i+1 - red);
  52. double p(1), suma(0);
  53. double xi = cvorovi.at(i).first, xj;
  54. for (int k = donja; k < gore; k++ ){
  55. p = 1;
  56. for (int j = k; j < k + red; j++){
  57. if (j != i){
  58. xj = cvorovi.at(j).first;
  59. p *= 1 / (xi - xj);
  60. }
  61.  
  62. }
  63. double koef = std::pow (-1, k - 1);
  64. suma += koef * p;
  65. }
  66. return suma;
  67. }
  68.  
  69.  
  70. std::function <double(double)> BaricentricnaInterpolacija (std::function<double(double)> fja, double xminimum, double xmaximum, double deltax, double red){
  71.  
  72. std::vector <std::pair <double, double>> povratni;
  73.  
  74. if (xminimum > xmaximum || deltax <= 0) throw std::domain_error ("Nekorektni parametri");
  75.  
  76. for(int i = xminimum; i <= xmaximum; i+=deltax){
  77. povratni.push_back(std::make_pair(i, fja(i)));
  78. }
  79.  
  80. return BaricentricnaInterpolacija(povratni, red);
  81. }
  82.  
  83. int main ()
  84. {
  85. try{
  86. std::cout << "Odaberite opciju (1 - unos cvorova, 2 - aproksimacija): ";
  87. int izabir;
  88. std::cin >> izabir;
  89.  
  90. std::cout << "Unesite broj cvorova: ";
  91. int broj_cvorova;
  92. std::cin >> broj_cvorova;
  93.  
  94. std::vector<std::pair<double, double>> vektor(broj_cvorova);
  95. double x,y;
  96. for (int i = 0 ; i <broj_cvorova; i++){
  97. std::cin >> x >> y;
  98. vektor[i] = std::make_pair (x,y);
  99. }
  100.  
  101. if (izabir == 1){
  102.  
  103. std::cout << "Unesite red interpolacije: ";
  104. int red_interpolacije;
  105. std::cin >> red_interpolacije;
  106.  
  107. auto f (BaricentricnaInterpolacija(vektor, red_interpolacije));
  108.  
  109. while(true){
  110. std::cout << "Unesite argument (ili ""kraj"" za kraj): ";
  111. double argument;
  112. std::cin >> argument;
  113. if (!std::cin) break;
  114. std::cout << "f (" << argument << ") = " << f(argument) ;
  115. }
  116. }
  117.  
  118. if (izabir == 2){
  119.  
  120. std::cout << "Unesite krajeve intervala i korak: ";
  121. double pocetak_intervala, kraj_intervala, korak;
  122. std::cin >> pocetak_intervala >> kraj_intervala >> korak;
  123.  
  124. std::cout << "Unesite red interpolacije: ";
  125. int red_interpolacije;
  126. std::cin >> red_interpolacije;
  127. auto f(BaricentricnaInterpolacija(vektor, red_interpolacije));
  128. auto f1 (BaricentricnaInterpolacija(f,pocetak_intervala, kraj_intervala,korak, red_interpolacije));
  129. while(true){
  130. std::cout << "Unesite argument (ili ""kraj"" za kraj): ";
  131. double argument;
  132. std::cin >> argument;
  133. if (!std::cin) break;
  134. std::cout << "f (" << argument << ") = " << f(argument) << " fapprox (" << argument << ") = " << f1(argument);
  135. }
  136.  
  137. }
  138. }
  139.  
  140. catch(std::domain_error izuzetak){
  141. std::cout << izuzetak.what();
  142. }
  143. return 0;
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement