Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.82 KB | None | 0 0
  1. // ConsoleApplication1.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "iostream"
  6. #include "cmath"
  7.  
  8.  
  9. using namespace std;
  10. void xI(double nach, double kon, double *a, double n)
  11. {
  12.     a[0] = nach;
  13.     for (int i = 1; i < n; ++i)
  14.         a[i] = a[i - 1] + ((kon - nach) / (n - 1));
  15.  
  16. }
  17.  
  18. void pxI(double *p, double *a, double n)
  19. {
  20.    
  21.     for (int i = 0; i < n; ++i)
  22.         p[i] = -a[i]*a[i] - 1;
  23.  
  24. }
  25.  
  26. void qxI(double *q, double *a, double n)
  27. {
  28.  
  29.     for (int i = 0; i < n; ++i)
  30.         q[i] = a[i] *4;
  31.  
  32. }
  33.  
  34. void fxi(double *a, double *f, double m, double n)
  35. {
  36.     for (int i = 0; i < n; ++i)
  37.         f[i] = 4 - 4 * a[i] * a[i] * a[i] + 4 * m*a[i];
  38. }
  39.  
  40.  
  41. void matrix(double *y0, double *y1, double *y2, double *y3, double *y4, double *q, double *p, double *f, double *svch, double n, double h, double o, double l, double *ksi, double *eta)
  42. {
  43.     y0[1] = 0;
  44.     for (int i = 2; i < n - 1; ++i)
  45.         y0[i] = 1 - (p[i] * h) / 2;
  46.     //////////////////
  47.     for (int i = 1; i < n - 1; ++i)
  48.         y1[i] = q[i] * h*h - 2;
  49.     /////////////////
  50.     for (int i = 1; i < n - 2; ++i)
  51.         y2[i] = 1 + (p[i] * h) / 2;
  52.     y2[3] = 0;
  53.     /////////////////
  54.     svch[1] = h*h*f[1] - (1 - (h*p[1]) / 2)*o;
  55.     for (int i = 2; i < n - 2; ++i)
  56.         svch[i] = h*h*f[i];
  57.     svch[3] = svch[3] = h*h*f[3] - (1 + (h*p[3]) / 2)*l;
  58.  
  59.         ////////////////
  60.     ksi[1] = -y2[1] / y1[1];
  61.     for (int i = 2; i < n - 1; ++i)
  62.         ksi[i] = -y2[i] / (y0[i] * ksi[i - 1] + y1[i]);
  63.  
  64.     //////////////////////////////
  65.     eta[1] = svch[1] / y1[1];
  66.     for (int i = 2; i < n - 1; ++i)
  67.         eta[i] = (svch[i] - y0[i] * eta[i - 1]) / (y0[i] * ksi[i - 1] + y1[i]);
  68. }
  69.  
  70.  
  71. //дописать нахождение обратной матрицы
  72. void obrmatr(double *yk, double *ytoch, double *dy, double *a, double n, double m, double o, double l, double *eta, double *ksi)
  73. {
  74.    
  75.     yk[0] = o;
  76.     yk[3] = eta[3];
  77.     yk[4] = l;
  78.     for (int i = 2; i > 0; --i)
  79.         yk[i] = ksi[i] * yk[i + 1] + eta[i];
  80.    
  81.  
  82.     for (int i = 0; i < n; ++i)
  83.         ytoch[i] = (a[i])*(a[i])*(a[i])*(a[i]) - 4 * a[i] + m;
  84.  
  85.  
  86.     for(int i=0;i<n;++i)
  87.     dy[i] = abs(ytoch[i] - yk[i]);
  88.  
  89. }
  90.  
  91.  
  92.  
  93. void matrix2(double *y0, double *y1, double *y2, double *q, double *p, double *f, double *svch, double n, double h, double o, double l, double *ksi, double *eta )
  94. {
  95.    
  96.     y0[1] = 0;
  97.     for (int i = 2; i < n-1; ++i)
  98.         y0[i] = 1 - (p[i] * h) / 2;
  99.     //////////////////
  100.     for (int i = 1; i < n-1; ++i)
  101.         y1[i] = q[i] * h*h - 2;
  102.     /////////////////
  103.     for (int i = 1; i < n-2; ++i)
  104.     y2[i] = 1 + (p[i] * h) / 2;
  105.     y2[7] = 0;
  106.     /////////////////
  107.     svch[1] = h*h*f[1] - (1 - (h*p[1]) / 2)*o;
  108.     for (int i = 2; i < n - 2; ++i)
  109.         svch[i] = h*h*f[i];
  110.     svch[7]= svch[7] = h*h*f[7] - (1 + (h*p[7]) / 2)*l;
  111.     /////////////////
  112.     ksi[1] = -y2[1] / y1[1];
  113.     for (int i = 2; i < n-1; ++i)
  114.         ksi[i] = -y2[i]/(y0[i]*ksi[i-1]+y1[i]);
  115.  
  116.     //////////////////////////////
  117.     eta[1] = svch[1]/y1[1];
  118.     for (int i = 2; i < n-1; ++i)
  119.         eta[i] = (svch[i]-y0[i]*eta[i-1])/(y0[i]*ksi[i-1]+y1[i]);
  120. }
  121.  
  122.  
  123.  
  124. void obrmatr2(double *yk, double *ytoch, double *dy, double *a, double n, double m, double o, double l, double *eta, double *ksi)
  125. {
  126.    
  127.     yk[0] = o;
  128.     yk[7] = eta[7];
  129.     yk[8] = l;
  130.     for (int i = n-3; i > 0; --i)
  131.     {
  132.         yk[i] = ksi[i] * yk[i + 1] + eta[i];
  133.     }
  134.  
  135.     ytoch[0] = o;
  136.     ytoch[8] = l;
  137.     for (int i = 1; i < n-1; ++i)
  138.         ytoch[i] = (a[i])*(a[i])*(a[i])*(a[i]) - 4 * a[i] + m;
  139.  
  140.  
  141.     for (int i = 0; i<n; ++i)
  142.         dy[i] = abs(ytoch[i] - yk[i]);
  143.  
  144. }
  145.  
  146. void Dyi(double *e, double *d, double *b, double n, double *ytoch)
  147. {
  148.     d[0] = b[0];
  149.     for (int h = 1, i = 2; i < n; i += 2)
  150.     {
  151.         d[i] = b[i - h];
  152.         h++;
  153.     }
  154.  
  155.     for (int i = 1; i < n; i += 2)
  156.         d[i] = (d[i - 1] + d[i + 1]) / 2;
  157.  
  158.  
  159.     for (int i = 0; i < n; ++i)
  160.  
  161.         e[i] = fabs(d[i] - ytoch[i]);
  162.  
  163. }
  164.  
  165.  
  166. void Dyk(double *g, double *yk, double *ytoch, double n)
  167. {
  168.     for (int i = 0; i < n; ++i)
  169.         g[i] = fabs(yk[i] - ytoch[i]);
  170. }
  171.  
  172. void Rk(double *r, double *d, double *yk, double n)
  173. {
  174.  
  175.     for (int i = 1; i < n; i+=2)
  176.         r[i] = fabs(yk[i] - d[i]);
  177.  
  178.    
  179. }
  180.  
  181. double max;
  182.  
  183. int main()
  184. {
  185.     setlocale(LC_ALL, "Russian");
  186.  
  187.     //Объявление массивов под значения
  188.     double* a;
  189.     double* b;
  190.     double* d;
  191.     double* e;
  192.     double* g;
  193.     double* r;
  194.     double* p;
  195.     double* q;
  196.     double* f;
  197.     double* y0;
  198.     double* y1;
  199.     double* y2;
  200.     double* y3;
  201.     double* y4;
  202.     double* svch;
  203.     double* ytoch;
  204.     double* dy;
  205.     double* ksi;
  206.     double* eta;
  207.     double* yk;
  208.  
  209.  
  210.  
  211.     //Объявляем количество на которое делим отрезок от а до b
  212.     int n;
  213.  
  214.     //Объявление под переменные а b h
  215.     double nach, kon, o, l, m;
  216.     double h;
  217.     double Eps;
  218.  
  219.  
  220.  
  221.     bool flag = false;
  222.  
  223.     cout << "Введите n в формате (n+1)" << endl;
  224.     cout << "n= ";
  225.     cin >> n;
  226.  
  227.     cout << "Введите а" << endl;
  228.     cout << "а= ";
  229.     cin >> nach;
  230.  
  231.     cout << "Введите b" << endl;
  232.     cout << "b= ";
  233.     cin >> kon;
  234.  
  235.     cout << "Введите M" << endl;
  236.     cout << "M= ";
  237.     cin >> m;
  238.  
  239.     cout << "Введите Y_-2" << endl;
  240.     cout << "Y_-2= ";
  241.     cin >> o;
  242.  
  243.     cout << "Введите Y_-1" << endl;
  244.     cout << "Y_-1= ";
  245.     cin >> l;
  246.  
  247.     cout << "Введите точность" << endl;
  248.     cout << "Eps= ";
  249.     cin >> Eps;
  250.  
  251.  
  252.  
  253.     do
  254.     {
  255.  
  256.     //Выделение памяти под массивы
  257.     a = new double[n];
  258.     b = new double[n];
  259.     p= new double[n];
  260.     q = new double[n];
  261.     f = new double[n];
  262.     y0 = new double[n];
  263.     y1 = new double[n];
  264.     y2 = new double[n];
  265.     y3 = new double[n];
  266.     y4 = new double[n];
  267.     svch = new double[n];
  268.     yk = new double[n];
  269.     ytoch = new double[n];
  270.     dy = new double[n];
  271.     eta = new double[n];
  272.     ksi  = new double[n];
  273.  
  274.  
  275.  
  276.     h = (kon - nach) / (n-1);
  277.  
  278.  
  279.  
  280.     xI(nach, kon, a, n);
  281.     pxI(p, a, n);
  282.     qxI(q, a, n);
  283.     fxi(a, f, m, n);
  284.     matrix(y0, y1, y2, y3, y4, q, p, f, svch, n, h, o, l, ksi, eta);
  285.     obrmatr(yk, ytoch, dy, a, n, m, o, l, eta, ksi);
  286.     /*
  287.  
  288.     for (int i = 0; i < n; ++i)
  289.         cout << "xi 0.25[" << i << "]= " << a[i] << endl;
  290.    
  291.  
  292.     for (int i = 0; i < n; ++i)
  293.         cout << "pxi 0.25[" << i << "]= " << p[i] << endl;
  294.  
  295.  
  296.     for (int i = 0; i < n; ++i)
  297.         cout << "qxi 0.25[" << i << "]= " << q[i] << endl;
  298.  
  299.  
  300. for (int i = 0; i < n; ++i)
  301.         cout << "fxi 0.25[" << i << "]= " << f[i] << endl;
  302.  
  303.     for (int i = 0; i < n; ++i)
  304.         cout << "y0 0.25[" << i << "]= " << y0[i] << endl;
  305.  
  306. for (int i = 1; i < n-1; ++i)
  307.         cout << "y1 0.25[" << i << "]= " << y1[i] << endl;
  308.  
  309.     for (int i = 1; i < n-1; ++i)
  310.         cout << "y2 0.25[" << i << "]= " << y2[i] << endl;
  311.  
  312.    
  313.     for (int i = 0; i < n; ++i)
  314.         cout << "свободный член 0.25[" << i << "]= " << svch[i] << endl;
  315.  
  316.     for (int i = 1; i < n-1; ++i)
  317.         cout << "ksi 0.25[" << i << "]= " << ksi[i] << endl;
  318.  
  319.     for (int i = 1; i < n-1; ++i)
  320.         cout << "eta 0.25[" << i << "]= " << eta[i] << endl;
  321.  
  322.     for (int i = 0; i < n; ++i)
  323.         cout << "yi 0.25[" << i << "]= " << yk[i] << endl;
  324.  
  325.     for (int i = 0; i < n; ++i)
  326.         cout << "y точное 0.25[" << i << "]= " << ytoch[i] << endl;
  327.  
  328.     for (int i = 0; i < n; ++i)
  329.         cout << "погрешность 0.25[" << i << "]= " << dy[i] << endl;
  330.         */
  331.    
  332.     for (int i = 0; i < n; ++i)
  333.         b[i] = yk[i];
  334.  
  335.  
  336.     n = n * 2 - 1;
  337.     h = (kon - nach) / (n-1);
  338.  
  339.  
  340.  
  341.     a = new double[n];
  342.     p = new double[n];
  343.     q = new double[n];
  344.     f = new double[n];
  345.     yk = new double[n];
  346.     d = new double[n];
  347.     e = new double[n];
  348.     g = new double[n];
  349.     r = new double[n];
  350.     f = new double[n];
  351.     y0 = new double[n];
  352.     y1 = new double[n];
  353.     y2 = new double[n];
  354.     svch = new double[n];
  355.     eta = new double[n];
  356.     ksi = new double[n];
  357.     ytoch = new double[n];
  358.     dy = new double[n];
  359.  
  360.  
  361.     xI(nach, kon, a, n);
  362.     pxI(p, a, n);
  363.     qxI(q, a, n);
  364.     fxi(a, f, m, n);
  365.     matrix2(y0, y1, y2, q, p, f, svch, n, h, o, l, ksi, eta);
  366.     obrmatr2(yk, ytoch, dy, a, n, m, o, l, eta, ksi);
  367.  
  368.     Dyi(e, d, b, n, ytoch);
  369.     Dyk(g, yk, ytoch, n);
  370.     Rk(r, d, yk, n);
  371.    
  372.  
  373.  
  374.     max = 0;
  375.  
  376.     for (int i = 1; i < n; i+=2)
  377.     {
  378.         if (r[i] > max)
  379.             max = r[i];
  380.     }
  381.  
  382.     for (int i = 1; i < n; i+=2)
  383.     {
  384.         if (max < Eps)
  385.         {
  386.             flag = true;
  387.  
  388.             cout << "otvet=" << "r[" << i << "]=" << r[i] << endl;
  389.  
  390.             //cout << setiosflags(ios::fixed) << setprecision(3) << r[i] << endl;
  391.  
  392.         }
  393.     }
  394.     if (!flag)
  395.         n = n * 2 - 1;
  396.  
  397.     } while (!flag);
  398.  
  399.     /*
  400.  
  401.     for (int i = 0; i < n; ++i)
  402.         cout << "xi 0.125[" << i << "]= " << a[i] << endl;
  403.  
  404.  
  405.     for (int i = 0; i < n; ++i)
  406.         cout << "pxi 0.125[" << i << "]= " << p[i] << endl;
  407.  
  408.  
  409.     for (int i = 0; i < n; ++i)
  410.         cout << "qxi 0.125[" << i << "]= " << q[i] << endl;
  411.  
  412.  
  413.     for (int i = 0; i < n; ++i)
  414.         cout << "fxi 0.125[" << i << "]= " << f[i] << endl;
  415.  
  416.     for (int i = 1; i < n-1; ++i)
  417.         cout << "y0 0.25[" << i << "]= " << y0[i] << endl;
  418.  
  419.     for (int i = 1; i < n - 1; ++i)
  420.         cout << "y1 0.25[" << i << "]= " << y1[i] << endl;
  421.  
  422.     for (int i = 1; i < n - 1; ++i)
  423.         cout << "y2 0.25[" << i << "]= " << y2[i] << endl;
  424.  
  425.     for (int i = 1; i < n - 1; ++i)
  426.         cout << "свободный член 0.125[" << i << "]= " << svch[i] << endl;
  427.  
  428.     for (int i = 1; i < n - 1; ++i)
  429.         cout << "ksi 0.125[" << i << "]= " << ksi[i] << endl;
  430.  
  431.     for (int i = 1; i < n - 1; ++i)
  432.         cout << "eta 0.125[" << i << "]= " << eta[i] << endl;
  433.  
  434.     for (int i = 0; i < n; ++i)
  435.         cout << "yk 0.125[" << i << "]= " << yk[i] << endl;
  436.  
  437.     for (int i = 0; i < n; ++i)
  438.         cout << "y точное 0.125[" << i << "]= " << ytoch[i] << endl;
  439.  
  440.     for (int i = 0; i < n; ++i)
  441.         cout << "погрешность 0.125[" << i << "]= " << dy[i] << endl;
  442.  
  443.  
  444.    
  445.  
  446.     for (int i = 0; i < n; ++i)
  447.         cout << "Dyi[" << i << "]= " << e[i] << endl;
  448.  
  449.     for (int i = 0; i < n; ++i)
  450.         cout << "Dyk[" << i << "]= " << g[i] << endl;
  451. */
  452.     for (int i = 1; i < n; i += 2)
  453.         cout << "Rung[" << i << "]= " << r[i] << endl;
  454.    
  455.     delete[] a;
  456.     delete[] b;
  457.     delete[] d;
  458.     delete[] e;
  459.     delete[] g;
  460.     delete[] r;
  461.     delete[] p;
  462.     delete[] q;
  463.     delete[] f;
  464.     delete[] y0;
  465.     delete[] y1;
  466.     delete[] y2;
  467.     delete[] y3;
  468.     delete[] y4;
  469.     delete[] svch;
  470.     delete[] ytoch;
  471.     delete[] dy;
  472.     delete[] ksi;
  473.     delete[] eta;
  474.     delete[] yk;
  475.  
  476.     system("pause");
  477. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement