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;
}
}
}
运行截图:
至此完毕。。。。
Guass列选主元消去法和三角分解法的更多相关文章
- 大规模问题的分解法-D-W分解法
大规模线性规划问题的求解极具挑战性,在效率.存储和数值稳定性等方面对算法都有很高的要求.但是这类问题常常非常稀疏且有特殊结构,能够分解为若干个较小规模问题求解. 线性规划问题的目标函数和非负约束都可分 ...
- Matlab数值计算示例: 牛顿插值法、LU分解法、拉格朗日插值法、牛顿插值法
本文源于一次课题作业,部分自己写的,部分借用了网上的demo 牛顿迭代法(1) x=1:0.01:2; y=x.^3-x.^2+sin(x)-1; plot(x,y,'linewidth',2);gr ...
- [Architecture] 系统架构正交分解法
[Architecture] 系统架构正交分解法 前言 随着企业成长,支持企业业务的软件,也会越来越庞大与复杂.当系统复杂到一定程度,开发人员会发现很多系统架构的设计细节,很难有条理.有组织的用一张大 ...
- 时间序列分解-STL分解法
时间序列分解-STL分解法 [转载时请注明来源]:http://www.cnblogs.com/runner-ljt/ Ljt 作为一个初学者,水平有限,欢迎交流指正. STL(’Seasonal a ...
- 项目管理——WBS工作分解法
首先我们要了解什么是WBS工作分解法 工作分解结构(Work Breakdown Structure,简称WBS)跟因数分解是一个原理,就是把一个项目,按一定的原则分解,项目分解成任务,任务再分解成一 ...
- Miiler-Robin素数测试与Pollard-Rho大数分解法
板题 Miiler-Robin素数测试 目前已知分解质因数以及检测质数确定性方法就只能\(sqrt{n}\)试除 但是我们可以基于大量测试的随机算法而有大把握说明一个数是质数 Miler-Robin素 ...
- [原创]浅谈对任务分解法WBS应用
[原创]浅谈对任务分解法WBS应用 1.WBS是什么? 即Work Breakdown Structure如何进行WBS分解:目标→任务→工作→活动 2.WBS分解的原则:将主体目标逐步细化分解,最底 ...
- Pollard_Rho 整数分解法【学习笔记】
引文:如果要对比较大的整数分解,显然之前所学的筛选法和是试除法都将不再适用.所以我们需要学习速度更快的Pollard_Rho算法. 算法原理: 生成两个整数a和b,计算p=gcd(a-b, n),知道 ...
- url映射 ccf (Java正则表达式80分解法)
问题描述 试题编号: 201803-3 试题名称: URL映射 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 URL 映射是诸如 Django.Ruby on Rails 等 ...
随机推荐
- Chrome V8引擎系列随笔 (1):Math.Random()函数概览
先让大家来看一幅图,这幅图是V8引擎4.7版本和4.9版本Math.Random()函数的值的分布图,我可以这么理解 .从下图中,也许你会认为这是个二维码?其实这幅图告诉我们一个道理,第二张图的点的分 ...
- ASP.NET Core 中文文档 第四章 MVC(3.9)视图组件
作者: Rick Anderson 翻译: 娄宇(Lyrics) 校对: 高嵩 章节: 介绍视图组件 创建视图组件 调用视图组件 演练:创建一个简单的视图组件 附加的资源 查看或下载示例代码 介绍视图 ...
- 分享两个BPM配置小技巧
1.小技巧 流程图修改后发布的话版本号会+1,修改次数多了之后可能会导致版本号很高,这个时候可以将流程导出,然后删除对应的流程包再导入,发布数据模型和流程图之后,版本清零 2.小技巧 有的同事入职后使 ...
- phpstorm 配置 xdebug调试工具
前言 php是脚本型程序 每次出错都要手动exit断点程序不是很方便 哪里有需求哪里就有生产,Xdebug可以实现对php的断点调试.下面将我个人的安装经历分享给大家. 运行环境 windows ...
- .NET Portability Analyzer 已开源
在一年前介绍过<介绍.NET 开发必备工具 .NET Portability Analyzer>,微软已经把代码开源到Github:https://github.com/Microsoft ...
- 一步步开发自己的博客 .NET版(1、基本显示)
前言 我们每个猿都有一个搭建自己独立博客的梦,我也不例外.以前想 现在想 以后也想.之所以一直迟迟没有着手,是因为难以跨出第一步.每次心里想着,等我以后技术好了再说,然后就没有然后了.以前用过word ...
- AutoMapper(一)
返回总目录 映射前后操作 偶尔有时候,在映射发生之前或之后,你可能需要执行一些自定义的逻辑.这可能是很少见的事情,因为在AutoMapper之外处理这些事情是更明显的.你可以创建一个映射前后的全局操作 ...
- With(ReadPast)就不会被阻塞吗?
在生产环境中,会有很多使用ReadPast查询提示的场合,来避免正在被其它事务锁定的行对当前查询造成阻塞,而又不会获取到“脏数据”. 可是很多人都疑惑,为什么我使用了ReadPast仍然有时会被阻塞? ...
- 最全的Windows Azure学习教程汇总
Windows Azure 是微软基于云计算的操作系统,能够为开发者提供一个平台,帮助开发可运行在云服务器.数据中心.Web 和 PC 上的应用程序. Azure 是一种灵活和支持互操作的平台,能够将 ...
- 解决VMWARE NAT SERVICE服务无法启动或服务消失的问题
解决VMWARE NAT SERVICE服务无法启动或服务消失的问题 2016-02-02 11:18 2012人阅读 评论(2) 收藏 举报 分类: 网络通信(3) 今日使用VMware中的Wi ...