Метод Холецкого - исправить ошибку в приведенном коде - 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);
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д