chillurbrain

Lab

Oct 6th, 2015
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.58 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace ConsoleApplication8
  8. {
  9.     class Program
  10.     {
  11.         const int n = 2;
  12.         const double eps = 1e-11;
  13.         /*Задание функции
  14.          х - столбец значений неизвестных
  15.          i - номер функции в системе*/
  16.         static double func(double[] x, int i)
  17.         {
  18.             switch (i)
  19.             {
  20.                 case 0:
  21.                     return (Math.Sin(x[0])+2*(x[1]) - 2); //вычисляем значение первой функции
  22.                 case 1:
  23.                     return (Math.Cos(x[1] - 1) + x[0] -0.7);   //вычисляем значение второй функции
  24.             }
  25.             throw new ArgumentException();
  26.         }
  27.         /*Задание якобиана
  28.          * х - столбец значений неизвестных
  29.          * i,j индексы элементов якобиана
  30.          * i - номер строки
  31.          * j - номер столбца
  32.          */
  33.         static double jacobian(double[] x, int i, int j)
  34.         {
  35.             switch (i)
  36.             {
  37.                 case 0:
  38.                     switch (j)
  39.                     {
  40.                         case 0:
  41.                             return (Math.Cos(x[0]));
  42.                         case 1:
  43.                             return (2);
  44.                     }
  45.                     break;
  46.                 case 1:
  47.                     switch (j)
  48.                     {
  49.                         case 0:
  50.                             return(1);
  51.                         case 1:
  52.                             return(-1 * Math.Sin(x[1] - 1));
  53.                     }
  54.                     break;
  55.  
  56.             }
  57.             throw new ArgumentException();
  58.         }
  59.         //вывод вектора
  60.         static void vivod_vectr(double[] vect)
  61.         {
  62.             for (int j = 0; j < n; j++)
  63.             {
  64.                 Console.WriteLine("x{0} = {1}", j, vect[j]);
  65.             }
  66.         }
  67.  
  68.         static void simq(int nn, double[,] a, double[] bb)
  69.         {
  70.             const double eps1 = 1e-21;
  71.             double max, u, v;
  72.             int ks, k1;
  73.             double[,] aa = new double[n,n+1];
  74.             for (int i = 0; i < nn; i++)
  75.             {
  76.                 aa[i, nn + 1] = bb[i];
  77.             }
  78.             for (int i = 0; i < nn; i++)
  79.             {
  80.                 for (int j = 0; j < nn; j++)
  81.                 {
  82.                     aa[i, j] = a[i, j];
  83.                 }
  84.             }
  85.             for (int i = 0; i < nn; i++)
  86.             {
  87.                 max = Math.Abs(aa[i,i]);
  88.                 k1 = i;
  89.                 for (int l = (i+1); l < nn ; l++)
  90.                 {
  91.                     if (Math.Abs(aa[l, i]) > max)
  92.                     {
  93.                         max = Math.Abs(aa[l,i]);
  94.                         k1 = l;
  95.                     }
  96.                 }
  97.                 if (max < eps1)
  98.                 {
  99.                     ks = 1;
  100.                     break;
  101.                 }
  102.                 else
  103.                     ks = 0;
  104.                 if (k1 != i)
  105.                 {
  106.                     for (int j = 0; j < (nn+1); j++)
  107.                     {
  108.                         u = aa[i,j];
  109.                         aa[i,j] = aa[k1,j];
  110.                         aa[k1,j] = u;
  111.                     }
  112.                 }
  113.                 v = aa[i,i];
  114.                 for (int j = 0; j < (nn+1); j++)
  115.                 {
  116.                    aa[i,j] = aa[i,j]/v;
  117.                 }
  118.                 for (int l = (i + 1); l < nn; l++)
  119.                 {
  120.                     v = aa[l, i];
  121.                     for (int j = (i + 1); j < (nn + 1); j++)
  122.                     {
  123.                         aa[l, j] = aa[l, j] - aa[i, j] * v;
  124.                     }
  125.                 }
  126.             }
  127.             bb[nn] = aa[nn, nn + 1];
  128.             for (int i = (nn - 1); i >= 0; i--)
  129.             {
  130.                 bb[i] = aa[i, nn + 1];
  131.                 for (int j = (i + 1); j < nn; j++)
  132.                 {
  133.                     bb[j] = bb[i] - aa[i, j] * bb[j];
  134.                 }
  135.             }
  136.         }
  137.         static void Main(string[] args)
  138.         {            
  139.             double[,] a = new double[n, n];
  140.             double[] x = new double[n];
  141.             double[] f = new double[n];
  142.             double[] dx = new double[n];
  143.             double max = 0;
  144.             int iter = 0;
  145.  
  146.             x[0] = 0;
  147.             x[1] = 0;
  148.  
  149.             do
  150.             {
  151.                 vivod_vectr(x);
  152.                 Console.WriteLine("nomer iter {0}", iter);
  153.                 Console.WriteLine("==============");
  154.                 iter++;
  155.                 for (int i = 0; i < n; i++)
  156.                 {
  157.                     for (int j = 0; j < n; j++)
  158.                     {
  159.                         a[i, j] = jacobian(x,i,j);
  160.                     }
  161.                 }
  162.                 for (int i = 0; i < n; i++)
  163.                 {
  164.                     f[i] = -1 * func(x, i);
  165.                 }
  166.                 simq(n, a, f);
  167.                 dx = f;
  168.                 max = Math.Abs(dx[0]);
  169.                 for (int i = 0; i < n; i++)
  170.                 {
  171.                     if (Math.Abs(dx[i]) > max)
  172.                         max = Math.Abs(dx[i]);
  173.                 }
  174.                 for (int i = 0; i < n; i++)
  175.                 {
  176.                     x[i] = x[i]+dx[i];
  177.                 }
  178.             }
  179.             while (max < eps);
  180.         }
  181.     }
  182. }
Advertisement
Add Comment
Please, Sign In to add comment