Guass列主元消去法及其应用
Gauss列主元素消去法实验
Lab06.Gauss 列主元素消去法实验【实验目的和要求】1.使学生深入理解并掌握Gauss 消去法和Gauss 列主元素消去法步骤; 2.通过对Gauss 消去法和Gauss 列主元素消去法的程序设计,以提高学生程序设计的能力;3.对具体问题,分别用Gauss 消去法和Gauss 列主元素消去法求解。
通过对结果的分析比较,使学生感受Gauss 列主元素消去法优点。
【实验内容】1.根据Matlab 语言特点,描述Gauss 消去法和Gauss 列主元素消去法步骤。
2.编写用不选主元的直接三角分解法解线性方程组Ax=b 的M 文件。
要求输出Ax=b 中矩阵A 及向量b ,A=LU 分解的L 与U ,det A 及解向量x 。
3.编写用Gauss 列主元素消去法解线性方程组Ax=b 的M 文件。
要求输出Ax=b 中矩阵A 及向量b 、PA=LU 分解的L 与U 、det A 及解向量x ,交换顺序。
4.给定方程组(1) ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--11134.981.4987.023.116.427.199.103.601.3321x x x(2) ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡----15900001.582012151********.23107104321x x x x 先用编写的程序计算,再将(1)中的系数3.01改为3.00,0.987改为0.990;将(2)中的系数2.099999改为2.1,5.900001改为9.5,再用Gauss 列主元素消去法解,并将两次计算的结果进行比较。
【实验仪器与软件】1.CPU 主频在1GHz 以上,内存在128Mb 以上的PC ;2.Matlab 6.0及以上版本。
实验讲评:实验成绩:评阅教师:200 年 月 日Lab06.Gauss 列主元素消去法实验第一题:1、算法描述:Ⅰ、Gauss 消去法由书上定理5可知 设Ax=b ,其中A ∈R^(n(1)如果()0(1,2,....,1)k kka k n ≠=-,则可通过高斯消去法将Ax=b 约化为等价的 角形线性方程组,且计算公式为:① 消元计算(k=1,2,….,n-1)()()(1)()()(1)()()/,1,...,,,,1,...,,,1,...,.k k ik ik kk k k k ij ij ik kj k k k iiik k m a a i k n a a m a i j k n b b m b i k n ++==+=-=+=-=+② 回带公式()()()()()1/,()/,1,...,2,1.n n n n nn ni i i i iii j ii j i x b a x ba x a i n =+==-=-∑(2)如果A 为非奇异矩阵,则可通过高斯消去法将方程组Ax=b 约化方程组为上三角矩阵以上消元和回代过程总的乘除法次数为332333nn nn +-≈,加减法次数为32353263nnn n+-≈以上过程就叫高斯消去法。
Gauss列主元消去法、QR(MATLAB)
Gauss列主元消去法、QR(MATLAB)Gauss列主元消去法是一种线性方程组的求解方法,也称Gauss消去法。
其基本思想是将方程组转化为上三角矩阵,然后通过反向代入求解。
该方法的优点在于计算精度高,求解速度快,但缺点是需要大量的计算,尤其是在矩阵阶数较高时。
具体来讲,Gauss列主元消去法的步骤如下:步骤一:将系数矩阵A进行LU分解,其中L是下三角矩阵、U是上三角矩阵。
设$A=LU$,则原方程组可以写成$LUx=b$。
步骤二:通过初等矩阵左乘系数矩阵A,将每一列的主元变为该列所有元素中绝对值最大的那个元素。
这个过程称为选主元,可以避免计算中的数值不稳定问题。
步骤三:将选主元后的系数矩阵A进行LU分解,得到$L^{'}$、$U^{'}$。
步骤五:通过反向代入求解$U^{'}x=y$,得到$x$的解。
Gauss列主元消去法的实现通常通过矩阵的变换来实现。
对于$n$阶矩阵$A=[a_{ij}]$,通过一系列的行变换,可以将其变为上三角矩阵。
其中的变换可以表示为:$$ R_{i} \leftrightarrow R_{j} $$其中,$R_{i}$和$R_{j}$分别表示矩阵$A$中的第$i$行和第$j$行,$k$是一个非零常数。
这些变换被称为初等行变换。
在MATLAB中,可以使用已经实现好的{\color{blue}\texttt{gauss}}函数来求解线性方程组。
该函数实现的算法是Gauss列主元消去法。
其调用格式为:x = gauss(A,b)其中,$A$是系数矩阵,$b$是结果向量。
函数返回结果向量$x$。
如果$A$或$b$不合法,则函数会返回一个空向量。
除了Gauss列主元消去法,还有一种常用的求解线性方程组的方法是QR分解法。
步骤二:通过正交矩阵左乘系数矩阵$A$,使其变为一个上三角矩阵。
这个过程称为正交相似变换。
步骤三:将$b$进行正交相似变换,得到$Q^{T}b$。
Guass列选主元消去法和三角分解法
Guass列选主元消去法和三⾓分解法 最近数值计算学了Guass列主消元法和三⾓分解法解线性⽅程组,具体原理如下:1、Guass列选主元消去法对于AX =B1)、消元过程:将(A|B)进⾏变换为,其中是上三⾓矩阵。
即:k从1到n-1a、列选主元选取第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();boBox1.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 (boBox1.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 (boBox1.Text == "Doolittle三⾓分解法"){this.textBox3.Enabled = true;Doolittle(a, this.textBox2.Lines.GetUpperBound(0) + 1);bel3.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.开发语言可用任一种高级语言2.作业包括1)一份实验报告(书面,内容同电子版实验报告)2)电子版作业的全套(压缩后提交在Webcc上),包括:程序源代码;可执行程序;电子版实验报告(内容包括:一、实验目的二、模型建立3.1 开发环境3.2 程序设计说明(要求设计为通用的)3.3 源代码3.4 程序使用说明3.5 模型的解四、小结(可含个人心得体会))第二章应用题:投入产出(上机:列主元求解)一个城镇有三个主要企业:煤矿、电厂和铁路作为它的经济系统。
●生产价值1元的煤(产品1),需消耗0.3元的电费(中间产品2)和0.2元的运输费(中间产品3);●生产价值1元的电(产品2),需消耗0.4元的煤费(中间产品1)、0.1元的电费和0.1元的运输费;●提供价值1元的铁路运输服务(产品3),需消耗0.3元的煤费和0.2元的电费和0.2元运输费。
在某个星期内,除了三个企业间的彼此需求,煤矿得到6万元的订单(即最终产品1),电厂得到3万元的电量供应要求(即最终产品2),而地方铁路得到价值5万元的运输需求(即最终产品3)。
试问:(1)这三个企业在这星期各应生产多少产值才能满足内外需求?(提示: 中间产品+最终产品(外部需求)=总产品)(2)除了内部需求,试求这星期各企业之间的消耗需求,同时求出各企业新创造的价值。
(提示:内部消耗+新创价值=总产值)(3)若三个企业的外部需求分别增长1个单位(万元),则各企业的总产值分别增长多少?1.列主元算法编为一函数,在main()中调用。
实验报告的要求见“上机作业总要求”。
2.取4位小数计算.。
列主元素消去法
列主元素消去法列主元素消去法(Gauss-Jordan 消元法)是一种线性代数中常用的消元方法,用于求解线性方程组的解。
这种方法的基本思想是,将线性方程组的增广矩阵通过一系列的初等变换,化为一个阶梯矩阵或行简化阶梯矩阵,从而得到线性方程组的解。
具体步骤如下:构造增广矩阵,即将系数矩阵和常数矩阵组合成一个矩阵。
将增广矩阵转化为一个上三角矩阵(也叫阶梯矩阵)。
反向消元,将阶梯矩阵转化为一个行简化阶梯矩阵。
根据简化矩阵求解方程组。
这种方法的优点是计算简单、容易理解,且可避免误差的积累。
但是,如果矩阵的规模较大,运算量会很大,计算时间较长。
此时可以使用更高效的算法,如LU分解、QR分解等。
假设有一个 $n$ 个未知量和 $n$ 个方程的线性方程组,可以写成矩阵形式如下:$Ax = b$其中,$A$ 是一个 $n \times n$ 的系数矩阵,$x$ 是一个 $n \times 1$ 的未知量向量,$b$ 是一个 $n \times 1$ 的常数向量。
为了求解 $x$,可以将方程组的增广矩阵表示如下:$\begin{bmatrix} a_{11} & a_{12} & a_{13} & \cdots & a_{1n} & b_{1} \ a_{21} & a_{22} & a_{23} & \cdots & a_{2n} & b_{2} \ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \ a_{n1} & a_{n2} & a_{n3} & \cdots & a_{nn} & b_{n} \end{bmatrix}$ 其中,$a_{ij}$ 表示矩阵的第 $i$ 行第 $j$ 列的元素。
直接法解线性方程组 高斯(guass)与追赶法
实验一 直接法解线性方程组一、实验目的掌握列选主元消去法与追赶法解线性方程组。
二、实验内容分别写出Guass 列选主元消去法与追赶法的算法,编写程序上机调试出结果,要求所编程序适用于任何一解线性方程组问题,即能解决这一类问题,而不是某一个问题。
实验中以下列数据验证程序的正确性。
1、用Guass 列选主元消去法求解方程组 ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--5.58.37.33.47.11.85.16.93.51.53.25.2321x x x2、用追赶法求解方程组 ⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡-=⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡-----000010210210000210000210000254321x x x x x三、实验仪器设备与材料主流微型计算机四、实验原理1、Guass 列选主元消去法 对于AX =B1)、消元过程:将(A|B )进行变换为)~|~(B A ,其中A ~是上三角矩阵。
即:⎪⎪⎪⎪⎪⎭⎫⎝⎛→⎪⎪⎪⎪⎪⎭⎫ ⎝⎛n nnn n n nnn n n n b a b a b a a b a a a b a a a b a a a010122111221222221111211k 从1到n-1 a 、 列选主元选取第k 列中绝对值最大元素ik ni k a ≤≤max 作为主元。
b 、 换行ik ij kj b b n k j a a ⇔+=⇔,,1,c 、 归一化 kkk k kj kk kj b a b n k j a a a ⇒+=⇒/,,1,/d 、 消元nk i b b a b n k j n k i a a a a i k ik i ij kj ik ij ,,1,,,1;,,1, +=⇒-+=+=⇒-2)、回代过程:由)~|~(B A 解出11,,,x x x n n -。
1,2,,1,/1-=⇒-⇒∑+=n k x x ab x a b k nk j j kjk nnn n2、追赶法 线性方程组为: ⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛-----n n n n n nn n n f f f f f x x x x x a b c a b c a b c a b c a 132********33322211做LU 分解为: ⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛=⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛=-1111,12133221n n nR L βββαγαγαγα分解公式:⎪⎪⎪⎩⎪⎪⎪⎨⎧-===-====-)1,,2,1(),,3,2(,),,3,2(111n i c n i b b n i a i i i i i i i i i αββγααγ 则⎩⎨⎧==⇒=⇒=y Ux fLy f LUx f Ax 回代公式: ⎪⎪⎩⎪⎪⎨⎧=-==-),,3,2(1111n i y f y f y i i i i i αγα⎩⎨⎧--=-==+)1,,2,1(1n n i x y x y x i i i i n n β五、实验步骤1、理解并掌握列选主元消去法与追赶法;2、画出列选主元消去法与追赶法的流程图3、使用VC 语言编写出相应的程序并调试验证通过1.高斯消元核心代码:void guass(double a[],int n,double b[],double x[]) { int i,j,m;double s;for(i=1,j=0;i<n;i++,j++) { for(m=i;m<n;m++){ s=a[j*n+j]/a[m*n+j]; //printf("%f ",s); //printf("\n");for(int k=j;k<n;k++) { a[m*n+k]=a[m*n+k]*s-a[(i-1)*n+k];}b[m]=b[m]*s-b[i-1];}}for(i=n-1;i>-1;i--){if(i==n-1)x[i]=b[i]/a[i*n+i];else{s=b[i];for(j=1;j<n-i;j++){s=s-a[i*n+n-j]*x[n-j];}x[i]=s/a[i*n+i];}}}运行结果如下:2.追赶法核心代码:void chase(float a[],int n,float l[],float u[]){int i;for(i=1;i<=n-1;i++){l[i*n+i-1]=a[i*n+i-1];if(i==1)l[0]=a[0];elsel[(i-1)*n+i-1]=a[(i-1)*n+i-1]-l[(i-1)*n+i-2]*u[(i-2)*n+i-1];u[(i-1)*n+i-1]=1;u[(i-1)*n+i]=a[(i-1)*n+i]/l[(i-1)*n+i-1];}l[(i-1)*n+i-1]=a[(i-1)*n+i-1]-l[(i-1)*n+i-2]*u[(i-2)*n+i-1];u[(i-1)*n+i-1]=1;}void solve(int n,float l[],float u[],float f[]){float y[4],x[4];for(int i=1;i<=n;i++){if(i==1)y[i-1]=f[0]/l[0];elsey[i-1]=(f[i-1]-l[(i-1)*n+i-2]*y[i-2])/l[(i-1)*n+i-1];}for(i=n;i>0;i--){if(i==n)x[i-1]=y[i-1];elsex[i-1]=y[i-1]-x[i]*u[(i-1)*n+i];}for(i=0;i<n;i++)printf("%f ",x[i]);}运行结果:七、实验注意事项注意如何定义数据结构以保存矩阵和解以降低算法的复杂性。
列主元素Gauss消去法Jacobi迭代法原理及计算方法
一、 列主元素Gauss 消去法、Jacobi 迭代法原理及计算方法1. 列主元素Gauss 消去法:1.1 Gauss 消去法基本原理设有方程组Ax b =,设A 是可逆矩阵。
高斯消去法的基本思想就是将矩阵的初等行变换作用于方程组的增广矩阵[]B A b = ,将其中的A 变换成一个上三角矩阵,然后求解这个三角形方程组。
1.2 列主元Gauss 消去法计算步骤将方程组用增广矩阵[]()(1)ijn n B A b a ⨯+== 表示。
1). 消元过程对1,2,,1k n =-(1) 选主元,找{},1,,k i k k n ∈+ 使得 ,max k i k ik k i na a ≤≤= (2) 如果,0k i k a =,则矩阵A 奇异,程序结束;否则执行(3)。
(3) 如果k i k ≠,则交换第k 行与第k i 行对应元素位置,k kj i j a a ↔,,,1j k n =+ 。
(4) 消元,对,,i k n = ,计算/,ik ik kk l a a =对1,,1j k n =++ ,计算.ij ij ik kj a a l a =-2). 回代过程(1) 若0,nn a =则矩阵奇异,程序结束;否则执行(2)。
(2) ,1/;n n n nn x a a +=对1,,2,1i n =- ,计算,11/n i i n ij j ii j i x a a x a +=+⎛⎫=- ⎪⎝⎭∑2. Jacobi 迭代法2.1 Jacobi 迭代法基本原理Jacobi 迭代法的基本思想是对n 元线性方程组b Ax =,.,n n R b R A ∈∈将其变形为等价方程组f Bx x +=,其中.,,n n n n R x R f R B ∈∈∈⨯B 成为迭代矩阵。
从某一取定的初始向量)0(x 出发,按照一个适当的迭代公式 ,逐次计算出向量f Bx x k k +=+)()1( ( 1,0=k ),使得向量序列}{)(k x 收敛于方程组的精确解.(1)输入1,,,,)0(=k n xb A ε,. (2) )(1,1)0()1(∑≠=-=n j i i j ij i iii x a b a x )1,0(n i = (3)判断 ε≤--≤≤)0()1(10max i i n i x x ,若是,输出1)1(2)1(1,,n x x x ,若否,置1+=k k ,)1()0(i i x x =,)2,1(n i =。
gauss列主元素消去法matlab
高斯列主元素消去法是一种解线性方程组的常用方法,特别在数值分析和线性代数中应用广泛。
在Matlab中,我们可以使用该方法来解决大规模的线性方程组,包括矩阵的求解和矩阵的反转。
一、高斯列主元素消去法的基本原理高斯列主元素消去法是一种基于矩阵消元的方法,它通过一系列的矩阵变换将原始的线性方程组转化为上三角形式,然后再进行回代求解。
这个方法的核心就是通过矩阵的变换来简化原始的线性方程组,使得求解过程更加简单高效。
在Matlab中,我们可以利用矩阵运算和函数来实现高斯列主元素消去法,如`lu`分解函数和`\"`运算符等。
通过这些工具,我们能够快速地求解各种规模的线性方程组并得到准确的结果。
二、高斯列主元素消去法在Matlab中的实现在Matlab中,我们可以通过调用`lu`函数来实现高斯列主元素消去法。
该函数返回一个上三角矩阵U和一个置换矩阵P,使得PA=LU。
通过对U进行回代求解,我们可以得到线性方程组的解。
除了`lu`函数之外,Matlab还提供了一些其他的函数和工具来帮助我们实现高斯列主元素消去法,比如`\"`运算符和`inv`函数等。
通过这些工具的组合使用,我们能够更加灵活地进行线性方程组的求解,并且可以方便地处理特殊情况和边界条件。
三、高斯列主元素消去法的应用与局限性高斯列主元素消去法在实际应用中具有广泛的适用性,特别是对于大规模的线性方程组或者稀疏矩阵的求解。
通过Matlab中的工具和函数,我们可以快速地求解各种规模的线性方程组,并得到高精度的数值解。
然而,高斯列主元素消去法也存在一些局限性,比如对于奇异矩阵或者接近奇异矩阵的情况时,该方法的求解精度可能会下降。
在实际应用中,我们需要结合具体的问题和矩阵特性来选择合适的求解方法,以确保得到准确的结果。
四、个人观点和总结作为一种经典的线性方程组求解方法,高斯列主元素消去法在Matlab 中具有较好的实现和应用效果。
通过对其原理和实现细节的深入理解,我们能够更加灵活地应用该方法,并且能够更好地理解其适用性和局限性。
高斯列主元消元法解线性方程组
高斯列主元消元法解线性方程组一、题目:用Gauss 列主元消去法解线性方程组Ax b =,其中,A=17.031 -0.615 -2.991 1.007 -1.006 0.000-1.000 34.211 -1.000 -2.100 0.300 -1.7000.000 0.500 13.000 -0.500 1.000 -1.5004.501 3.110 -3.907 -61.705 12.170 8.9990.101 -8.012 -0.017 -0.910 4.918 0.1001.000 2.000 3.000 4.500 5.000 21.803⎛⎫ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎝⎭ 0.230 -52.322 54.000 240.236 29.304 -117.818b ⎛⎫ ⎪ ⎪ ⎪= ⎪ ⎪ ⎪ ⎪ ⎪⎝⎭T X=(0.907099 -1.961798 3.293738 -4.500708 3.029344 -5.255068)二、原理及步骤分析设nn ij R a A ⨯∈=][)1(,nn Rb b b b ∈=],,,[)1()2(2)1(1 。
若约化主元素),,2,1(0)(n k a k kk =≠,则通过高斯消元法将方程b AX =约化为三角形方程组求解。
如果在消元过程中发现某个约化主元0)(=k kk a , 则第K 次消元就无法进行。
此外,即使所有约化主元全不为零,虽然可以完成方程组的求解,但也无法保证结果的可靠性,因为计算过程中存在舍入误差。
为减少计算过程中的舍入误差对解的影响,在每次消元前,应先选择绝对值尽可能大的元作为约元的主元,如果在子块的第一列中选取主元,则相应方法称为列主元消元法。
相应过程为:(1)选主元:在子块的第一列中选择一个元)(k k i k a 使)(max k ik ni k kk i a a k ≤≤=并将第k 行元与第k i 行元互换。
数值计算基础Gauss列选主元消去法及追赶法
1、用Guass列选主元消去法求解方程组源程序代码:#include<stdio.h>#include<stdlib.h>#include<math.h>#define MAX_n 100#define PRECISION 0.0000001void MatrixInput(float A[][MAX_n],int m,int n)//输入数组{int i,j;float ftmp;printf("\n===Begin input Matrix elements===\n");for(i=1;i<=m;++i){printf("Input_Line %d : ",i);for(j=1;j<=n;++j){scanf("%f",&ftmp);A[i][j]=ftmp;}}}void MatrixOneColumnOutput(float A[][MAX_n],int n,int k)//输出方程的解{int i;for(i=1;i<=n;++i)printf("\nx[%d]=%f",i,A[i][k]);}int UpTriangle(float U[][MAX_n],int n)//解上三角方程组{int i,j;for(i=n;i>0;--i){if(fabs(U[i][i])<PRECISION)return 1;for(j=i+1;j<=n;++j)U[i][n+1]-=U[i][j]*U[j][n+1];U[i][n+1]/=U[i][i];}return 0;}void Swap(float *a,float *b)//a,b二个变量中的值交换{float ftmp;ftmp=*a;*a=*b;*b=ftmp;}int GaussElimination_column_select(float A[][MAX_n],int n)//选主元{ int i,j,k;float fTmp;for(i=1;i<n;++i){ //找主元所在行for(k=i,j=i+1;j<=n;++j)if(fabs(A[j][i])>fabs(A[k][i])) k=j;//二行交换for(j=i;j<=n+1;++j)Swap(&A[i][j],&A[k][j]);//消元if(fabs(A[i][i])<PRECISION)return 1;for(j=i+1;j<=n;++j)for(k=i+1;k<=n+1;++k)A[j][k]-=A[i][k]*A[j][i]/A[i][i];}UpTriangle(A,n);return 0;}void main(){int n;float A[MAX_n][MAX_n];printf("Input n=");scanf("%d",&n);if(n>=MAX_n-1){printf("\an must <%d!\n",MAX_n);exit(0);}MatrixInput(A,n,n+1);if(GaussElimination_column_select(A,n)) printf("\nGauss Failed!");else{printf("\nOutput Solution:");MatrixOneColumnOutput(A,n,n+1);printf("\n\n");}}运行结果:2、用追赶法求解方程组#include<stdio.h>#include<math.h>double ZhuiGanFa(double a[],double b[],double c[],double d[],int n); void main(){int n,i;double a[10],b[10],c[10],d[10];printf("Input n value:");/*表示n维向量*/scanf("%d",&n);printf("\n");printf("Now input the (a_i),i=1,2,…,%d: ",n-1);for(i=0;i<=n-2;i++)scanf("%lf",&a[i]);printf("Now input the (b_i),i=1,2,…,%d: ",n);for(i=0;i<=n-1;i++)scanf("%lf",&b[i]);printf("Now input the (c_i),i=1,2,…,%d: ",n-1);for(i=0;i<=n-2;i++)scanf("%lf",&c[i]);printf("Now input the (d_i),i=1,2,…,%d: ",n);for(i=0;i<=n-1;i++)scanf("%lf",&d[i]);ZhuiGanFa(a,b,c,d,n);}double ZhuiGanFa(double a[],double b[],double c[],double d[],int n) {int i;double t;if(fabs(b[0])<=fabs(c[0])||fabs(c[0])<=0||fabs(b[n-1])<fabs(a[n-2])||fabs(a[n-2])<=0)/*判断是否符合追赶法条件*/{printf("fail\n");return 0;}for(i=1;i<=n-2;i++){if(fabs(b[i])<(fabs(a[i])+fabs(c[i]))||a[i]*c[i]==0){printf("fail\n");return 0;}}c[0]=c[0]/b[0];d[0]=d[0]/b[0];for(i=1;i<=n-2;i++){t=b[i]-a[i-1]*c[i-1];c[i]=c[i]/t;d[i]=(d[i]-a[i-1]*d[i-1])/t;}d[n-1]=(d[n-1]-a[n-2]*d[n-2])/(b[n-1]-a[n-2]*c[n-2]);for(i=n-2;i>=0;i--)d[i]=d[i]-c[i]*d[i+1];printf("\n");for(i=0;i<=n-1;i++)printf("x(%d)=%f\n",i,d[i]);printf("\n");return 1;}运行结果1:运行结果2:。
Gauss消去法和列主元消去法
max=abs(C(s,s));big=0;
if det(C(s:n,s:n))==0
disp('此方程无解');
answer=0;
break;
end
for i=s:n
if max<abs(C(i,s))
max=abs(C(i,s));
k=i;
big=1;
else continue
for i=n:(-1):1
X(i,1)=C(i,n+1);
for j=(i+1):n
X(i,1)=X(i,1)-E(i,j)*X(j,1);
end
X(i,1)=X(i,1)/E(i,i);
ห้องสมุดไป่ตู้end
disp('此方程的解为:')
X
end
5、实验结果
请输入未知数系数矩阵A:
A=[2,-1,3;4,2,5;1,2,0]
3、实验原理
高斯列主元消去法
4、实验内容
clc;clear;format short
disp('请输入未知数系数矩阵A:');
A=input('A=');
disp('请输入常数项列向量B:');
B=input('B=');
C=[A,B];
[m,n]=size(A);
s=1;answer=1;P=zeros(1,n);L=zeros(n);I=eye(n);
y=a(i,k:n+1);a(i,k:n+1)=a(k,k:n+1);a(k,k:n+1)=y;
break;
实验二:Gauss列主元消去法
实验二:Gauss列主元消去法程序1:Gauss列主元消去法A=input('请输入线性方程组的增广矩阵A=');n=length(A)-1;x=zeros(n,1);aa=zeros(n,1);for j=1:nfor i=1:(n+1)AA(j,i)=abs(A(j,i));endendfor k=1:(n-1)for i=k:naa(i-(k-1))=AA(i,k);endfor i=k:nif AA(i,k)==max(aa)breakendendif AA(i,k)==0breakfprintf('方程组系数矩阵奇异\n');elsefor j=k:(n+1)jh=A(i,j);A(i,j)=A(k,j);A(k,j)=jh;endendfenzi=A(k,k);for j=k:(n+1)A(k,j)=A(k,j)/fenzi;endfor p=(k+1):njj=A(p,k);for j=k:(n+1)A(p,j)=A(p,j)-jj*A(k,j);endendendif k==(n-1)x(n)=A(n,(n+1))/A(n,n);for i=(n-1):(-1):1he=0;for j=(i+1):nhe=he+A(i,j)*x(j);endx(i)=A(i,(n+1))-he;endendx用Gauss列主元消去法解方程组:1.请输入线性方程组的增广矩阵A=[1e-008,2,3,1;-1,3.172,4.623,2;-2,1.072,5. 643,3]x =-0.4653-0.07000.38002.请输入线性方程组的增广矩阵A=[4,-2,4,10;-2,17,10,3;-4,10,9,-7];x =2.94640.6071-0.14293.请输入线性方程组的增广矩阵A=[0.3e-020,1,0.7;1,1,0.9]x =0.20000.7000程序2:不选主元的高斯消去法A=input('请输入线性方程组的增广矩阵A=');n=length(A)-1;x=zeros(n,1);for k=1:(n-1)if A(k,k)==0breakfprintf('方程组不能用普通的高斯消去法解\n');elsefenzi=A(k,k);for j=k:(n+1)A(k,j)=A(k,j)/fenzi;endfor p=(k+1):njj=A(p,k);for j=k:(n+1)A(p,j)=A(p,j)-jj*A(k,j);endendx(n)=A(n,(n+1))/A(n,n);for i=(n-1):(-1):1he=0;for j=(i+1):nhe=he+A(i,j)*x(j);endx(i)=A(i,(n+1))-he;endendendx用不选主元的Gauss消去法解方程组:1.请输入线性方程组的增广矩阵A=[4,-2,4,10;-2,17,10,3;-4,10,9,-7];x =2.94640.6071-0.14292.请输入线性方程组的增广矩阵A=[1e-008,2,3,1;-1,3.172,4.623,2;-2,1.072,5. 643,3];x =-0.4653-0.07000.38003.请输入线性方程组的增广矩阵A=[0.3e-020,1,0.7;1,1,0.9]x =0.7000。
高斯消元法与列主元消去法实验报告
实验报告:Gauss消元法小组成员:李岚岚、邱粉珊、缪晓浓、杨水清学号:0917020040、0917010078、0917010073、0917010112一、实验问题编写两个程序,分别利用Gauss消元法和列主元消去法求解方程组二、分析及其计算过程Gauss顺序消元法:源程序:function [x]=gaussl(A,b)[n1,n2]=size(A);n3=size(b);if n1~=n2|n2~=n3|n1~=n3disp('A的行和列的维数不同!');return;endif det(A)==0disp('系数矩阵A奇异');return;end%消元过程L=eye(n1);for j=2:n1for i=j:n1L(i,j-1)=A(i,j-1)/A(j-1,j-1);A(i,:)=A(i,:)-L(i,j-1)*A(j-1,:);b(i)=b(i)-L(i,j-1)*b(j-1);endend%回代过程x(n1)=b(n1)/A(n1,n1);for t=n1-1:-1:1for k=n1:-1:t+1b(t)=b(t)-A(t,k)*x(k);endx(t)=b(t)/A(t,t);end程序的运行以及结果:>>A=[1 2/3 1/3;9/20 1 11/20;2/3 1/3 1];>>b=[2 2 2];>> [x]=gaussl(A,b)x =1 1 1Gauss列主元消去法:源程序:function [x]=gaussll(A,b) [n1,n2]=size(A);n3=size(b);if n1~=n2|n1~=n3|n2~=n3disp('输入的方程错误!');return;endif det(A)==0disp('系数矩阵A奇异');return;endmax=zeros(n1);for m=1:n1%找主元for i=m:n1if abs(A(i,m))>maxmax=A(i,:);A(i,:)=A(m,:);A(m,:)=max;maxb=b(i);b(i)=b(m);b(m)=maxb;endend%消元过程L=eye(n1);for j=2:n1for i=j:n1L(i,j-1)=A(i,j-1)/A(j-1,j-1);A(i,:)=A(i,:)-L(i,j-1)*A(j-1,:);b(i)=b(i)-L(i,j-1)*b(j-1);endendend%回代过程x(n1)=b(n1)/A(n1,n1);for t=n1-1:-1:1for k=n1:-1:t+1b(t)=b(t)-A(t,k)*x(k);endx(t)=b(t)/A(t,t);end程序的运行以及结果:>>A=[-0.002 2 2;1 0.78125 0;3.996 5.5625 4]; >>b=[0.4 1.3816 7.4178];>>[x]= gaussll(A,b)x =1.9273 -0.6985 0.9004。
解线性代数方程组的直接法之Gauss主元消去法及其C++编程代码
解线性代数方程组的直接法—Gauss 主元消去法最近学习数值分析,为了能够边学习边训练编程,笔者决定对于所学算法一一分析记录,也便于自己以后复习时候的查阅,在这里顺便和大家共享一下我的学习经验,共勉今天主要写的是求解线性方程组的直接法之一Gauss 主元消去法 的基本算法步骤和用C++编程实现的具体过程,内容比较简单,代码已经经过测试,可以直接使用。
首先就是Gauss 顺序消去法的基本原理:主元消去法只是在顺序消元法进行前采取选主元措施。
对于Ax=b 这样一非齐次线性方程组,要求解x 列向量,利用线性代数方面的知识,我们可以对(A|b)这样一个增广矩阵做初等行变换,化为矩阵A 下三角为零的形式。
这个时候再进行回代操作就可以计算出来x 列向量啦。
例如:对矩阵Ax=b;111213*********,11,21,31,,1,2,3,A n n n n n n n n n n n n a a a a a a a a a a a a a a a a ----⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦ ... ... = ... ... ... ,121...n n b b b b b -⎡⎤⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎣⎦ 则对应A 的增广矩阵如下:11112131212223221,11,21,31,1,1,2,3,.........(A |b).........n n n n n n n n n n n n nn b a a a a a a a a b a a a a b a a a a b -----⎡⎤⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎣⎦第一步:以(A|b)的第一行为基,对的第2行到第n 行进行初等行变换; 假设110a ≠,将第1行的111i a a -倍加到第i 行(i=2,3,…,n),通式为 (2)(1)1111(j 1,2,...,n,n 1)i ij ij j a a a a a =-=+ 注意这里的j 是从1到n+1取值的; a ij 的上标(1),(2)只是用来表示数据a ij 前一时刻和当前时刻的值经过消元,增广矩阵(A|b)变成下面的形式:(1)(1)(1)(1)(1)11112131(2)(2)(2)(2)222232(2)(2)(2)(2)1,21,31,1(2)(2)(2)(2),2,3, 0...(A |b)......0...0...nnn n n n n n n n nn b a a a a b a a a a a a b a a a b ----⎡⎤⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦到这里,第一步就进行完啦,下来的第2步一直到第n-1步都和上面道理一样,那么进行完n-1步以后,我们得到这样一个增广矩阵:(1)(1)(1)(1)(1)111121,11(2)(2)(2)(2)2222,2(n 1)(n 1)(n 1)1,11,1(n 1)(n 1), 0...(A |b)......00 (00)...0n nnnn n n n n n nn b a a a a b a a a a a b a b ----------⎡⎤⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦嘿嘿,到这里基本就可以大功搞成了。
gauss列主元消去法条件 -回复
gauss列主元消去法条件-回复Gauss列主元消去法是一种常用的线性方程组求解方法,它通过高斯消元和行交换的方式将一个线性方程组转化为上三角形方程组,从而方便地求解未知数的值。
在实际操作中,我们需要注意一些条件和步骤,以确保计算过程的正确性和可行性。
一、线性方程组的条件在使用Gauss列主元消去法求解线性方程组时,需要满足以下两个条件:1. 方程组必须是齐次或非齐次的线性方程组。
所谓齐次的线性方程组是指常数项全部为零的线性方程组,即右端项为零向量;非齐次的线性方程组则是指右端项不为零的线性方程组。
2. 方程组的未知数个数必须等于方程组的方程个数。
这意味着方程组必须是方阵,即系数矩阵的行数和列数相等。
满足以上两个条件后,可以应用Gauss列主元消去法对线性方程组进行求解。
二、Gauss列主元消去法的步骤下面我们一步一步来详细解释Gauss列主元消去法的过程。
步骤1:构造增广矩阵首先,将线性方程组的系数矩阵和右端项向量排列在一起,构成增广矩阵。
例如,对于一个3×3的线性方程组:a11x1 + a12x2 + a13x3 = b1a21x1 + a22x2 + a23x3 = b2a31x1 + a32x2 + a33x3 = b3构造的增广矩阵为:[ a11 a12 a13 b1 ][ a21 a22 a23 b2 ][ a31 a32 a33 b3 ]步骤2:选取主元在消元过程中,我们需要选取一个主元素进行消元,目的是将主元素所在的列下方的元素全部消为零。
为了提高计算的精确性,我们在选取主元素时通常选择当前列的绝对值最大的元素。
即,在第i列中,选取使得a[i][i]最大的行k,然后将第k行与第i行进行交换,将主元素移动到当前位置。
步骤3:高斯消元通过选取主元后,我们开始进行高斯消元的操作。
对于第i行以下的每一行j,执行如下操作:1. 计算倍数m,使得第j行的第i列元素消为零。
倍数m的值为第j行第i列的元素除以主元素所在位置的元素值,即m=a[j][i]/a[i][i]。
数值分析实验二(列主元Gauss消去法)
《数值分析》实验报告实验编号:实验二课题名称:列主元Gauss消去法一、算法介绍1、输入矩阵的阶数n,方程组的增广矩阵A;2、对k=0,1,…,n-2,循环:选取列中绝对值最大的元素,将主元所在的行的元素保存在数组temp[n+1]中。
若主元为零,则系数矩阵奇异,计算停止;否则,顺序进行。
如果绝对值最大的元素就在矩阵的对角线上,则进行普通高斯消元法的第一大步,否则将方程组系数换行之后再进行普通高斯消元法的第一大步;3、然后利用回代法求解线性方程组。
二、程序代码#include<iostream>#include<cmath>#include<iomanip>using namespace std;int main(){int n=0,k=0,i=0,j=0,h=0,g=0,flag=0,i1,j1;double max=0,m=0;cout<<"***利用列主元Gauss消元法求解线性方程组***"<<endl;cout<<"请输入矩阵的阶数:"<<endl;cin>>n;double a[n][n+1];double t[n+1];double x[n];memset(a,0,sizeof(a));memset(x,0,sizeof(x));cout<<"请输入方程组的增广矩阵:"<<endl;for(i=0;i<n;i++){for(j=0;j<n+1;j++){cin>>a[i][j];}}for(k=0;k<n-1;k++){max=0;j1=0;for(i=k;i<n;i++){if(fabs(a[i][k])>max){max=fabs(a[i][k]);i1=i;j1=k;}}if(max==0){cout<<"该系数矩阵为奇异矩阵,计算停止"<<endl;flag=1;break;}else{cout<<"第"<<j1+1<<"列中绝对值最大的元素是"<<a[i1][j1]<<",在线性方程组的第"<<i1+1<<"行"<<endl;if(i1!=k){for(j=0;j<=n;j++){t[j]=a[i1][j];a[i1][j]=a[k][j];a[k][j]=t[j];}}for(i=k+1;i<=n-1;i++){m=a[i][k]/a[k][k];for(j=k;j<=n;j++)a[i][j]=a[i][j]-m*a[k][j];for(g=0;g<n;g++){for(h=0;h<n+1;h++)cout<<setiosflags(ios::fixed)<<setprecision(2)<<a[g][h]<<" ";cout<<endl;}cout<<endl;}}}if(flag==0){x[n-1]=a[n-1][n]/a[n-1][n-1] ;double sum=0;for(k=n-2;k>=0;k--){sum=0;for(i=n-1;i>=k;i--)sum+=a[k][i]*x[i];x[k]=(a[k][n]-sum)/a[k][k];}cout<<"该线性方程组的解为:"<<endl;for(i=0;i<n;i++)cout<<"x"<<i+1<<"="<<setiosflags(ios::fixed)<<setprecision(2)<<x[i]<<endl;}system("pause");return 0;}三、运算结果截屏四、算法分析列主元Gauss消元法避免了普通高斯消元法中出现的问题:遇到某个主元为零或者当主元绝对值很小时,计算将会停止或求出的结果将与其实际结果相差很远。
高斯消元法和列主元消元法
用第二列的3、4行除以 k22得
- 25 - 5 = 11 = k 32 90 18 11
k
42
=
3 1 9 1
2 1 = 0 1
16 45
第三行减去第二行乘以 k 3 2 , 第四行减去第二行乘以k 4 2 。
由以上可得:
骣 1 5 ç11 ç ç 32 ç 0 19 ç ç 11 11 ç ç ç ç 1870 ç0 0 ç ç 198 ç ç ç ç 0 0 - 1727 ç ç 桫 495 - 4 25 11 1133 198 8195 495 13 ÷ ÷ ÷ 147 ÷ ÷ ÷ 11 ÷ ÷ ÷ ÷ 3003 ÷ ÷ ÷ ÷ 198 ÷ ÷ ÷ 6468 ÷ ÷ ÷ ÷ 495 ÷
- 4 25 11 1133 198 3421705518 183278700
÷ ÷ ÷ ÷ 147 ÷ ÷ ÷ 11 ÷ ÷ ÷ ÷ 3003 ÷ ÷ ÷ ÷ 198 ÷ ÷ 3421705518 ÷ ÷ ÷ ÷ 183278700 ÷
13
回代过程可得:
X 4 = 1; X 3 = 1; X 2 = 1; X 1 = 1;
1 k 41 = 11
第二行减去第一行乘以 k 21 , 第三行减去第一行乘以 第四行减去第一行乘以
k k
31
,
。
41
由此上可得:
骣 1 ç11 ç ç 90 ç0 ç ç 11 ç ç ç ç ç 0 - 25 ç ç 11 ç ç ç 32 ç0 ç ç 桫 11 5 - 4 13 ÷ ÷ ÷ 32 25 147 ÷ ÷ ÷ 11 11 11 ÷ ÷ ÷ ÷ 95 56 126 ÷ ÷ ÷ ÷ 11 11 11 ÷ ÷ ÷ - 27 191 196 ÷ ÷ ÷ ÷ 11 11 11
用Gauss列主元消去法求解方程组
\\本程序适用于n个方程,n个未知数的线性代数方程组# include "stdio.h"# include"math.h"# define eps 1e-8# define n 2\\以上为定义部分main(){int t,i,j,k;double T,m[3][3],x[3];double A[3][3]={{2,2,3},{4,7,7},{-2,4,5}};double b[3]={3,1,-7};\\以上为输入部分for(k=0;k<n;k++){t=k;for(i=k+1;i<=n;i++){if(fabs(A[t][k])<fabs(A[i][k]))t=i;}\\寻找第k列的主元素(绝对值最大的数)for(j=k;j<=n;j++){T=A[t][j];A[t][j]=A[k][j];A[k][j]=T;}T=b[k];b[k]=b[t];b[t]=T;\\把主元素及其所在的行与第k行交换if(fabs(A[k][k])<=eps){printf("fail!");exit();}\\判断系数矩阵的行列式的值是否为0,确定是否有唯一解for(i=k+1;i<=n;i++){m[i][k]=A[i][k]/A[k][k];for(j=k+1;j<=n;j++){A[i][j]=A[i][j]-m[i][k]*A[k][j];}b[i]=b[i]-m[i][k]*b[k];A[i][k]=0.000000;}\\消元,把第k列对角线以下的系数通过矩阵变换化为0 for(i=0;i<=n;i++){for(j=0;j<=n;j++)printf("%f\t",A[i][j]);printf("%f\n",b[i]);}printf("\n");}\\输出消元后的系数矩阵和右端项\\上述过程为消元过程,以下为回代过程if(fabs(A[n][n])<=eps){printf("A[%d][%d]=0,fail!",n,n);exit(); }\\判断是否有唯一解elsex[n]=b[n]/A[n][n];\\最后一行求解xnfor(i=n-1;i>=0;i--){for(j=i+1;j<=n;j++){ b[i]=b[i]-A[i][j]*x[j];}x[i]=b[i]/A[i][i];}\\从n-1行依次求解x(n-1) (x1)printf("Result is:\n");for(i=0;i<=n;i++)printf("X%d=%f\t",i,x[i]);}\\输出结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验目的与要求了解Guass列主元消去法及其应用,掌握利用Guass列主元消去法解方程,解决实际问题二、模型求解0.x+0.4y+0.3z+60000=x0.3x+0.1y+0.2z+30000=y0.2x+0.1y+0.2z+50000=z三、源代码:#include <stdio.h>#include <stdlib.h>#include <math.h>#define N 20#define EPS 1.0e-4double a[N][N],b[N],c[N][N],d[N][N];void swap(double &a,double &b)//换行{double temp;temp=a;a=b;a=temp;}void gauss(double a[][N],double b[N],int n)//gauss求解{int i,j,k,l;double temp,m;for(k=0;k<=n-2;k++){temp=fabs(a[k][k]); //选主元l=k;for(i=k+1;i<n;i++){if(fabs(a[i][k]>temp))//fabs为取绝对值函数。
包含在头文件math.h中{temp=fabs(a[i][k]);l=i;}}if(fabs(a[l][k])<EPS){printf("方程有无数组解!");exit(0);}if(l!=k) //换行{for(j=k;j<=n-1;j++)swap(a[l][j],a[k][j]);swap(b[l],b[k]);}for(i=k+1;i<n;i++) //按行进行消元{m=a[i][k]/a[k][k];//行乘数for(j=k;j<n;j++)a[i][j]-=m*a[k][j];b[i]-=m*b[k];}}if(a[n-1][n-1]==0) //矩阵行列式值为0 {printf("矩阵的行列式为0!\n");exit(-1);}b[n-1]/=a[n-1][n-1];for(i=n-2;i>=0;i--){for(j=n-1;j>i;j--)b[i]-=a[i][j]*b[j];b[i]/=a[i][i];}}void main(){int i,j,n;double temp=0.0;printf("请输入要求解的方程数:"); //矩阵维数为n scanf("%d",&n);printf("请输入矩阵a[%d][%d]:\n",n,n);for(i=0;i<n;i++) //系数矩阵a for(j=0;j<n;j++)scanf("%lf",&a[i][j]);printf("请输入矩阵b[%d]:\n",n);for(i=0;i<n;i++) //矩阵b的输入scanf("%lf",&b[i]);gauss(a,b,n); //高斯求解法for(i=0;i<n;i++) //输出结果printf("X%d= %+.4f\n",i+1,b[i]);printf("请输入矩阵c[%d][%d]:\n",n,n);for(i=0;i<n;i++) //系数矩阵c for(j=0;j<n;j++)scanf("%lf",&c[i][j]);for(i=0;i<n;i++)for(j=0;j<n;j++)d[j][i]=c[j][i]*b[i];for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%.4f ",d[i][j]);printf("\n");}}四、实验小结:通过本次实验,对如何利用Guass列主元消去法解决实际问题有了一定的经验。
注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。
算法二#define N 200#include "stdio.h"#include "math.h"FILE *fp1,*fp2;void LZ(){int n,i,j,k=0,l;double d,t,t1;static double x[N],a[N][N];fp1=fopen("a1.txt","r");fp2=fopen("b1.txt","w");fscanf(fp1,"%d",&n);for(i=0;i<n;++i)for(j=0;j<=n;++j){fscanf(fp1,"%lf",&a[i][j]);}do{d=a[k][k];l=k;i=k+1;do{if(fabs(a[i][k])>fabs(d)) /*Ñ¡Ö÷Ôª*/{d=a[i][k];l=i;}i++;}while(i<n);if(d==0){printf("\nÊäÈë¶ØÕóÑĞÎó£¡\n");}else{ /*»»ĞĞ*/if(l!=k){for(j=k;j<=n;j++){t=a[l][j];a[l][j]=a[k][j];a[k][j]=t;}}}for(j=k+1;j<=n;j++) /*ÕıÏû*/a[k][j]/=a[k][k];for(i=k+1;i<n;i++)for(j=k+1;j<=n;j++)a[i][j]-=a[i][k]*a[k][j];k++;}while(k<n);if(k!=0){for(i=n-1;i>=0;i--) /*»Ø´ú*/{t1=0;for(j=i+1;j<n;j++)t1+=a[i][j]*x[j];x[i]=a[i][n]-t1;}}for(i=0;i<n;i++)fprintf(fp2,"\n·½³Ì×éµÄ¸ùΪx[%d]=%lf",i+1,x[i]); fclose(fp1);fclose(fp2);}main(){LZ();}#include<stdio.h>#include<math.h>#define N 100//¶¨Óå¶ØÕóµÄ×î´óĞĞint n;//±ìʶ¶ØÕóµÄĞĞ£¬ÁĞ¡£double matix[N][N];//¶ØÕóµÄ×î´óĞĞ£¬×î´óÁв»double unit[N][N];bool findmax(int s)//´Ñsµ´nĞĞÈ¡Òñ×î´óµÄ£¬×÷ΪÉ÷Òª¡£{int i,j,k;double mas,temp;mas=fabs(matix[s][s]);k=s;for(i=s+1;i<n;i++){if(mas<fabs(matix[i][s])) {mas=fabs(matix[i][s]);k=i;} }if(mas==0) return false;//´»»»Á´ĞĞfor(j=0;j<n;j++){temp=matix[s][j];matix[s][j]=matix[k][j];matix[k][j]=temp;temp=unit[s][j];unit[s][j]=unit[k][j];unit[k][j]=temp;}return true;}void chuli(int s){int i,j;double mas=matix[s][s],r;for(i=s+1;i<n;i++){r=matix[i][s]/mas;for(j=0;j<n;j++){matix[i][j]=matix[i][j]-matix[s][j]*r; unit[i][j]=unit[i][j]-unit[s][j]*r;}}}void solve(int s){int i,j;double mas;mas=matix[s][s];for(i=s;i<n;i++)matix[s][i]=matix[s][i]/mas;for(i=0;i<n;i++)unit[s][i]=unit[s][i]/mas;for(i=s-1;i>=0;i--){mas=matix[i][s];matix[i][s]=0;for(j=0;j<n;j++)unit[i][j]=unit[i][j]-mas*unit[s][j]; }}int main(){int i,j;//ÊäÈëscanf("%d",&n);for(i=0;i<n;i++){for(j=0;j<n;j++)if(i==j) unit[i][j]=1;else unit[i][j]=0;scanf("%lf",&matix[i][j]);}}//Êä³ö//ת³ÇÇÏÈı´Æfor(i=0;i<n-1;i++){//ÿһ´ÎÑ¡Ò»¸ö¾ø¶ÔÖµ×î´óµÄÖµ×÷Ϊaii if(findmax(i)){chuli(i);}else{printf("¸Ã¾ØÕ󲻿ÉÄæ");return 0;}}//ת³Éµ¥Î»Õófor(i=n-1;i>=0;i--){solve(i);}//ÆäÄæ¾ØÕóÊÇfor(i=0;i<n;i++){for(j=0;j<n;j++)printf("%.2lf ",unit[i][j]);printf("\n");}return 0;}/************************************************************** ************¸ß˹ÁĞÉ÷ÒªËØÏûÈ¥·¨Æó´â¶ØÕó·´³ÐAX=B,ÆäÉĞAÊÆN*NµÄ¶ØÕó,BÊÆN*M¶ØÕó * ÊäÈë: n----·´ÕóAµÄĞĞÊı* a----¾ØÕóA* m----¶ØÕóBµÄÁĞÊı* b----¾ØÕóB* Êä³ö: det----¶ØÕóAµÄĞĞÁĞʴɵ* a----AÏûÒªºóµÄÇÏÈı´Æ¶ØÕó* b----¾ØÕ󷽳̵ĽâX*************************************************************** ***********/double gaussian_elimination(int n,double a[N][N],int m,double b[N][M]){int i,j,k,mk;double det,mm,f;det = 1.0;for(k = 0;k<n-1;k++) /*Ñ¡Ö÷Ôª²¢ÏûÔª*/{mm=a[k][k];mk = k;for(i=k+1;i<n;i++) /*È¡ÒñµÔKÁĞÖ÷ÔªËØ*/{if(fabs(mm)<fabs(a[k])){mm = a[k];mk = i;}}if(fabs(mm)<EPS)return(0);if(mk!=k) /* ´«µÔKÁĞÉ÷ÒªËØ»»Ğе´¶Ò´ÆÏßÇÏ*/{for(j=k;j<n;j++){f = a[k][j];a[k][j]=a[mk][j];a[mk][j]=f;}for(j=0;j<m;j++){f = b[k][j];b[k][j]=b[mk][j];b[mk][j]=f;}det = -det;}for(i=k+1;i<n;i++) /*´«µÔKÁжҴÆÏßÓÒÏÂÏûҪΪÁã*/ {mm = a[k]/a[k][k];a[k]=0.0;for(j=k+1;j<n;j++)a[j]=a[j]-mm*a[k][j];for(j=0;j<m;j++)b[j]=b[j]-mm*b[k][j];}det = det*a[k][k];}if(fabs(a[k][k])<EPS)return 0;det=det*a[k][k];for(i=0;i<m;i++) /*»Ø´úÇó½â*/{b[n-1]=b[n-1]/a[n-1][n-1];for(j=n-2;j>=0;j--){for(k=j+1;k<n;k++)b[j]=b[j]-a[j][k]*b[k];b[j]=b[j]/a[j][j];}}return(det);}#include<math.h>#include<stdio.h>#define NUMBER 20#define Esc 0x1b#define Enter 0x0dfloat A[NUMBER][NUMBER+1] ,ark;int flag,n;exchange(int r,int k);float max(int k);message();main(){float x[NUMBER]; /*´ËÊı×éÑÃÑÔ´æ·Å·´³Ð´â*/int r,k,i,j;char celect;clrscr();printf("\n\nÑÃGaussÁĞÉ÷ÒªÏûÒª·¨´âÏßĞÒ·´³Ð×é");printf("\n\n1.½â·½³Ì×éÇë°´Enter.");printf("\n\n2.Í˳ö³ÌʽÇë°´Esc.");celect=getch();if(celect==Esc)exit(0);printf("\n\n ÊäÈë·´³Ð×éµÄάÊı£ºn=");scanf("%d",&n);printf(" \n\nÏÉÒÔÊäÈëϵÊı¶ØÕóAºÍÏòÁ¿b:");for(i=1;i<=n;i++){printf("\n\nÇëÊäÈëa%d1--a%d%dϵÊıºÍÏòÁ¿b%d:",i,i,n,i);/*ʵÏÉ´«Ã¿Ó»ĞĞÉеÄϵÊıºÍÏòÁ¿Ó»´ÎĞÒÊäÈ룬ÊıÉ®µäÑÿոñ¸ñ¿ª£¬ÊäÍêºó»Ø³µÈ·¶¨*/for(j=1;j<=n+1;j++) /*´«¸Õ²ÅÊäÈëµÄÊı´æÈëÊı×é*/scanf("%f",&A[i][j]);}for(k=1;k<=n-1;k++){ark=max(k);if(ark==0)/*ÅжϷ´³ÐÊÆ·ñΪÏßĞÒ·´³Ð£¬µ´ÊÆ·ñºÏ·¨*/{printf("\n\n´Ë·½³Ì×é²»ºÏ·¨!");message(); }else if(flag!=k)exchange(flag,k);for(i=k+1;i<=n;i++)for(j=k+1;j<=n+1;j++)A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k];}x[n]=A[n][n+1]/A[n][n];for( k=n-1;k>=1;k--){float me=0;for(j=k+1;j<=n;j++){me=me+A[k][j]*x[j];}x[k]=(A[k][n+1]-me)/A[k][k];}for(i=1;i<=n;i++){printf(" \n\nx%d=%f",i,x[i]);}message();}exchange(int r,int k) /*´»»»ĞеĶغ¯Êı*/ {int i;for(i=1;i<=n+1;i++)A[0][i]=A[r][i];for(i=1;i<=n+1;i++)A[r][i]=A[k][i];for(i=1;i<=n+1;i++)A[k][i]=A[0][i];}float max(int k) /*±ÈУϵÊı´óĞ¡µÄº¯Êı*/{int i;float temp=0;for(i=k;i<=n;i++)if(fabs(A[i][k])>temp){temp=fabs(A[i][k]);flag=i;}return temp;}message()/*ʵÏɲ˵¥È¡ÒñµÄº¯Êı*/{printf("\n\n µÐĞøÒËËã°´ Enter ,Í˳ö³ÐÊ´°´ Esc!"); switch(getch()){case Enter: main();case Esc: exit(0);default:{printf("\n\n²»ºÏ·¨µÄÊäÈë!");message();} }}#include<stdio.h>#include<math.h>#define N 10int main(){int i=0,j=0,r=0,n=0,k=1;float a[N][N],x[N],max=-1,sum1=0,sum2=0;//ÊäÈë¶ØÕóάÊıprintf("Please enter n(0<n<11):\n");scanf("%d",&n);//ÊäÈë¶ØÕóÒªËØ£¬×îºóÓ»ÁĞΪb[]for(i=1;i<=n;i++){for(j=1;j<=n+1;j++){printf("Please enter a[%d][%d]:\n",i,j);scanf("%f",&a[i][j]);}}do{for(i=k;i<=n;i++){if(fabs(a[i][k])>max){max=a[i][k];r=i;}if(a[r][k]==0){printf("Cannot solve!\n");exit(1);}}//»»ĞĞfor(j=1;j<=n+1;j++){sum1=a[k][j];a[k][j]=a[r][j];a[r][j]=sum1;}//´«¶ØÕó»¯ÎªÇÏÈı´Æ¶ØÕófor(i=k+1;i<=n;i++){for(j=k+1;j<=n+1;j++){a[i][j]=a[i][j]-(a[i][k])*(a[k][j])/(a[k][k]);}}k=k+1;max=-1;}while(k<(n-1));//Çóx[]x[n]=(a[n][n+1])/(a[n][n]);for(k=n-1;k>=1;k--){for(j=k+1;j<=n;j++)sum2=sum2+(a[k][j])*(x[j]);x[k]=(a[k][n+1]-sum2)/(a[k][k]);sum2=0;}//Êä³ö½á¹ûfor(i=1;i<=n;i++){printf("%f\n",x[i]);}while(1);return 0;}算法三:用高斯列主元消元法解线性方程组一、课程设计时间2007年9月10日至2007年9月14日,共计1周,20学时。