C#--Gauss消元之直接三角形分解法

Gauss消元之直接三角形分解法

基本介绍

若能通过 正交变换,将系数矩阵A分解为A=LU,其中L是单位下三角矩阵( 主对角线元素为1的下三角矩阵),而U是上三角矩阵,则线性方程组Ax=b变为LUx=b,若令Ux=y,则线性方程组Ax=b的求解分为两个三角方程组的求解:
(1)求解Ly=b,得y;
(2)再求解Ux=y,即得方程组的解x;
因此三角分解法的关键问题在于 系数矩阵 A的LU分解。
矩阵能LU分解的充分条件
一般地,任给一个矩阵不一定有LU分解,下面给出一个 矩阵能LU分解的充分条件。
定理1 对任意矩阵
,若A的各阶顺序主子式均不为零,则A有唯一的Doolittle分解(或Crout分解)。
定理2 若矩阵
非奇异,且其LU分解存在,则A的LU分解是唯一的。
求解Ly=b与Ux=y的计算公式为

 核心代码实现,计算公式:
 public void Huanyuan4()
        {
            for (int r = 0; r < n; r++)
            {
                for (int j = r; j < n + 1; j++)
                {
                    double sum = 0;
                    for (int k = 0; k <= r - 1; k++)
                    {
                        sum += a[r, k] * a[k, j];
                    }
                    a[r, j] = a[r, j] - sum;//计算Uj,k
                }
                if (r < n)
                {
                    for (int i = r + 1; i < n; i++)
                    {
                        double sum = 0;
                        for (int k = 0; k <= r - 1; k++)
                        {
                            sum += a[i, k] * a[k, r];
                        }
                        a[i, r] = (a[i, r] - sum) / a[r, r];//计算Uir
                    }
                }
            }
            //调格式
            for (int r = 0; r < n; r++)
            {
                for (int j =0; j < n; j++)
                {
                    if (r == j && j > 0 && r > 0)
                    {
                        a[r, j - 1] = 0;
                        for (j = 1; j < r; j++)
                            a[r, j - 1] = 0;
                    }
                }
            }
        }

完整部分:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Guass4
{
    class Guass4
    {
        int n;

        public int N
        {
            get { return n; }
            set { n = value; }
        }  
        double[,] a;
        public double[,] A
        {
            get{  return a; }
            set {a = value; }
        }
        double[] x;
        public double[] X
        {
            get {return x; }
            set{x = value;}
        }
        public void Input()
        {
            Console.WriteLine("请输入阶数:");
            n = Convert.ToInt32(Console.ReadLine());
            a = new double[n, n + 1];
            x = new double[n];
            Console.WriteLine("请输入各行系数(','或' '隔开):");
            for (int i = 0; i < n; i++)
            {
                string s = Console.ReadLine();
                string[] ss = s.Split(' ', ',');
                for (int j = 0; j < n + 1; j++)
                {
                    a[i, j] = Convert.ToDouble(ss[j]);
                }
            }
        }
        public void Huanyuan4()
        {
            for (int r = 0; r < n; r++)
            {
                for (int j = r; j < n + 1; j++)
                {
                    double sum = 0;
                    for (int k = 0; k <= r - 1; k++)
                    {
                        sum += a[r, k] * a[k, j];
                    }
                    a[r, j] = a[r, j] - sum;//计算Uj,k
                }
                if (r < n)
                {
                    for (int i = r + 1; i < n; i++)
                    {
                        double sum = 0;
                        for (int k = 0; k <= r - 1; k++)
                        {
                            sum += a[i, k] * a[k, r];
                        }
                        a[i, r] = (a[i, r] - sum) / a[r, r];//计算Uir
                    }
                }
            }
            //调格式
            for (int r = 0; r < n; r++)
            {
                for (int j =0; j < n; j++)
                {
                    if (r == j && j > 0 && r > 0)
                    {
                        a[r, j - 1] = 0;
                        for (j = 1; j < r; j++)
                            a[r, j - 1] = 0;
                    }
                }
            }
        }
        public void Output()
        {
            Console.WriteLine("方程系数为:");
            for (int i = 0; i < n; i++)
            {
                string s = null;
                for (int j = 0; j < n + 1; j++)
                {
                    s += string.Format("{0,8:f2}", a[i, j]);
                }
                Console.WriteLine(s);
            }
        }

        public void Huidai4()
        {
            for (int i=n-1;i>=0;i--)
            {
                double sum = 0;
                for(int j=i+1;j<n;j++)
                {
                    sum+= a[i, j] * x[j];
                }
                x[i] = (a[i, n] - sum) / a[i, i];
            }
            Console.WriteLine("\n方程组的解是:");
            for(int i=0;i<n;i++)
            {
                Console.WriteLine("x{0}={1}", i + 1, x[i]);
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Guass4 abc = new Guass4();
            abc.Input();
            abc.Output();
            abc.Huanyuan4();
            abc.Output();
            abc.Huidai4();
        }
    }
}

结果:

谢谢!!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DXnima

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值