Guass列选主元消去法和三角分解法

  最近数值计算学了Guass列主消元法和三角分解法解线性方程组,具体原理如下:

1、Guass列选主元消去法对于AX =B

1)、消元过程:将(A|B)进行变换为,其中是上三角矩阵。即:

k从1到n-1

a、 列选主元

选取第k列中绝对值最大元素作为主元。

b、 换行

c、 归一化

d、 消元

2)、回代过程:由解出。

2、三角分解法(Doolittle分解)

将A分解为如下形式

由矩阵乘法原理

a、计算U的第一行,再计算L的第一列

b、设已求出U的1至r-1行,L的1至r-1列。先计算U的第r行,再计算L的第r列。

a)计算U的r行

b)计算L的r列

C#代码:

  代码说明:Guass列主消元法部分将计算出来的根仍然储存在增广矩阵的最后一列,而Doolittle分解,将分解后的结果也储存至原来的数组中,这样可以节约空间。。

using System;
using System.Windows.Forms;

namespace Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Cannel_Button_Click(object sender, EventArgs e)
        {
            this.textBox1.Clear();
            this.textBox2.Clear();
            this.textBox3.Clear();
            this.comboBox1.SelectedIndex = -1;
        }
        public double[,] GetNum(string str, int n)
        {
            string[] strnum = str.Split(‘ ‘);
            double[,] a = new double[n, n + 1];
            int k = 0;
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < strnum.Length / n; j++)
                {
                    a[i, j] = double.Parse((strnum[k]).ToString());
                    k++;
                }
            }
            return a;
        }
        public void Gauss(double[,] a, int n)
        {
            int i, j;
            SelectColE(a, n);
            for (i = n - 1; i >= 0; i--)
            {
                for (j = i + 1; j < n; j++)
                    a[i, n] -= a[i, j] * a[j, n];
                a[i, n] /= a[i, i];
            }
        }
        //选择列主元并进行消元
        public void SelectColE(double[,] a, int n)
        {
            int i, j, k, maxRowE;
            double temp; //用于记录消元时的因数
            for (j = 0; j < n; j++)
            {
                maxRowE = j;
                for (i = j; i < n; i++)
                    if (System.Math.Abs(a[i, j]) > System.Math.Abs(a[maxRowE, j]))
                        maxRowE = i;
                if (maxRowE != j)
                    swapRow(a, j, maxRowE, n);   //与最大主元所在行交换
                                                 //消元
                for (i = j + 1; i < n; i++)
                {
                    temp = a[i, j] / a[j, j];
                    for (k = j; k < n + 1; k++)
                        a[i, k] -= a[j, k] * temp;
                }
            }
            return;
        }
        public void swapRow(double[,] a, int m, int maxRowE, int n)
        {
            int k;
            double temp;
            for (k = m; k < n + 1; k++)
            {
                temp = a[m, k];
                a[m, k] = a[maxRowE, k];
                a[maxRowE, k] = temp;
            }
        }
        public void Doolittle(double[,] a, int n)
        {
            for (int i = 0; i < n; i++)
            {
                if (i == 0)
                {
                    for (int j = i + 1; j < n; j++)
                        a[j, 0] = a[j, 0] / a[0, 0];
                }
                else
                {
                    double temp = 0, s = 0;
                    for (int j = i; j < n; j++)
                    {
                        for (int k = 0; k < i; k++)
                        {
                            temp = temp + a[i, k] * a[k, j];
                        }
                        a[i, j] = a[i, j] - temp;
                    }
                    for (int j = i + 1; j < n; j++)
                    {
                        for (int k = 0; k < i; k++)
                        {
                            s = s + a[j, k] * a[k, i];
                        }
                        a[j, i] = (a[j, i] - s) / a[i, i];
                    }
                }
            }
        }
        private void Exit_Button_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void Confirm_Button_Click(object sender, EventArgs e)
        {
            if (this.textBox2.Text.Trim().ToString().Length == 0)
            {
                this.textBox2.Text = this.textBox1.Text.Trim();
            }
            else
            {
                this.textBox2.Text = this.textBox2.Text + "\r\n" + this.textBox1.Text.Trim();
            }
            this.textBox1.Clear();
        }

        private void Calculate_Button_Click(object sender, EventArgs e)
        {
            string str = this.textBox2.Text.Trim().ToString();
            string myString = str.Replace("\n", " ").Replace("\r", string.Empty);
            double[,] a = new double[this.textBox2.Lines.GetUpperBound(0) + 1, this.textBox2.Lines.GetUpperBound(0) + 2];
            a = GetNum(myString, this.textBox2.Lines.GetUpperBound(0) + 1);
            if (this.comboBox1.Text == "Guass列主消元法")
            {
                Gauss(a, this.textBox2.Lines.GetUpperBound(0) + 1);
                for (int i = 0; i < this.textBox2.Lines.GetUpperBound(0) + 1; i++)
                {
                    this.textBox3.Text = this.textBox3.Text + "\r\nX" + (i + 1) + "=" + a[i, this.textBox2.Lines.GetUpperBound(0) + 1];
                }
            }
            else if (this.comboBox1.Text == "Doolittle三角分解法")
            {
                this.textBox3.Enabled = true;
                Doolittle(a, this.textBox2.Lines.GetUpperBound(0) + 1);
                this.label3.Text = "分解后的结果:";
                this.textBox3.Clear();
                this.textBox3.Text += "L矩阵:\r\n";
                for (int i = 0; i < this.textBox2.Lines.GetUpperBound(0) + 1; i++)
                {
                    for (int j = 0; j < this.textBox2.Lines.GetUpperBound(0) + 1; j++)
                    {
                        if (j < i)
                        {
                            this.textBox3.Text += a[i, j].ToString() + "\t";
                        }
                        else if (i == j)
                        {
                            this.textBox3.Text += "1\t";
                        }
                        else
                        {
                            this.textBox3.Text += "0\t";
                        }
                    }
                    this.textBox3.Text += "\r\n";
                }
                this.textBox3.Text += "\r\nU矩阵:\r\n";
                for (int i = 0; i < this.textBox2.Lines.GetUpperBound(0) + 1; i++)
                {
                    for (int j = 0; j < this.textBox2.Lines.GetUpperBound(0) + 1; j++)
                    {
                        if (j >= i)
                        {
                            this.textBox3.Text += a[i, j].ToString() + "\t";
                        }
                        else
                        {
                            this.textBox3.Text += "0\t";
                        }
                    }
                    this.textBox3.Text += "\r\n";
                }
            }

        }

        private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (this.textBox1.Text.Trim().ToString().Length == 0)
                {
                    Calculate_Button_Click(sender, e);
                }
                else
                {
                    Confirm_Button_Click(sender, e);
                }
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            this.textBox2.Enabled = true;
        }
    }
}

  运行截图:

  至此完毕。。。。

时间: 2024-10-06 19:51:14

Guass列选主元消去法和三角分解法的相关文章

推荐系统——隐因子的矩阵分解法

在新手接触推荐系统这个领域时,遇到第一个理解起来比较困难的就是协同过滤法.那么如果这时候百度的话,得到最多的是奇异值分解法,即(SVD).SVD的作用大致是将一个矩阵分解为三个矩阵相乘的形式.如果运用在推荐系统中,首先我们将我们的训练集表示成矩阵的形式,这里我们以movielen数据集为例.这个数据集包含了用户对电影的评分.那么矩阵形式大致为:   movie1 movie2 movie3 moive4 user1 1       user2 2     3 user3   5 4   user

线性方程组的分解法——LU分解法

1.代码 %%LU分解法 function LUDM = LU_Decomposition_method(A,b) global n;global B;global U;global L;global M; [n,n] = size(A); B = [A,b]; R_A = rank(A);R_B = rank(B); if R_A ~= R_B disp('方程无解'); elseif (R_A == R_B) && (R_A == n) disp('此方程有唯一解'); M = LU_

经验模态分解法简析 (转)

http://blog.sina.com.cn/s/blog_55954cfb0102e9y2.html 美国工程院士黄锷博士于1998年提出的一种信号分析方法:重点是黄博士的具有创新性的经验模态分解(Empirical Mode Decomposition)即EMD法,它是一种自适应的数据处理或挖掘方法,非常适合非线性,非平稳时间序列的处理,本质上是对数据序列或信号的平稳化处理. 1:关于时间序列平稳性的一般理解: 所谓时间序列的平稳性,一般指宽平稳,即时间序列的均值和方差为与时间无关的常数,

系统架构正交分解法

[Architecture] 系统架构正交分解法 [Architecture] 系统架构正交分解法 前言 随着企业成长,支持企业业务的软件,也会越来越庞大与复杂.当系统复杂到一定程度,开发人员会发现很多系统架构的设计细节,很难有条理.有组织的用一张大蓝图去做分析设计.先前在InfoQ上看到一篇文章:「亿级用户下的新浪微博平台架构 - 卫向军」,在这篇文章里使用正交分解法,来分析设计新浪微博平台的系统架构. 透过正交分解法这样表格式的条列与分解,可以让开发人员清楚理解每个象限的关注点,进而去理解与

[Architecture] 系统架构正交分解法

[Architecture] 系统架构正交分解法 前言 随着企业成长,支持企业业务的软件,也会越来越庞大与复杂.当系统复杂到一定程度,开发人员会发现很多系统架构的设计细节,很难有条理.有组织的用一张大蓝图去做分析设计.先前在InfoQ上看到一篇文章:「亿级用户下的新浪微博平台架构 - 卫向军」,在这篇文章里,使用正交分解法,来分析设计新浪微博平台的系统架构. 透过正交分解法这样表格式的条列与分解,可以让开发人员清楚理解每个象限的关注点,进而去理解与组织整个系统架构所使用到的框架技术.本篇文章介绍

Miiler-Robin素数测试与Pollard-Rho大数分解法

板题 Miiler-Robin素数测试 目前已知分解质因数以及检测质数确定性方法就只能\(sqrt{n}\)试除 但是我们可以基于大量测试的随机算法而有大把握说明一个数是质数 Miler-Robin素数测试基于以下两个原理: 费马小定理 即我们耳熟能详的 对于质数\(p\) \[a^{p - 1} \equiv 1 \pmod p\] 二次探测原理 对于质数\(p\),如果存在\(x\)满足 \[x^2 \equiv 1 \pmod p\] 那么\(x\)只能是\(1\)或者\(p - 1\)

线性方程组的分解法——列主元消去法

1.代码 %%列主元消去法 function ECPE = Elimination_of_column_pivot_entries(M,b) global n; [n,n] = size(M); B =[M,b]; R_A = rank(M);R_B = rank(B); if R_A ~= R_B disp('方程无解'); elseif (R_A == R_B)&&(R_A == n) disp('此方程有唯一解'); for k = 1:n-1 B = Column_pivot_tr

三角函数查表法和三角函数值数组生成方法

今天打算用STM32驱动TFTLCD屏显示显示一个画扇形的程序,这样就需要我们有一个画圆弧的程序,我尝试了很多方法,其中有一种方法就是使用三角函数来确定圆弧的点的坐标,即: x=radius*cos(angle); y=radius*sin(angle); 下面是当时的计算过程:我们先把角度变成弧度,我们在这里使用了ToRad()函数来实现,程序十分简单. #include <math.h> #define pi 3.141592653f int shu; float ToRad(float

【腾讯Bugly干货分享】彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法

本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ 作者:李志刚 导语 Http 缓存机制作为 web 性能优化的重要手段,对从事 Web 开发的小伙伴们来说是必须要掌握的知识,但最近我遇到了几个缓存头设置相关的题目,发现有好几道题答错了,有的甚至在知道了正确答案后依然不明白其原因,可谓相当的郁闷呢!!为了确认下是否只是自己理解不深,我特意请教了其他几位小伙