Guest User

Untitled

a guest
Jan 11th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.80 KB | None | 0 0
  1. #include <iostream>
  2. #include <math.h>
  3. #include <time.h>
  4. #include <limits.h>
  5. using namespace std;
  6. //jeden z krancow przedzialu aproksymowania
  7. int przedzial = 2;
  8. //rozmiar wektorow
  9. int
  10. const n = 51;
  11. //tablica wejscia x
  12. double wekX[n];
  13. //tablica funkcji
  14. double wekY[n];
  15. //stopien wielomianu
  16. int
  17. const stopien = 1;
  18. //tablica wspolczynnikow
  19. double wekA[stopien];
  20. //funkcja tablicująca wektory X oraz Y na podstawie przedziału i funkcji aproksymowanej
  21. void laduj(int przedzial) {
  22. for (int i = 0; i < n; i++) {
  23. wekX[i] = -przedzial + (double) i * (double)((2 * przedzial) / n);
  24. wekY[i] = sin(wekX[i]) * sin(2*wekX[i] + wekX[i]);
  25. }
  26. }
  27. //funkcja wypisujaca wektory X oraz Y
  28. void wypisz() {
  29. for (int i = 0; i < n; i++) {
  30. cout << "\t" << wekX[i] << "\t\t" << wekY[i] << endl;
  31. }
  32. }
  33. //Funkcje obliczajaca dwumian Newtona
  34. double dwumian(int n, int k) {
  35. double wynik = 1.0;
  36. for (int i = 1; i <= k; i++)
  37. wynik *= (double)(n - i + 1) / i;
  38. return wynik;
  39. }
  40. //funkcja obliczajaca iloczyn r^[s] wykorzystywany w wielomianach Grama (ponizej)
  41. double iloczynS(int r, int s) {
  42. double wynik = 1;
  43. for (int i = 0; i <= s - 1; i++) {
  44. wynik *= (r - i);
  45. }
  46. //wynik *= (r-s+1); //blad byl
  47. return wynik;
  48. }
  49. //funkcja obliczajaca wielomiany Grama
  50. double Gram(int k, int n, int q) {
  51. double wynik = 0, pom;
  52. for (int s = 0; s <= k; s++) {
  53. pom = (iloczynS(q, s) / iloczynS(n, s));
  54. pom = pow((double) - 1, s);
  55. pom = dwumian(k, s);
  56. pom = dwumian(k + s, s);
  57. pom = (double)(pow(-1.0, s) * dwumian(k, s)) * dwumian(k + s, s) * (iloczynS(q, s) / iloczynS(n, s));
  58. wynik += (double)(pow(-1.0, s) * dwumian(k, s)) * dwumian(k + s, s) * (iloczynS(q, s) / iloczynS(n, s));
  59. }
  60. return wynik;
  61. }
  62. //funkcja obliczajaca wspolczynnik s_j wykorzystywana w funkcji aproksymujacej
  63. double wspS(int n, int j) {
  64. double wynik = 0;
  65. for (int q = 0; q <= n; q++) {
  66. wynik += Gram(j, n, q) * Gram(j, n, q);
  67. }
  68. return wynik;
  69. }
  70. //funkcja obliczajaca wspolczynnik c_j wykorzystywana w funkcji aproksymujacej
  71. double wspC(int n, int j) {
  72. double wynik = 0;
  73. for (int q = 0; q <= n; q++) {
  74. wynik += wekY[q] * Gram(j, n, q);
  75. }
  76. return wynik;
  77. }
  78. //funkcja obliczajaca aproksymacje zbudowana na wielomianach Grama
  79. double funA(int m, int n, int q) {
  80. if (m >= n)
  81. return -1;
  82. double wynik = 0;
  83. double pom;
  84. for (int j = 0; j <= m; j++) {
  85. pom = wspC(n, j);
  86. pom = wspS(n, j);
  87. wekA[j] = wspC(n, j) / wspS(n, j);
  88. wynik += wspC(n, j) / wspS(n, j) * Gram(j, n, q);
  89. }
  90. return wynik;
  91. }
  92. //funkcja obliczajaca blad sredniokwadratowy aproksymacji zbudowanej na wielomianach Grama
  93. double bladA(int n, int m) {
  94. if (n <= 0)
  95. return -1;
  96. double wynik = 0;
  97. for (int i = 0; i < n; i++) {
  98. wynik += (funA(m, n, i) - wekY[i]) * (funA(m, n, i) - wekY[i]);
  99. }
  100. wynik /= n - 1;
  101. wynik = sqrt(wynik);
  102. return wynik;
  103. }
  104. int main() {
  105. double tmp;
  106. int min = INT_MAX;
  107. //int min;
  108. int pMin, sMin, enter;
  109. double czasStart, czasStop;
  110. cout << "Funkcja aproksymowana sin(2*wekX[i] + wekX[i])-----------------------------------" << endl << "Liczba wezlow = 50 -------------------------------------------------------\n" << "--------------------------------------------------------------------------\n";
  111. cout << "| Stopien:\t| Przedzial:\t\t| Blad aproksymacji:\t\t |" << endl;
  112. czasStart = clock();
  113. for (int i = 1; i <= 20; i++) {
  114. for (int j = 0; j < 5; j++) {
  115. laduj(przedzial + j);
  116. tmp = bladA(n, i);
  117. if (tmp < min) { min = tmp;
  118. sMin = i;
  119. pMin = przedzial + j; };
  120. cout << "| " << i << "\t\t| <" << -przedzial - j << "; " << przedzial + j << ">\t\t|";
  121. cout.precision(10);
  122. cout.setf(ios::fixed, ios::floatfield);
  123. cout << tmp << "\t\t\t |\n";
  124. }
  125. }
  126. czasStop = clock();
  127. cout << "| Stopien:\t| Przedzial:\t\t| Blad aproksymacji:\t\t |" << endl << "--------------------------------------------------------------------------\n";
  128. cout << "Funkcja aproksymowana sin(2*wekX[i] + wekX[i])-----------------------------------" << endl << "Liczba wezlow = 50 -------------------------------------------------------\n";
  129. cout << "Minimalny blad aproksymacji wynosi: " << min << ", dla stopnia: " << sMin << " oraz przedzialu: <" << -pMin << "; " << pMin << ">\n" << "Czas wykonywania sie programu: " << (long double)(czasStop - czasStart) / CLOCKS_PER_SEC << "[s]\n" << "Srednio na jedno sprawdzenie: " << ((long double)(czasStop - czasStart) / CLOCKS_PER_SEC) / (5 * 20) << "[s]" << endl;
  130. cout << "nacis enter";
  131. cin >> enter;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment