最近数值计算学了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;
}
}
}

  运行截图:

  至此完毕。。。。

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

  1. 大规模问题的分解法-D-W分解法

    大规模线性规划问题的求解极具挑战性,在效率.存储和数值稳定性等方面对算法都有很高的要求.但是这类问题常常非常稀疏且有特殊结构,能够分解为若干个较小规模问题求解. 线性规划问题的目标函数和非负约束都可分 ...

  2. Matlab数值计算示例: 牛顿插值法、LU分解法、拉格朗日插值法、牛顿插值法

    本文源于一次课题作业,部分自己写的,部分借用了网上的demo 牛顿迭代法(1) x=1:0.01:2; y=x.^3-x.^2+sin(x)-1; plot(x,y,'linewidth',2);gr ...

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

    [Architecture] 系统架构正交分解法 前言 随着企业成长,支持企业业务的软件,也会越来越庞大与复杂.当系统复杂到一定程度,开发人员会发现很多系统架构的设计细节,很难有条理.有组织的用一张大 ...

  4. 时间序列分解-STL分解法

    时间序列分解-STL分解法 [转载时请注明来源]:http://www.cnblogs.com/runner-ljt/ Ljt 作为一个初学者,水平有限,欢迎交流指正. STL(’Seasonal a ...

  5. 项目管理——WBS工作分解法

    首先我们要了解什么是WBS工作分解法 工作分解结构(Work Breakdown Structure,简称WBS)跟因数分解是一个原理,就是把一个项目,按一定的原则分解,项目分解成任务,任务再分解成一 ...

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

    板题 Miiler-Robin素数测试 目前已知分解质因数以及检测质数确定性方法就只能\(sqrt{n}\)试除 但是我们可以基于大量测试的随机算法而有大把握说明一个数是质数 Miler-Robin素 ...

  7. [原创]浅谈对任务分解法WBS应用

    [原创]浅谈对任务分解法WBS应用 1.WBS是什么? 即Work Breakdown Structure如何进行WBS分解:目标→任务→工作→活动 2.WBS分解的原则:将主体目标逐步细化分解,最底 ...

  8. Pollard_Rho 整数分解法【学习笔记】

    引文:如果要对比较大的整数分解,显然之前所学的筛选法和是试除法都将不再适用.所以我们需要学习速度更快的Pollard_Rho算法. 算法原理: 生成两个整数a和b,计算p=gcd(a-b, n),知道 ...

  9. url映射 ccf (Java正则表达式80分解法)

    问题描述 试题编号: 201803-3 试题名称: URL映射 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 URL 映射是诸如 Django.Ruby on Rails 等 ...

随机推荐

  1. Android混合开发之WebView与Javascript交互

    前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App.Web App.Hybrid App三种方式,个人觉得目前以Hybri ...

  2. Android数据加密之SHA安全散列算法

    前言: 对于SHA安全散列算法,以前没怎么使用过,仅仅是停留在听说过的阶段,今天在看图片缓存框架Glide源码时发现其缓存的Key采用的不是MD5加密算法,而是SHA-256加密算法,这才勾起了我的好 ...

  3. Android调用微信登陆、分享、支付

    前言:用了微信sdk各种痛苦,感觉比qq sdk调用麻烦多了,回调过于麻烦,还必须要在指定包名下的actvity进行回调,所以我在这里写一篇博客,有这个需求的朋友可以借鉴一下,以后自己别的项目有用到也 ...

  4. AbpZero--2.如何启动

    1.直接启动 VS中直接启动 2.IIS站点 IIS中配置一个站点来启动(推荐) 3.登录 系统默认创建2个用户 默认用户名:admin 密码:123qwe 租户:Default  默认用户名:adm ...

  5. %iowait和CPU使用率的正确认知

    resources 理解 %IOWAIT (%WIO) LINUX系统的CPU使用率和LOAD Linux Performance Observability Tools How Linux CPU ...

  6. bzoj3208--记忆化搜索

    题目大意: 花花山峰峦起伏,峰顶常年被雪,Memphis打算帮花花山风景区的人员开发一个滑雪项目.    我们可以把风景区看作一个n*n的地图,每个点有它的初始高度,滑雪只能从高处往低处滑[严格大于] ...

  7. MFC中成员变量的声明顺序与析构顺序

    第一次用博客,第一篇随笔,就写今天遇到的一个问题吧. 在VS2008的MFC对话框程序,窗口成员变量的声明顺序与其析构顺序相反,即,先声明的变量后析构,后声明的变量先析构.未在其他模式下测试. cla ...

  8. Java开发中的23种设计模式详解

    [放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...

  9. 驱动01.LED

    1.写出leds_open,leds_write函数2.1告诉内核这几个函数的存在?定义一个结构体file_operations2.2把这个结构体告诉内核?用register_chrdev(major ...

  10. OpenGL: 纹理采样 texture sample

    Sampler (GLSL) Sampler通常是在Fragment shader(片元着色器)内定义的,这是一个uniform类型的变量,即处理不同的片元时这个变量是一致不变的.一个sampler和 ...