Für Vorlesungen, bitte die Webseite verwenden. https://flavigny.de/lecture
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

76 řádky
2.2KB

  1. #include <iostream>
  2. #include <vector>
  3. #include <math.h>
  4. // Auswertung von p_{i,k}(t) mit Neville Schema bei t=x
  5. template<typename REAL>
  6. REAL evaluateNeville(REAL x, std::vector<REAL> &xs, std::vector<REAL> &ys, int i, int k) {
  7. if(k == 0) {
  8. return ys[i];
  9. } else {
  10. // nevile rekursionsformel
  11. return ((x - xs[i])*evaluateNeville(x, xs, ys,i+1,k-1) - (x - xs[i+k])*evaluateNeville(x, xs, ys, i, k-1))/(xs[i+k]-xs[i]);
  12. }
  13. }
  14. // Auswertung eines Interpolationspolynoms p(t) bei t=x
  15. template<typename REAL>
  16. REAL evaluate(REAL x, std::vector<REAL> &xs, std::vector<REAL> &ys) {
  17. // nutze neville verfahren mit p(x) = p_{0,n}(x)
  18. evaluateNeville(x, xs, ys, 0, xs.size()-1);
  19. }
  20. // Auswertung eines Interpolationspolynoms einer Funktion bei vorgegebenen Stuetzstellen
  21. template <typename REAL>
  22. REAL evaluateFunction(REAL x, std::vector<REAL> &xs, REAL(*f)(REAL)) {
  23. std::vector<double> ys(xs.size());
  24. for (int i = 0; i < xs.size(); i++) {
  25. // berechne stuetzstellen
  26. ys[i] = f(xs[i]);
  27. }
  28. // verwende polynominterpolation
  29. return evaluate(x, xs, ys);
  30. }
  31. // Auswertung eines Interpolationspolynoms einer Funktion bei äquidistanten Stützstellen
  32. template <typename REAL>
  33. REAL evaluateFunctionEqualDist(REAL x, REAL a, REAL b, REAL h, REAL(*f)(REAL)) {
  34. std::vector<double> xs(std::floor((b-a)/h));
  35. std::vector<double> ys(xs.size());
  36. for (int i = 0; i < xs.size(); i++) {
  37. // berechne stuetzstellen
  38. xs[i] = a + i*h;
  39. // und funktionswerte
  40. ys[i] = f(xs[i]);
  41. }
  42. // werte polynom aus
  43. return evaluate(x, xs, ys);
  44. }
  45. // beispiel funktionen
  46. template <typename REAL>
  47. REAL f1(REAL x) {
  48. return 1/(1+std::pow(x,2));
  49. }
  50. template <typename REAL>
  51. REAL f2(REAL x) {
  52. return std::sqrt(std::abs(x));
  53. }
  54. int main() {
  55. // polynom grad
  56. int n = 5;
  57. // abstand zwischen stützstellen
  58. double h = 2.0 / n;
  59. // schrittweite
  60. double dx = 2.0 / 1000;
  61. double x = 0;
  62. for(int i = 0; i < 1000; i++) {
  63. x = -1.0 + i*dx;
  64. // werte polynom mit äquidistanten stuetzstellen zwischen -1 und 1 mit abstand h bei t=x aus
  65. std::cout << x << " " << evaluateFunctionEqualDist(x, -1.0, 1.0, h, f2) << std::endl;
  66. }
  67. }