Метод Холецкого - исправить ошибку в приведенном коде - 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);
}
}