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

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


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

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

15   голосов , оценка 4.067 из 5
Похожие ответы