Advertisement
Slavik9510

Untitled

Dec 4th, 2022
498
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.22 KB | None | 0 0
  1. using System;
  2. namespace NewtonMethod
  3. {
  4.     class Program
  5.     {
  6.         static double phi1DerivByX(double x, double y)
  7.         {
  8.             double top, bottom;
  9.             top = (2 - Math.Log(y)) * Math.Cos(x * y) * y;
  10.             bottom = Math.Pow(Math.Sin(x * y), 2);
  11.             return -top / bottom;
  12.         }
  13.         static double phi1DerivByY(double x, double y)
  14.         {
  15.             double top, bottom;
  16.             top = Math.Sin(x * y) + x * y * (-2 + Math.Log(y)) * Math.Cos(x * y);
  17.             bottom = y * Math.Pow(Math.Sin(x * y), 2);
  18.             return -top / bottom;
  19.         }
  20.         static double phi2DerivByX(double x, double y)
  21.         {
  22.             return -Math.Pow(Math.E, x - 3 * y) - x * Math.Pow(Math.E, x - 3 * y);
  23.         }
  24.         static double phi2DerivByY(double x, double y)
  25.         {
  26.             return 3 * x * Math.Pow(Math.E, x - 3 * y) - 45.0 / (Math.Pow(Math.E, Math.E * y));
  27.         }
  28.         static double func1DerivByX(double x, double y)
  29.         {
  30.             return Math.Sin(x * y) + x * y * Math.Cos(x * y);
  31.         }
  32.         static double func1DerivByY(double x, double y)
  33.         {
  34.             return x * x * Math.Cos(x * y) - 1 / y;
  35.         }
  36.         static double func2DerivByX(double x, double y)
  37.         {
  38.             return Math.Pow(Math.E, x) + x * Math.Pow(Math.E, x);
  39.         }
  40.         static double func2DerivByY(double x, double y)
  41.         {
  42.             return Math.Pow(Math.E, 3*y) + 3 * y * Math.Pow(Math.E, 3*y);
  43.         }
  44.         static double func1(double x, double y)
  45.         {
  46.             return x * Math.Sin(x * y) - Math.Log(y) - 2;
  47.         }
  48.         static double func2(double x, double y)
  49.         {
  50.             return x * Math.Pow(Math.E, x) + y * Math.Pow(Math.E, 3 * y) - 15;
  51.         }
  52.         static double jacobian(double x, double y)
  53.         {
  54.             double jacobian = 0;
  55.             jacobian += func1DerivByX(x, y) * func2DerivByY(x, y);
  56.             jacobian -= func2DerivByX(x, y) * func1DerivByY(x, y);
  57.  
  58.             return jacobian;
  59.         }
  60.         static double deltaX(double x, double y)
  61.         {
  62.             double deltaX = 0;
  63.             if (jacobian(x, y) != 0)
  64.             {
  65.                 deltaX += func1(x, y) * func2DerivByY(x, y);
  66.                 deltaX -= func2(x, y) * func1DerivByY(x, y);
  67.                 deltaX /= -jacobian(x, y);
  68.             }
  69.             else
  70.             {
  71.                 Console.WriteLine("Jacobian = 0. Delta x can not be calculated!");
  72.                 Environment.Exit(1);
  73.             }
  74.             return deltaX;
  75.         }
  76.         static double deltaY(double x, double y)
  77.         {
  78.             double deltaY = 0;
  79.             if (jacobian(x, y) != 0)
  80.             {
  81.                 deltaY += func2(x, y) * func1DerivByX(x, y);
  82.                 deltaY -= func1(x, y) * func2DerivByX(x, y);
  83.                 deltaY /= -jacobian(x, y);
  84.             }
  85.             else
  86.             {
  87.                 Console.WriteLine("Jacobian = 0. Delta y can not be calculated!");
  88.                 Environment.Exit(1);
  89.             }
  90.             return deltaY;
  91.         }
  92.         static void findRoots()
  93.         {
  94.             double Xn = 1.5;
  95.             double Yn = 0.5;
  96.  
  97.             double xDif = Math.Abs(phi1DerivByX(Xn, Yn)) + Math.Abs(phi2DerivByX(Xn, Yn));
  98.             double yDif = Math.Abs(phi1DerivByY(Xn, Yn)) + Math.Abs(phi2DerivByY(Xn, Yn));
  99.  
  100.             if (xDif < 1 && yDif < 1)
  101.             {
  102.                 Console.WriteLine("Процес не збіжний");
  103.             }
  104.  
  105.             double xPrev;
  106.             double yPrev;
  107.  
  108.             int iteration = 0;
  109.             do
  110.             {
  111.                 Console.WriteLine($"Iteration: {iteration:D2} X = {Xn:F4} Y = {Yn:F4}");
  112.                 xPrev = Xn;
  113.                 yPrev = Yn;
  114.  
  115.                 Xn = xPrev + deltaX(xPrev, yPrev);
  116.                 Yn = yPrev + deltaY(xPrev, yPrev);
  117.                 iteration++;
  118.             } while (Math.Abs(Xn - xPrev) + Math.Abs(Yn - yPrev) > 0.001);
  119.  
  120.             Console.WriteLine("\nКоренi:");
  121.             Console.WriteLine($"X = {Xn}");
  122.             Console.WriteLine($"Y = {Yn}");
  123.         }
  124.         static void Main(string[] args)
  125.         {
  126.             findRoots();
  127.         }
  128.     }
  129. }
  130.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement