Метод Холецкого - исправить ошибку в приведенном коде - C#
Формулировка задачи:
Имеется матрица 3х3.Нужно решить ее при помощи метода Холецкого(Квадратного корня ).
Написал вот такой код.Но x_vector считает не правильно(проверял Используя метод Гаусса ).
Помогите найти ошибку .Треугольные матрицы считает правильно.
private void HolerskiySolve() { L[0, 0] = Math.Sqrt(a_matrix[0, 0]); for (int i = 1; i < size; i++) { double SumJ_El = 0; for (int j = 1; j < size+1; j++) { if (j-1 < i) { for (int k = 0; k < j - 1; k++) SumJ_El += L[i , k] * L[j - 1, k]; L[i, j - 1] = (a_matrix[i, j-1] - SumJ_El) / L[j - 1, j - 1]; } } double SumI_El = 0; for (int k = 0; k < i; k++) { SumI_El += L[i, k] * L[i, k]; } L[i, i] = Math.Sqrt(a_matrix[i, i]-SumI_El); } for (int i = 0; i < size; i++) for (int j = 0; j < size; j++) Lt[i, j] = L[j, i]; double summa = 0; for (int i = 0; i < size; i++) { summa = 0; for (int j = 0; j < i-1; j++) { summa += (L[i, j] * y[j]); } y[i] = (b_vector[i] - summa)/L[i, i]; } for (int i = size -1; i >=0; i--) { summa = 0; for (int j = size-1; j >i; j--) { summa += Lt[i, j] * x_vector[j]; } x_vector[i] = (y[i]-summa) / Lt[i, i]; } }
Решение задачи: «Метод Холецкого - исправить ошибку в приведенном коде»
textual
Листинг программы
class Holeckiy { #region Values //Регион содержит значения всех переменных(полей) класса public const int size = 3;//Размер матрицы double[,] Lt = new double[size, size];//Верняя треугольная матрица double[,] L = new double[size, size];//Нижняя треугольная матрица double[] y = new double[size];//Вектор double[] x_vector = new double[size];//Вектор иксов #endregion #region Utilites //Регион содержит полезные функции //Превращаем одномерный массив входных данных в двухмерный массив public double[,] ConvertListTo2DArray(List<double> values,int _size) { double[,] temp = new double[_size, _size];//создаем временный массив для хранения данных if (values.Count != size*size-1)//проверяем, совпадает ли длина массива данных с длиной матрицы.К примеру, если нужна матрица 3х3 то массив должен иметь 3*3=9 элементов, если 4х4 то 16 и т.д. { for(int i = 0;i<size;i++)//i - номер строки for(int j=0;j<size;j++)//j - номер столбца temp[i, j] = values[i*_size + j]; } else Console.WriteLine("Размер динамического массива значений не совпадает с размерностью матрицы.Проверьте правильность ввода"); return temp; } //Красиво выводим матрицу на экран public void PrintMatrix(double[,] matr, string name) { Console.WriteLine("\t"+name); Console.WriteLine(); for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { Console.Write(matr[i, j].ToString("0.##") + "\t"); } Console.WriteLine(); } Console.WriteLine(); Console.WriteLine("---------------------------------------"); Console.WriteLine(); } //Красиво выводим вектор на экран public void PrintVector(double[] vect,string name ) { Console.WriteLine("\t" + name); Console.WriteLine(); for (int i = 0; i < size; i++) { Console.Write(vect[i].ToString("0.##") + "\t"); } Console.WriteLine(); Console.WriteLine("---------------------------------------"); Console.WriteLine(); } #endregion public void HoleckiySolve(double[,] a_matrix, double[] b_vector) { PrintMatrix(a_matrix, " A"); //Находим нижнюю треугольную матрицу за формулами на странице 7 в методичке [url]www.cyberforum.ru/attachments/178676d1346064142[/url] L[0, 0] = Math.Sqrt(a_matrix[0, 0]);//Задаем первый элемент матрицы L как корень из первого элемента матрицы А for (int i = 1; i < size; i++) { double SumJ_El = 0; for (int j = 1; j < size + 1; j++) { if (j - 1 < i) { for (int k = 0; k < j - 1; k++) SumJ_El += L[i, k] * L[j - 1, k]; L[i, j - 1] = (a_matrix[i, j - 1] - SumJ_El) / L[j - 1, j - 1]; } } double SumI_El = 0; for (int k = 0; k < i; k++) { SumI_El += L[i, k] * L[i, k]; } L[i, i] = Math.Sqrt(a_matrix[i, i] - SumI_El); } PrintMatrix(L, "L"); //Транспонируем матрицу L и получаем матрицу LT for (int i = 0; i < size; i++) for (int j = 0; j < size; j++) Lt[i, j] = L[j, i];// По сути транспонирование - записываем рядки, как столбцы PrintMatrix(Lt, "Lt"); //Рассчитываем вектор у double summa = 0; for (int i = 0; i < size; i++) { summa = 0; for (int j = 0; j < i; j++) { summa += (L[i, j] * y[j]); } y[i] = (b_vector[i] - summa) / L[i, i]; } PrintVector(y, "y"); //Наконец то находим значение наших иксов for (int i = size - 1; i >= 0; i--) { summa = 0; for (int j = size - 1; j > i; j--) { summa += Lt[i, j] * x_vector[j]; } x_vector[i] = (y[i] - summa) / Lt[i, i]; } PrintVector(x_vector, "x"); } } class Program { static void Main(string[] args) { Holeckiy holeckiy = new Holeckiy();//Создаем переменную класса //Задаем двухмерный массив коефициентов double[,] Coef = new double[,] { {5, 2, 3}, {2, 6, 1}, {3, 1, 7} }; //Или же задаем в динамический массив числа в ряд, и превращаем его в 2мерный массив List<double> CoefList = new List<double>(new double[] { 5, 2, 3, 7, 3, 3, 3, 1, 7 }); double[,] CoefMatrix = holeckiy.ConvertListTo2DArray(CoefList, Holeckiy.size); //Задаем вектор ответов(правая часть уравнений) double[] bMatrix = new double[] { 10, 20, 30 }; holeckiy.HoleckiySolve(Coef, bMatrix); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д