Метод Холецкого - исправить ошибку в приведенном коде - C#

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

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

Имеется матрица 3х3.Нужно решить ее при помощи метода Холецкого(Квадратного корня ). Написал вот такой код.Но x_vector считает не правильно(проверял Используя метод Гаусса ). Помогите найти ошибку .Треугольные матрицы считает правильно.
Листинг программы
  1. private void HolerskiySolve()
  2. {
  3. L[0, 0] = Math.Sqrt(a_matrix[0, 0]);
  4. for (int i = 1; i < size; i++)
  5. {
  6. double SumJ_El = 0;
  7. for (int j = 1; j < size+1; j++)
  8. {
  9. if (j-1 < i)
  10. {
  11. for (int k = 0; k < j - 1; k++)
  12. SumJ_El += L[i , k] * L[j - 1, k];
  13. L[i, j - 1] = (a_matrix[i, j-1] - SumJ_El) / L[j - 1, j - 1];
  14. }
  15. }
  16. double SumI_El = 0;
  17. for (int k = 0; k < i; k++)
  18. { SumI_El += L[i, k] * L[i, k]; }
  19. L[i, i] = Math.Sqrt(a_matrix[i, i]-SumI_El);
  20. }
  21. for (int i = 0; i < size; i++)
  22. for (int j = 0; j < size; j++)
  23. Lt[i, j] = L[j, i];
  24. double summa = 0;
  25. for (int i = 0; i < size; i++)
  26. {
  27. summa = 0;
  28. for (int j = 0; j < i-1; j++)
  29. {
  30. summa += (L[i, j] * y[j]);
  31. }
  32. y[i] = (b_vector[i] - summa)/L[i, i];
  33. }
  34. for (int i = size -1; i >=0; i--)
  35. {
  36. summa = 0;
  37. for (int j = size-1; j >i; j--)
  38. {
  39. summa += Lt[i, j] * x_vector[j];
  40. }
  41. x_vector[i] = (y[i]-summa) / Lt[i, i];
  42. }
  43. }

Решение задачи: «Метод Холецкого - исправить ошибку в приведенном коде»

textual
Листинг программы
  1.     class Holeckiy
  2.     {
  3.         #region Values
  4.         //Регион содержит значения всех переменных(полей) класса
  5.         public const int size = 3;//Размер матрицы
  6.         double[,] Lt = new double[size, size];//Верняя треугольная матрица
  7.         double[,] L = new double[size, size];//Нижняя треугольная матрица
  8.  
  9.         double[] y = new double[size];//Вектор
  10.         double[] x_vector = new double[size];//Вектор иксов
  11.  
  12.         #endregion
  13.         #region Utilites
  14.         //Регион содержит полезные функции
  15.  
  16.         //Превращаем одномерный массив входных данных в двухмерный массив
  17.         public double[,] ConvertListTo2DArray(List<double> values,int _size)
  18.         {
  19.             double[,] temp = new double[_size, _size];//создаем временный массив для хранения данных
  20.             if (values.Count != size*size-1)//проверяем, совпадает ли длина массива данных с длиной матрицы.К примеру, если нужна матрица 3х3 то массив должен иметь 3*3=9 элементов, если 4х4 то 16 и т.д.
  21.             {
  22.                 for(int i = 0;i<size;i++)//i - номер строки
  23.                     for(int j=0;j<size;j++)//j - номер столбца
  24.                         temp[i, j] = values[i*_size + j];
  25.             }
  26.             else
  27.                 Console.WriteLine("Размер динамического массива значений не совпадает с размерностью матрицы.Проверьте правильность ввода");
  28.             return temp;
  29.  
  30.         }
  31.  
  32.         //Красиво выводим матрицу на экран
  33.         public void PrintMatrix(double[,] matr, string name)
  34.         {
  35.             Console.WriteLine("\t"+name);
  36.             Console.WriteLine();
  37.             for (int i = 0; i < size; i++)
  38.             {
  39.                 for (int j = 0; j < size; j++)
  40.                 {
  41.                     Console.Write(matr[i, j].ToString("0.##") + "\t");
  42.                 }
  43.                 Console.WriteLine();
  44.             }
  45.             Console.WriteLine();
  46.             Console.WriteLine("---------------------------------------");
  47.             Console.WriteLine();
  48.         }
  49.        
  50.         //Красиво выводим вектор на экран
  51.         public void PrintVector(double[] vect,string name )
  52.         {
  53.             Console.WriteLine("\t" + name);
  54.             Console.WriteLine();
  55.             for (int i = 0; i < size; i++)
  56.             {
  57.                 Console.Write(vect[i].ToString("0.##") + "\t");
  58.             }
  59.  
  60.             Console.WriteLine();
  61.             Console.WriteLine("---------------------------------------");
  62.             Console.WriteLine();
  63.         }
  64.  
  65.         #endregion
  66.         public void HoleckiySolve(double[,] a_matrix, double[] b_vector)
  67.         {
  68.             PrintMatrix(a_matrix, " A");
  69.             //Находим нижнюю треугольную матрицу за формулами на странице 7 в методичке [url]www.cyberforum.ru/attachments/178676d1346064142[/url]
  70.             L[0, 0] = Math.Sqrt(a_matrix[0, 0]);//Задаем первый элемент матрицы L как корень из первого элемента матрицы А
  71.             for (int i = 1; i < size; i++)
  72.             {
  73.                 double SumJ_El = 0;
  74.                 for (int j = 1; j < size + 1; j++)
  75.                 {
  76.                     if (j - 1 < i)
  77.                     {
  78.                         for (int k = 0; k < j - 1; k++)
  79.                             SumJ_El += L[i, k] * L[j - 1, k];
  80.                         L[i, j - 1] = (a_matrix[i, j - 1] - SumJ_El) / L[j - 1, j - 1];
  81.                     }
  82.                 }
  83.                 double SumI_El = 0;
  84.                 for (int k = 0; k < i; k++)
  85.                 { SumI_El += L[i, k] * L[i, k]; }
  86.                 L[i, i] = Math.Sqrt(a_matrix[i, i] - SumI_El);
  87.             }
  88.             PrintMatrix(L, "L");
  89.             //Транспонируем матрицу L и получаем матрицу LT
  90.             for (int i = 0; i < size; i++)
  91.                 for (int j = 0; j < size; j++)
  92.                     Lt[i, j] = L[j, i];// По сути транспонирование - записываем рядки, как столбцы
  93.             PrintMatrix(Lt, "Lt");
  94.             //Рассчитываем вектор у
  95.             double summa = 0;
  96.             for (int i = 0; i < size; i++)
  97.             {
  98.                 summa = 0;
  99.                 for (int j = 0; j < i; j++)
  100.                 {
  101.                     summa += (L[i, j] * y[j]);
  102.                 }
  103.                 y[i] = (b_vector[i] - summa) / L[i, i];
  104.             }
  105.             PrintVector(y, "y");
  106.             //Наконец то находим значение наших иксов
  107.             for (int i = size - 1; i >= 0; i--)
  108.             {
  109.                 summa = 0;
  110.                 for (int j = size - 1; j > i; j--)
  111.                 {
  112.                     summa += Lt[i, j] * x_vector[j];
  113.                 }
  114.                 x_vector[i] = (y[i] - summa) / Lt[i, i];
  115.             }
  116.             PrintVector(x_vector, "x");
  117.         }
  118.  
  119.  
  120.     }
  121.     class Program
  122.     {
  123.         static void Main(string[] args)
  124.         {
  125.  
  126.             Holeckiy holeckiy = new Holeckiy();//Создаем переменную класса
  127.  
  128.             //Задаем двухмерный массив коефициентов
  129.             double[,] Coef = new double[,] { {5, 2, 3}, {2, 6, 1}, {3, 1, 7} };
  130.  
  131.             //Или же задаем в динамический массив числа в ряд, и превращаем его в 2мерный массив
  132.             List<double> CoefList = new List<double>(new double[] { 5, 2, 3, 7, 3, 3, 3, 1, 7 });
  133.             double[,] CoefMatrix = holeckiy.ConvertListTo2DArray(CoefList, Holeckiy.size);
  134.  
  135.             //Задаем вектор ответов(правая часть уравнений)
  136.             double[] bMatrix = new double[] { 10, 20, 30 };
  137.  
  138.             holeckiy.HoleckiySolve(Coef, bMatrix);
  139.         }
  140.     }

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


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

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

15   голосов , оценка 4.067 из 5

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

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

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