Численный метод Якоби. С Matlab на C#

Узнай цену своей работы

Формулировка задачи:

помогите пожалуйста с методом Якобы, чтобы на экран выводил только ответы , программа написано в матлабе
Листинг программы
  1. clear all
  2. clc
  3. n=input('количество строк (n): ');
  4. A=input('вводить матрицу A: ');
  5. b=input('ввдоить матрицу b, вектор столбец: ');
  6. m=input('максимальное число итераций (m): ');
  7. E=input('допустимая погрешность (стандартного значения): ');
  8. X0=zeros(1,n);
  9. X=X0;
  10. K=0;
  11. Norma=1;
  12. while Norma>E
  13. K=K+1;
  14. fprintf ('%d',K);
  15. for i=1:n
  16. suma=0;
  17. for j=1:n
  18. if j~=i
  19. suma=suma+A(i,j)*X(j);
  20. end
  21. end
  22. X(i)=(b(i)-suma)/A(i,j);
  23. fprintf('%10.6f',X(i));
  24. end
  25. Norma=norm(X0-X);
  26. fprintf('%10.6f\n',Norma);
  27. X0=X;
  28. if K>=m
  29. break
  30. end
  31. end
а вот и матрица {3 -2 1 5 2 1 -1 4 1 -5 3 0}

Решение задачи: «Численный метод Якоби. С Matlab на C#»

textual
Листинг программы
  1. using System;
  2. using System.Threading;
  3.  
  4. //-------------------------------------------
  5. // Simple Iterations Classes.
  6. // Seidel and Jacobi.
  7. // Grinchenko University. Informatics, 2-nd course.
  8. // Kudinov Ruslan
  9. // (c) 2014
  10. //-------------------------------------------
  11.  
  12. namespace app
  13. {
  14.     class Application
  15.     {
  16.         // Entry point
  17.         // Точка входа.
  18.         static void Main(string[] args)
  19.         {
  20.             // m m m | a
  21.             // m m m | a
  22.             // m m m | a
  23.  
  24.             // Matrix coefficients
  25.             // Матрица коеффциентов СЛАУ
  26.             double[,] matrix = new double[3, 3] {
  27.             { 4, 0.24, -0.08},
  28.             { 0.09, 3, -0.15},
  29.             { 0.04, -0.08, 4}
  30.             };
  31.  
  32.            
  33.             // matrix of free coefficients
  34.             // матрица свободных членов
  35.             double[] additional = new double[3] {
  36.                 8,
  37.                 9,
  38.                 20
  39.             };
  40.  
  41.             // Enter values by user
  42.             // Ввод значений вручную.
  43.             // matrix = setVal(matrix);
  44.             // additional = setVal(additional);
  45.  
  46.             // Create and init.
  47.             // Объявляем и инициализимруем классы.
  48.             Seidel i = new Seidel(matrix, additional, 0.0001);
  49.             Jacobi j = new Jacobi(matrix, additional, 0.0001);
  50.  
  51.             // set method args of ThreadStart delegate
  52.             // Передаем методы потоку через делегат ThreadStart
  53.             Thread Z = new Thread(new ThreadStart(i.calculateMatrix));
  54.             Thread Y = new Thread(new ThreadStart(j.calculateMatrix));
  55.  
  56.             // Start threads
  57.             // Запускаем потоки.
  58.             Z.Start();
  59.             Y.Start();
  60.  
  61.             // wait for endings
  62.             // Ожидаем завершения.
  63.             Z.Join();
  64.             Y.Join();
  65.  
  66.             // Show results of calculations
  67.             // Выводим на экран.
  68.             Console.WriteLine("\n Seidel method:");
  69.             showMatrix(i.ResultMatrix);
  70.             Console.WriteLine("\n Jakobi method:");
  71.             showMatrix(j.ResultMatrix);
  72.  
  73.             Console.ReadKey();
  74.         }
  75.  
  76.         //------------------------------------------
  77.         // setVal - method of array values enter overloads
  78.         // setVal - Перегрузки методов ввода значений для
  79.         // матрицы коеффициентов и свободных членов.
  80.         //------------------------------------------
  81.         static double[,] setVal(double[,] x)
  82.         {
  83.             Console.WriteLine("\n Matrix cofficients:");
  84.             for (int i = 0; i < x.GetLength(0); i++)
  85.             {
  86.                 for (int j = 0; j < x.GetLength(1); j++)
  87.                 {
  88.                     Console.Write("Enter value of {0}{1}: ", i, j);
  89.                     x[i, j] = Convert.ToDouble(Console.ReadLine());
  90.                 }
  91.             }
  92.  
  93.             return x;
  94.         }
  95.         static double[] setVal(double[] x)
  96.         {
  97.             Console.WriteLine("\n Addtional matrix values:");
  98.  
  99.             for (int i = 0; i < x.Length; i++)
  100.             {
  101.                 Console.Write("Enter value of {0}: ", i);
  102.                 x[i] = Convert.ToDouble(Console.ReadLine());
  103.             }
  104.  
  105.             return x;
  106.         }
  107.         //------------------------------------------
  108.         // showMatrix - method overloads showing results
  109.         // showMatrix - перегрузки разнотипных выводов
  110.         //------------------------------------------
  111.         static void showMatrix(double[,] x)
  112.         {
  113.             Console.WriteLine("\n Result:");
  114.  
  115.             for (int i = 0; i < x.GetLength(0); i++)
  116.             {
  117.                 for (int j = 0; j < x.GetLength(1); j++)
  118.                 {
  119.                     Console.Write(" {0} ", x[i, j]);
  120.                 }
  121.                 Console.WriteLine();
  122.             }
  123.         }
  124.         static void showMatrix(double[] x)
  125.         {
  126.             Console.WriteLine("\n Result:");
  127.             for (int i = 0; i < x.Length; i++)
  128.             {
  129.                 Console.WriteLine(" {0} ", x[i]);
  130.             }
  131.         }
  132.     }
  133.  
  134.     // Base class of all iteration methods
  135.     // Общий класс для итерационных методов.
  136.     abstract class SimpleIterations
  137.     {
  138.         public abstract void calculateMatrix();
  139.     }
  140.  
  141.     /// <summary>
  142.     /// Class Jacobi
  143.     /// Класс отвечает за работу метода Якоби
  144.     /// </summary>
  145.     class Jacobi : SimpleIterations
  146.     {
  147.         // Матрица ответов
  148.         private double[] resultMatrix;
  149.         public double[] ResultMatrix
  150.         {
  151.             get
  152.             {
  153.                 if (resultMatrix != null)
  154.                     return resultMatrix;
  155.                 else
  156.                 {
  157.                     return new double[3] { 0, 0, 0 };
  158.                 }
  159.             }
  160.         }
  161.  
  162.         // Основная матрица и свободные члены.
  163.         private double[,] matrix;
  164.         private double[] addtional;
  165.  
  166.         // точность (кол-во итераций)
  167.         private double accuracy;
  168.         // избегаем ошибок с итерациями.
  169.         public double Accuracy
  170.         {
  171.             get
  172.             {
  173.                 return accuracy;
  174.             }
  175.             set
  176.             {
  177.                 if (value <= 0.0)
  178.                     accuracy = 0.1;
  179.                 else
  180.                     accuracy = value;
  181.             }
  182.         }
  183.  
  184.         // Конструктор. Получает значения при создании.
  185.         public Jacobi(double[,] Matrix, double[] FreeElements, double Accuracy)
  186.         {
  187.             this.matrix = Matrix;
  188.             this.addtional = FreeElements;
  189.             this.Accuracy = Accuracy;
  190.  
  191.         }
  192.  
  193.         // Сам метод рассчета.
  194.         public override void calculateMatrix()
  195.         {
  196.             // общий вид:
  197.             // [x1]   [ b1/a11 ]   / 0 x x \
  198.             // [x2] = [ b2/a22 ] - | x 0 x |
  199.             // [x3]   [ b3/a33 ]   \ x x 0 /
  200.             // где x - делится на диагональый элемент первоначальной матрицы.
  201.             // где b - эелементы из свободных членов
  202.             // где а - элементы из матрицы
  203.  
  204.             // матрица коеффициентов + столбец свободных членов.
  205.             double[,] a = new double[matrix.GetLength(0), matrix.GetLength(1) + 1];
  206.  
  207.             for (int i = 0; i < a.GetLength(0); i++)
  208.                 for (int j = 0; j < a.GetLength(1) - 1; j++)
  209.                     a[i, j] = matrix[i, j];
  210.  
  211.             for (int i = 0; i < a.GetLength(0); i++)
  212.                 a[i, a.GetLength(1) - 1] = addtional[i];
  213.  
  214.             //---------------
  215.             // Метод Якоби.
  216.             //---------------
  217.  
  218.             // Введем вектор значений неизвестных на предыдущей итерации,
  219.             // размер которого равен числу строк в матрице, т.е. size,
  220.             // причем согласно методу изначально заполняем его нулями
  221.  
  222.             double[] previousValues = new double[a.GetLength(0)];
  223.             for (int i = 0; i < a.GetLength(0); i++)
  224.             {
  225.                 previousValues[i] = 0.0;
  226.             }
  227.  
  228.             // Будем выполнять итерационный процесс до тех пор,
  229.             // пока не будет достигнута необходимая точность
  230.             while (true)
  231.             {
  232.                 // Введем вектор значений неизвестных на текущем шаге
  233.                 double[] currentValues = new double[a.GetLength(0)];
  234.  
  235.                 // Посчитаем значения неизвестных на текущей итерации
  236.                 // в соответствии с теоретическими формулами
  237.                 for (int i = 0; i < a.GetLength(0); i++)
  238.                 {
  239.                     // Инициализируем i-ую неизвестную значением
  240.                     // свободного члена i-ой строки матрицы
  241.                     currentValues[i] = a[i, a.GetLength(0)];
  242.  
  243.                     // Вычитаем сумму по всем отличным от i-ой неизвестным
  244.                     for (int j = 0; j < a.GetLength(0); j++)
  245.                     {
  246.                         if (i != j)
  247.                         {
  248.                             currentValues[i] -= a[i, j] * previousValues[j];
  249.                         }
  250.                     }
  251.  
  252.                     // Делим на коэффициент при i-ой неизвестной
  253.                     currentValues[i] /= a[i, i];
  254.                 }
  255.  
  256.                 // Посчитаем текущую погрешность относительно предыдущей итерации
  257.                 double differency = 0.0;
  258.  
  259.                 for (int i = 0; i < a.GetLength(0); i++)
  260.                     differency += Math.Abs(currentValues[i] - previousValues[i]);
  261.  
  262.                 // Если необходимая точность достигнута, то завершаем процесс
  263.                 if (differency < accuracy)
  264.                     break;
  265.  
  266.                 // Переходим к следующей итерации, так
  267.                 // что текущие значения неизвестных
  268.                 // становятся значениями на предыдущей итерации
  269.                 previousValues = currentValues;
  270.             }
  271.  
  272.             resultMatrix = previousValues;
  273.         }
  274.  
  275.     }
  276.  
  277.     /// <summary>
  278.     /// Класс Отвечает за работу метода Зейделя.
  279.     /// Class Seidel
  280.     /// </summary>
  281.     class Seidel : SimpleIterations
  282.     {
  283.         // Матрица ответов
  284.         private double[] resultMatrix;
  285.         public double[] ResultMatrix
  286.         {
  287.             get
  288.             {
  289.                 if (resultMatrix != null)
  290.                     return resultMatrix;
  291.                 else
  292.                 {
  293.                     return new double[3] { 0, 0, 0 };
  294.                 }
  295.             }
  296.         }
  297.         // private int t;
  298.  
  299.         // Основная матрица и свободные члены.
  300.         private double[,] matrix;
  301.         private double[] addtional;
  302.  
  303.         // точность (кол-во итераций)
  304.         private double accuracy;
  305.         // избегаем ошибок с итерациями.
  306.         public double Accuracy
  307.         {
  308.             get
  309.             {
  310.                 return accuracy;
  311.             }
  312.             set
  313.             {
  314.                 if (value <= 0.0)
  315.                     accuracy = 0.1;
  316.                 else
  317.                     accuracy = value;
  318.             }
  319.         }
  320.  
  321.         // Конструктор. Получает значения при создании.
  322.         public Seidel(double[,] Matrix, double[] FreeElements, double Accuracy)
  323.         {
  324.             this.matrix = Matrix;
  325.             this.addtional = FreeElements;
  326.             this.Accuracy = Accuracy;
  327.  
  328.         }
  329.  
  330.         // Сам метод рассчета.
  331.         public override void calculateMatrix()
  332.         {
  333.  
  334.             // общий вид:
  335.             // [x1]   [ b1/a11 ]   / 0 x x \
  336.             // [x2] = [ b2/a22 ] - | x 0 x |
  337.             // [x3]   [ b3/a33 ]   \ x x 0 /
  338.             // где x - делится на диагональый элемент первоначальной матрицы.
  339.             // где b - эелементы из свободных членов
  340.             // где а - элементы из матрицы
  341.  
  342.             // матрица коеффициентов + столбец свободных членов.
  343.             double[,] a = new double[matrix.GetLength(0), matrix.GetLength(1) + 1];
  344.  
  345.             for (int i = 0; i < a.GetLength(0); i++)
  346.                 for (int j = 0; j < a.GetLength(1) - 1; j++)
  347.                     a[i, j] = matrix[i, j];
  348.  
  349.             for (int i = 0; i < a.GetLength(0); i++)
  350.                 a[i, a.GetLength(1) - 1] = addtional[i];
  351.  
  352.             //---------------
  353.             // Метод Зейделя.
  354.             //---------------
  355.  
  356.             // Введем вектор значений неизвестных на предыдущей итерации,
  357.             // размер которого равен числу строк в матрице, т.е. size,
  358.             // причем согласно методу изначально заполняем его нулями
  359.             double[] previousValues = new double[matrix.GetLength(0)];
  360.             for (int i = 0; i < previousValues.GetLength(0); i++)
  361.             {
  362.                 previousValues[i] = 0.0;
  363.             }
  364.  
  365.             // Будем выполнять итерационный процесс до тех пор,
  366.             // пока не будет достигнута необходимая точность
  367.             while (true)
  368.             {
  369.                 // Введем вектор значений неизвестных на текущем шаге
  370.                 double[] currentValues = new double[a.GetLength(0)];
  371.  
  372.                 // Посчитаем значения неизвестных на текущей итерации
  373.                 // в соответствии с теоретическими формулами
  374.                 for (int i = 0; i < matrix.GetLength(0); i++)
  375.                 {
  376.                     // Инициализируем i-ую неизвестную значением
  377.                     // свободного члена i-ой строки матрицы
  378.                     currentValues[i] = a[i, a.GetLength(0)];
  379.  
  380.                     // Вычитаем сумму по всем отличным от i-ой неизвестным
  381.                     for (int j = 0; j < a.GetLength(0); j++)
  382.                     {
  383.                         // При j < i можем использовать уже посчитанные
  384.                         // на этой итерации значения неизвестных
  385.                         if (j < i)
  386.                         {
  387.                             currentValues[i] -= a[i, j] * currentValues[j];
  388.                         }
  389.  
  390.                         // При j > i используем значения с прошлой итерации
  391.                         if (j > i)
  392.                         {
  393.                             currentValues[i] -= a[i, j] * previousValues[j];
  394.                         }
  395.                     }
  396.  
  397.                     // Делим на коэффициент при i-ой неизвестной
  398.                     currentValues[i] /= a[i, i];
  399.                 }
  400.  
  401.                 // Посчитаем текущую погрешность относительно предыдущей итерации
  402.                 double differency = 0.0;
  403.  
  404.                 for (int i = 0; i < a.GetLength(0); i++)
  405.                     differency += Math.Abs(currentValues[i] - previousValues[i]);
  406.  
  407.                 // Если необходимая точность достигнута, то завершаем процесс
  408.                 if (differency < accuracy)
  409.                     break;
  410.  
  411.                 // Переходим к следующей итерации, так
  412.                 // что текущие значения неизвестных
  413.                 // становятся значениями на предыдущей итерации
  414.  
  415.                 previousValues = currentValues;
  416.             }
  417.  
  418.             // результат присваиваем матрице результатов.
  419.             resultMatrix = previousValues;
  420.         }
  421.  
  422.  
  423.  
  424.     }
  425. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.9 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут