Advertisement
Guest User

Untitled

a guest
May 22nd, 2018
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.65 KB | None | 0 0
  1.  
  2. #include <iostream>
  3. #include <fstream>
  4. #include <cmath>
  5. using namespace std;
  6.  
  7. double function(double x)//прописана исходная функция, которую приближаем
  8. {
  9. return x * x * x;
  10. }
  11.  
  12. //прописываем функцию для решения трехдиагональной матрицы методом прогонки. По порядку что такое аругменты: размерность матрицы, нижняя диагональ, средняя диагональ, верхняя диагональ, свободный вектор, массив который получаем на выходе(коэфициенты для посторения сплайна)
  13. void progonka(int n, double *A, double *B, double *C, double *F, double *M) {
  14.  
  15. double *alpha = new double[n];
  16. double *beta = new double[n];
  17. alpha[1] = -C[0] / B[0];
  18. beta[1] = F[0] / B[0];
  19.  
  20. for (int i = 1; i < n; i++)
  21. {
  22. alpha[i + 1] = -C[i] / (B[i] + A[i] * alpha[i]);
  23. beta[i + 1] = (F[i] - A[i] * beta[i]) / (B[i] + A[i] * alpha[i]);
  24. }
  25. M[n] = (F[n] - beta[n] * A[n]) / (B[n] + A[n] * alpha[n]);
  26. for (int i = n - 1; i >= 0; i--)
  27. M[i] = alpha[i + 1] * M[i + 1] + beta[i + 1];
  28. }
  29.  
  30. int main()
  31. {
  32. ofstream fout("Значения.txt");
  33. ofstream fout1("ЗначенияФ.txt");
  34. int n, i;
  35. double x0, z, a, b, dfa, dfb;
  36. //вводим (количество точек-1), начало отрезка, конец отрезка, произвоную на левом конце, производную на правом конце
  37. cin >> n;
  38. cin >> a;
  39. cin >> b;
  40. cin >> dfa;
  41. cin >> dfb;
  42. double *x = new double[n + 1];
  43. double *y = new double[n + 1];
  44. double *h = new double[n + 1];
  45. double *A = new double[n + 1];
  46. double *B = new double[n + 1];
  47. double *C = new double[n + 1];
  48. double *F = new double[n + 1];
  49. double *M = new double[n + 1];
  50.  
  51. for (i = 0; i <= n; i++)
  52. {
  53. //вводим точки для разбиения отрезка(х[i]) и точное значении исходной функции (y[i])
  54. //массивы заполняются нулями просто так, этого можно не делать
  55. cin >> x[i];
  56. cin >> y[i];
  57. h[i] = 0;
  58. B[i] = 0;
  59. C[i] = 0;
  60. A[i] = 0;
  61. F[i] = 0;
  62. M[i] = 0;
  63. }
  64. //теперь заполняем массив длин отрезков
  65. for (i = 1; i <= n; i++)
  66. h[i] = x[i] - x[i - 1];
  67. //массив элементов средней диагонали
  68. for (i = 1; i < n; i++)
  69. B[i] = (h[i] + h[i + 1]) / 3.0;
  70.  
  71. B[0] = h[1] / 3.0;
  72. B[n] = h[n] / 3.0;
  73.  
  74. //массив элементов верхней диагонали
  75. for (i = 0; i < n; i++)
  76. C[i] = h[i + 1] / 6.0;
  77. //массив элементов нижней диагонали
  78. for (i = 1; i <= n; i++)
  79. A[i] = h[i] / 6.0;
  80. //массив свободного вектора
  81. for (i = 1; i < n; i++)
  82. {
  83. F[i] = (y[i + 1] - y[i]) / h[i + 1] - (y[i] - y[i - 1]) / h[i];
  84. }
  85. F[0] = (y[1] - y[0]) / h[1] - dfa;
  86. F[n] = dfb - (y[n] - y[n - 1]) / h[n];
  87. //выполняем прогонку
  88. progonka(n, A, B, C, F, M);
  89. //вводим какую-нибудь точку отрезка, для того чтобы вычислить приближенное значение в ней (если Барахнин попросит)
  90. cin >> x0;
  91. i = 1;
  92. //вычислем значение в этой точке
  93. while (x[i] < x0) i++;
  94. z = (M[i - 1] * pow(x[i] - x0, 3.) + M[i] * pow(x0 - x[i - 1], 3.) + (6.0 * y[i - 1] - M[i - 1] * h[i] * h[i])*(x[i] - x0)
  95. + (6.0 * y[i] - M[i] * h[i] * h[i])*(x0 - x[i - 1])) / (6.0 * h[i]);
  96. cout << z << endl;
  97. //z-значение в этой точке
  98.  
  99. //теперь выводим в файл набор значений в 10к равномерно расположенных точек, чтобы потом построить график (можно сделать чуть проще и переписать вывод, тогда графики можно будет строить в экселе и не париться)
  100. for (x0 = a; x0 <= b; x0 += (b - a) / 10000) {
  101. i = 1;
  102. while (x[i] < x0) i++;
  103. z = (M[i - 1] * pow(x[i] - x0, 3.) + M[i] * pow(x0 - x[i - 1], 3.) + (6. * y[i - 1] - M[i - 1] * h[i] * h[i])*(x[i] - x0)
  104. + (6. * y[i] - M[i] * h[i] * h[i])*(x0 - x[i - 1])) / (6. * h[i]);
  105. fout << z << endl;
  106. }
  107.  
  108. //так же в файл выводим точные знаения функции в этих же точках
  109. for (x0 = a; x0 <= b; x0 += (b - a) / 10000) {
  110. z = function(x0);
  111. fout1 << z << endl;
  112. }
  113.  
  114. fout.close();
  115. fout1.close();
  116. system("pause");
  117. return 0;
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement