Khristina

Тест 1 "ур-е Лапласа" (внут. сфера) (новая формула)

May 7th, 2019
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.46 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <cstring>
  4. #include <math.h>
  5. #include <cstdlib>
  6. #include <ctime>
  7. #include <cmath>
  8. #include <algorithm>
  9. using namespace std;
  10.  
  11. double epsilonJ(double H, double Q, double betta)
  12. {
  13.     double epsilon;
  14.     epsilon = (H / 2.0) + (Q * 1.0 / (betta * betta));
  15.     return epsilon;
  16. }
  17.  
  18. double betta0J(double delta, double H, double P, double betta)
  19. {
  20.     double betta0;
  21.     betta0 = ((delta * H) + (2 * P)) / (2.0 * betta * betta);
  22.     //cout << '\a';
  23.     return betta0;
  24. }
  25.  
  26. double hi0J(double H, double Q, double r, double betta)
  27. {
  28.     double hi0;
  29.     hi0 = (H * H / 4.0) + (((H * Q) + (r * r)) / (betta * betta));
  30.     return hi0;
  31. }
  32.  
  33. double I3J(double epsilon1, double deltaplus, double deltaminus, double zplus, double zminus)
  34. {
  35.     double I3 = 0;
  36.     if (fabs(deltaplus) > pow(10, -10))
  37.     {
  38.         if (((epsilon1 * epsilon1) - (deltaplus * deltaminus)) > pow(10, -10)) //+
  39.         {
  40.             I3 = (log(fabs(((deltaplus * zplus) + epsilon1 - sqrt((epsilon1 * epsilon1) - (deltaplus * deltaminus))) / ((deltaplus * zplus) + epsilon1 + sqrt((epsilon1 * epsilon1) - (deltaplus * deltaminus))))) / (2 * sqrt((epsilon1 * epsilon1) - (deltaplus * deltaminus)))) - (log(fabs(((deltaplus * zminus) + epsilon1 - sqrt((epsilon1 * epsilon1) - (deltaplus * deltaminus))) / (((deltaplus * zminus) + epsilon1 + sqrt((epsilon1 * epsilon1) - (deltaplus * deltaminus)))))) / (2 * sqrt((epsilon1 * epsilon1) - (deltaplus * deltaminus))));
  41.         }
  42.  
  43.         else if (((epsilon1 * epsilon1) - (deltaplus * deltaminus)) < -pow(10, -10))
  44.         {
  45.             I3 = (atan(((deltaplus * zplus) + epsilon1) / (sqrt((deltaplus * deltaminus) - (epsilon1 * epsilon1)))) / sqrt((deltaplus * deltaminus) - (epsilon1 * epsilon1))) - (atan(((deltaplus * zminus) + epsilon1) / (1.0 * sqrt((deltaplus * deltaminus) - (epsilon1 * epsilon1)))) / sqrt((deltaplus * deltaminus) - (epsilon1 * epsilon1)));
  46.         }
  47.  
  48.         else if (fabs((epsilon1 * epsilon1) - (deltaplus * deltaminus)) <= pow(10, -10))
  49.         {
  50.             I3 = (1.0 / ((deltaplus * zminus) + epsilon1)) - (1.0 / ((deltaplus * zplus) + epsilon1));
  51.         }
  52.     }
  53.     else if (fabs(deltaplus) <= pow(10, -10))
  54.     {
  55.         if (fabs(epsilon1) > pow(10, -10))
  56.         {
  57.             I3 = (log(fabs((2 * epsilon1 * zplus) + deltaminus)) / (2.0 * epsilon1)) - (log(fabs((2.0 * epsilon1 * zminus) + deltaminus)) / (2.0 * epsilon1));
  58.         }
  59.         else
  60.         {
  61.             I3 = (zplus / deltaminus) - (zminus / deltaminus);
  62.         }
  63.     }
  64.  
  65.     return I3;
  66. }
  67.  
  68. double I2(double deltaplus, double zplus, double zminus, double epsilon1, double deltaminus)
  69. {
  70.     double I;
  71.     I = I3J(epsilon1, deltaplus, deltaminus, zplus, zminus);
  72.     double I2;
  73.     I2 = (((zplus - (epsilon1 * log(fabs((deltaplus * zplus * zplus) + (2 * epsilon1 * zplus) + deltaminus)) / deltaplus)) - (zminus - (epsilon1 * log(fabs((deltaplus * zminus * zminus) + (2 * epsilon1 * zminus) + deltaminus)) / deltaplus))) / deltaplus) + ((2 * epsilon1 * epsilon1) - (deltaplus * deltaminus)) * I / (deltaplus * deltaplus);
  74.     if (fabs(deltaplus) < pow(10, -10))
  75.     {
  76.         I2 = 0;
  77.     }
  78.     return I2;
  79. }
  80.  
  81. double I4(double deltaminus, double zplus, double zminus, double epsilon1, double deltaplus)
  82. {
  83.     double I4;
  84.     double I;
  85.     I = I3J(epsilon1, deltaplus, deltaminus, zplus, zminus);
  86.     if (fabs(deltaplus) > pow(10, -10))
  87.     {
  88.         I4 = (((-(1.0) / zplus) - (epsilon1 * log(zplus * zplus / fabs((deltaplus * zplus * zplus) + (2 * epsilon1 * zplus) + deltaminus)) / deltaminus) + ((1.0) / zminus) + (epsilon1 * log(zminus * zminus / fabs((deltaplus * zminus * zminus) + (2 * epsilon1 * zminus) + deltaminus)) / deltaminus)) / deltaminus) + (((2 * epsilon1 * epsilon1) - (deltaplus * deltaminus)) * I / (deltaminus * deltaminus));
  89.     }
  90.     else
  91.     {
  92.         if (fabs(epsilon1) > pow(10, -10))
  93.         {
  94.             I4 = (((-1.0) / (deltaminus * zplus)) + ((2 * epsilon1 * log(fabs(((2.0 * epsilon1 * zplus) + deltaminus) / zplus))) / (deltaminus * deltaminus))) + ((1.0) / (deltaminus * zminus)) - (2 * epsilon1 * log(fabs((2 * epsilon1 * zminus + deltaminus) / zminus))) / (deltaminus * deltaminus);
  95.         }
  96.  
  97.         else
  98.         {
  99.             I4 = (1.0 / (deltaminus * zminus)) - (1.0 / (deltaminus * zplus));
  100.         }
  101.     }
  102.  
  103.     return I4;
  104. }
  105.  
  106. double I1(double deltaplus, double hi1, double deltaminus, double zplus, double zminus, double epsilon1)
  107. {
  108.     double I1;
  109.     double II, III, IIII;
  110.     II = I2(deltaplus, zplus, zminus, epsilon1, deltaminus);
  111.     III = I3J(epsilon1, deltaplus, deltaminus, zplus, zminus);
  112.     IIII = I4(deltaminus, zplus, zminus, epsilon1, deltaplus);
  113.     I1 = (deltaplus * II / 2.0) - (hi1 * III) + (deltaminus * IIII / 2.0);
  114.     return I1;
  115. }
  116.  
  117. double I5(double U1, double U2, double k1, double k2)
  118. {
  119.     double I5;
  120.     if (fabs(k1) > pow(10, -10))
  121.     {
  122.         I5 = (-U2 + ((U2 + (1.0 * k2 / k1)) * log(fabs((k1 * U2) + k2)))) + U1 - ((U1 + (1.0 * k2 / k1)) * log(fabs((k1 * U1) + k2)));
  123.     }
  124.     else
  125.     {
  126.         I5 = (U2 - U1) * log(fabs(k2));
  127.     }
  128.     return I5;
  129. }
  130.  
  131. int main()
  132. {
  133.     int M = 100, N = 100;
  134.     long double V0 = 0, S0 = 0;
  135.     long double p = 0;
  136.     const double pi = 3.14159265358979;
  137.     double x1, x2, x3, x, y1, y2, y3, y11, y21, y31, h = 2.0 * pi / N, H = pi / (1.0 * M), etta, R;
  138.     double A = N * h, B = M * H;
  139.     double tetta, betta, y1prv, y2prv, y3prv, alfa, y1pru, y2pru, y3pru, delta;
  140.     double P, Q, r1, r2, r3, r;
  141.     double delta0, alfa0, epsilon, betta0, hi0, hi1;
  142.     double deltaplus, deltaminus, delta1, epsilon1;
  143.     double IH = 0, zminus, zplus, IminusH = 0;
  144.     double dzettaminus, dzettaplus;
  145.     setlocale(LC_ALL, "Rus");
  146.     for (int i = 1; i < 6; i++)
  147.     {
  148.         R = 1 - pow(10, (-1) * i);
  149.         cout << "R=" << R << endl;
  150.         p = 0;
  151.         for (int q = 0; q <= 2; q++)
  152.         {
  153.             double uq = pi * q / (1.0 * N);
  154.  
  155.             for (int l = 0; l <= 2 * M; l++)
  156.             {
  157.                 double vl = pi * l / (2.0 * M);
  158.                 y11 = sin(vl) * cos(uq); // !
  159.                 y21 = sin(vl) * sin(uq); // !
  160.                 y31 = cos(vl); // !
  161.                 x1 = y11 * R;
  162.                 x2 = y21 * R;
  163.                 x3 = y31 * R;
  164.                 x = sqrt((x1 * x1) + (x2 * x2) + (x3 * x3));
  165.  
  166.                 for (int m = 0; m < M; m++)
  167.                 {
  168.                     double vm = (m + 0.5) * H;
  169.                     for (int n = 0; n < N; n++)
  170.                     {
  171.                         double un = (n + 0.5) * h;
  172.                         y1 = sin(vm) * cos(un);
  173.                         y2 = sin(vm) * sin(un);
  174.                         y3 = cos(vm);
  175.                         y1prv = cos(un) * cos(vm);
  176.                         y2prv = sin(un) * cos(vm);
  177.                         y3prv = (-1) * sin(vm);
  178.                         y1pru = (-1) * sin(un) * sin(vm);
  179.                         y2pru = sin(vm) * cos(un);
  180.                         y3pru = 0.0;
  181.                         r1 = y1 - x1;
  182.                         r2 = y2 - x2;
  183.                         r3 = y3 - x3;
  184.                         r = sqrt((r1 * r1) + (r2 * r2) + (r3 * r3));
  185.                         betta = sqrt((y1prv * y1prv) + (y2prv * y2prv) + (y3prv * y3prv));
  186.                         etta = sin(vm);
  187.                         alfa = sqrt((y1pru * y1pru) + (y2pru * y2pru) + (y3pru * y3pru));
  188.                         delta = (y1pru * y1prv) + (y2pru * y2prv) + (y3pru * y3prv);
  189.                         P = (r1 * y1pru) + (r2 * y2pru) + (r3 * y3pru);
  190.                         Q = (r1 * y1prv) + (r2 * y2prv) + (r3 * y3prv);
  191.                         delta0 = delta * 1.0 / (betta * betta);
  192.                         alfa0 = fabs(alfa / betta); //!
  193.                         epsilon = epsilonJ(H, Q, betta);
  194.                         betta0 = betta0J(delta, H, P, betta);
  195.                         hi0 = hi0J(H, Q, r, betta);
  196.                         hi1 = sqrt(hi0 - (betta0 * betta0 / (alfa0 * alfa0)));
  197.                         epsilon1 = epsilon - (delta0 * betta0 / (alfa0 * alfa0));
  198.                         delta1 = delta0 * hi1 / alfa0;
  199.                         deltaplus = hi1 + delta1;
  200.                         deltaminus = hi1 - delta1;
  201.                         dzettaplus = ((alfa0 * h / 2.0) + (betta0 / alfa0)) / hi1;
  202.                         dzettaminus = (((-1) * alfa0 * h / 2.0) + (betta0 / alfa0)) / hi1;
  203.                         zplus = dzettaplus + sqrt((dzettaplus * dzettaplus) + 1);
  204.                         zminus = dzettaminus + sqrt((dzettaminus * dzettaminus) + 1);
  205.                         if (hi1 > pow(10, -10))
  206.                         {
  207.                             IH = hi1 * ((((dzettaplus * log(fabs(epsilon1 + (delta1 * dzettaplus) + (hi1 * sqrt((dzettaplus * dzettaplus) + 1))))) - (dzettaminus * log(fabs(epsilon1 + (delta1 * dzettaminus) + (hi1 * sqrt((dzettaminus * dzettaminus) + 1))))))) - I1(deltaplus, hi1, deltaminus, zplus, zminus, epsilon1)) / alfa0;
  208.                         }
  209.                         else if (fabs(hi1) <= pow(10, -10))
  210.                         {
  211.                             if (-h / 2.0 < (-betta0 / (alfa0 * alfa0)) && (-betta0 / (alfa0 * alfa0)) < h / 2.0)
  212.                             {
  213.                                 IH = I5(-h / 2.0, (-betta0 / (alfa0 * alfa0)), delta0 - alfa0, epsilon - (betta0 / alfa0)) + I5((-betta0 / (alfa0 * alfa0)), h / 2.0, delta0 + alfa0, epsilon + (betta0 / alfa0));
  214.                             }
  215.                             else if ((-betta0 / (alfa0 * alfa0)) >= h / 2)
  216.                             {
  217.                                 IH = I5(-h / 2.0, h / 2.0, delta0 - alfa0, epsilon - (betta0 / alfa0));
  218.                             }
  219.                             else if ((-betta0 / (alfa0 * alfa0)) <= -h / 2.0)
  220.                             {
  221.                                 IH = I5(-h / 2.0, h / 2.0, delta0 + alfa0, epsilon + (betta0 / alfa0));
  222.                             }
  223.                         }
  224.                         epsilon = epsilonJ(-H, Q, betta);
  225.                         betta0 = betta0J(delta, -H, P, betta);
  226.                         hi0 = hi0J(-H, Q, r, betta);
  227.                         hi1 = sqrt(hi0 - (betta0 * betta0 / (alfa0 * alfa0)));
  228.                         epsilon1 = epsilon - (delta0 * betta0 / (alfa0 * alfa0));
  229.                         delta1 = delta0 * hi1 / alfa0;
  230.                         deltaplus = hi1 + delta1;
  231.                         deltaminus = hi1 - delta1;
  232.                         dzettaplus = ((alfa0 * h / 2.0) + (betta0 / alfa0)) / hi1;
  233.                         dzettaminus = ((-alfa0 * h / 2.0) + (betta0 / alfa0)) / hi1;
  234.                         zplus = dzettaplus + sqrt(dzettaplus * dzettaplus + 1.0);
  235.                         zminus = dzettaminus + sqrt(dzettaminus * dzettaminus + 1.0);
  236.                         if (hi1 > pow(10, -10))
  237.                         {
  238.                             IminusH = hi1 * ((((dzettaplus * log(fabs(epsilon1 + (delta1 * dzettaplus) + (hi1 * sqrt((dzettaplus * dzettaplus) + 1.0))))) - (dzettaminus * log(fabs(epsilon1 + (delta1 * dzettaminus) + (hi1 * sqrt((dzettaminus * dzettaminus) + 1.0))))))) - I1(deltaplus, hi1, deltaminus, zplus, zminus, epsilon1)) / alfa0;
  239.                         }
  240.                         else if (fabs(hi1) <= pow(10, -10))
  241.                         {
  242.                             if (-h / 2.0 < (-betta0 / (alfa0 * alfa0)) && (-betta0 / (alfa0 * alfa0)) < h / 2.0)
  243.                             {
  244.                                 IminusH = I5(-h / 2.0, (-betta0 / (alfa0 * alfa0)), delta0 - alfa0, epsilon - (betta0 / alfa0)) + I5((-betta0 / (alfa0 * alfa0)), h / 2.0, delta0 + alfa0, epsilon + (betta0 / alfa0));
  245.                             }
  246.                             else if ((-betta0 / (alfa0 * alfa0)) >= h / 2.0)
  247.                             {
  248.                                 IminusH = I5(-h / 2.0, h / 2.0, delta0 - alfa0, epsilon - (betta0 / alfa0));
  249.                             }
  250.                             else if ((-betta0 / (alfa0 * alfa0)) <= -h / 2.0)
  251.                             {
  252.                                 IminusH = I5(-h / 2.0, h / 2.0, delta0 + alfa0, epsilon + (betta0 / alfa0));
  253.                             }
  254.                         }
  255.                         tetta = 1.0 * (IH - IminusH) / betta;
  256.                         S0 = S0 + (etta * tetta);
  257.                     }
  258.                 }
  259.                 if (fabs(x) < 1)
  260.                 {
  261.                     V0 = 4 * pi;
  262.                 }
  263.                 else if (fabs(x) > 1)
  264.                 {
  265.                     V0 = 4.0 * pi / fabs(x);
  266.                 }
  267.                 //cout << S0 << endl;
  268.                 //cout << V0 << endl;
  269.                 long double maximum = max(p, (fabs(S0 - V0) * 1.0 / fabs(V0)));
  270.                 S0 = 0;
  271.                 p = maximum;
  272.             }
  273.         }
  274.         cout << "Относительная погрешность=" << p << endl;
  275.         cout << "______________________" << endl;
  276.     }
  277.  
  278.     return 0;
  279. }
Add Comment
Please, Sign In to add comment