高斯列主元消元法解方程组

合集下载

用列主元高斯消元法求线性代数方程组的解

用列主元高斯消元法求线性代数方程组的解

课程设计任务书前 言回顾普通解方程组的方法,一般都是先逐个削去未知变量,最终得到只有一个未知变量的方程,解之,把得到的值回代到消去变量过程中得到的方程组,逐个求出未知变量。

这种解线性方程组的基本方法就是这里要介绍的高斯消去法。

数学上,高斯消元法(或译:高斯消去法),是线性代数中的一个算法,可用来为线性方程组求解,求出矩阵的秩,以及求出可逆方阵的逆矩阵。

当用于一个矩阵时,高斯消元法会产生出一个“行梯阵式”。

高斯消元法可以用在电脑中来解决数千条等式及未知数。

高斯消元法可以用来找出一个可逆矩阵的逆矩阵。

用关联矩阵表述网络拓扑结构,并根据厂站拓扑结构和网络拓扑结构等概念简化了电力系统的拓扑结构。

根据广义乘法和广义加法的运算规则,将改进的高斯消元算法应用于电力系统拓扑结构分析中,并引入稀疏、分块处理等技术提高了上述拓扑分析的效率。

采用上述高斯消元算法对山东电网220kV 以上的变电站进行拓扑结构分析,结果表明了运用该高斯消元法进行网络拓扑分析的正确性和有效性。

用列主元素法,选取每列的绝对值最大的元素作为消去对象并作为主元素。

然后换行使之变到主元位子上,在进行消元计算。

设)()(k k b X A ,确定第k 列主元所在位置k i ,在交换k i 行和k 行后,在进行消元,并用MATLAB 软件进行求解。

目录摘要....................................................................................... 错误!未定义书签。

第1章绪论 ......................................................................... 错误!未定义书签。

第2章高斯消元法的算法描述 (2)2.1高斯消元法的原理概述 (2)c231730658" 2.1.1高斯消元法的消元过程 (2)c231730658" 2.1.2高斯消元法的回带过程 (3)c231730658" 2.1.3高斯消元法的复杂度分析 (4)c231730658" 2.2列主高斯消元法原理简介 (5)c231730658" 2.2.1列主高斯消元法的消元过程 (6)c231730658" 2.2.2列主高斯消元法的回带过程 (6)c231730658" 2.2.3列主高斯消元法的算法描述 (6)c231730662"第3章高斯消元法的物理应用 (9)3.1c231730663"电网模型的描述 (9)c231730658" 3.2电网模型的问题分析 (9)c231730658"3.3求解计算 (11)c231730693"参考文献 (13)摘 要用列主元素高斯消去法法,选取每列的绝对值最大的元素作为消去对象并作为主元素。

列主元消去法解方程组实验报告

列主元消去法解方程组实验报告

实验名称:列主元消去法解方程组1 引言我们知道,高斯消去法是一个古老的解线性方程组的方法。

而在用高斯消去法解Ax=b时,其中设A为非奇异矩阵,可能出现的情况,这时必须进行带行交换的高斯消去法。

但在实际计算中即使但其绝对值很小时,用作除数,会导致中间结果矩阵元素数量级严重增长和舍入误差的扩散,使得最后的结果不可靠。

因此,小主元可能导致计算的失败,我们应该避免采用绝对值很小的主元素。

为此,我们在高斯消去法的每一步应该在系数矩阵或消元后的低阶矩阵中选取绝对值最大的元素作为主元素,保持乘数,以便减少计算过程中舍入误差对计算解的影响。

一种方式是完全主元消去法,这种消去法是在每次选主元时,选择为主元素。

这种方法是解低阶稠密矩阵方程组的有效方法,但这种方法在选取主元时要花费一定的计算机时间。

实际计算中我们常采用部分选主元的的消去法。

列主元消去法即在每次选主元时,仅依次按列选取绝对值最大的元素作为主元素,且仅交换两行,再进行消元计算。

2 实验目的和要求运用matlab编写一个.m文件,要求用列主元消去法求解方程组(实现PA=LU):要求输出以下内容:(1)计算解x;(2) L,U;(3)整形数组IP(i)(i=1,2,…,n-1)(记录主行信息)3 算法原理与流程图(1)算法原理设有线性方程组Ax=b,其中设A为非奇异矩阵。

方程组的增广矩阵为第1步(k=1):首先在A的第一列中选取绝对值最大的元素,作为第一步的主元素:,然后交换(A,b)的第1行与第i1行元素,再进行消元计算。

设列主元素消去法已经完成第1步到第k-1步的按列选主元,交换两行,消元计算得到与原方程组等价的方程组第k步计算如下:对于k=1,2,…,n-1(1)按列选主元:即确定ik使(2)如果,则A为非奇异矩阵,停止计算。

(3)如果ik≠k,则交换[A,b]第ik行与第k行元素。

(4)消元计算消元乘数满足:(5)回代求解计算解在常数项b(n)内得到。

高斯列主元法求解线性方程组

高斯列主元法求解线性方程组

c++编写的高斯列主元法求解线性方程组在求解中使用了列主元法在消元时为了直观,将系数矩阵变换为了单位阵,常数项即为解代码可按.h文件和.cpp文件分开,也可直接按下面的顺序粘贴到main.cpp使用代码如下://matrix.h////////////////////////////////////////////////////////////////////////////矩阵类接口,此矩阵未限定为方阵;////////////////////////////////////////////////////////////////////////////#ifndef MATRIX_H_2013_09_10#define MA TRIX_H_2013_09_10class Matrix//定义矩阵类{public:Matrix(int height = 1, int width = 1); //以给定的height和width创建矩阵,矩阵元素未初始化;~Matrix(); //释放构造函数申请的内存;void SetMatrix(double** src_matrix); //复制二维数组的值到矩阵元素;此处参数实为二维数组指针;void Print() const;protected:int height_; //行数;int width_; //列数;double** matrix_; //矩阵元素存储在此二维数组中;};#endif//matrix.cpp#include<iostream>#include"matrix.h"Matrix::Matrix(int height, int width){height_ = height;width_ = width;matrix_ = new double* [height_];for (int i = 0; i < height_; i++){matrix_[i] = new double[width_];}}Matrix::~Matrix(){for (int i = 0; i < height_; i++){delete []matrix_[i];}delete []matrix_;//std::cout << "don't worry, i have free the memory\n"; }//从二维数组复制值;void Matrix::SetMatrix(double** src_matrix){for (int i = 0; i < height_; i++){for (int j = 0; j < width_; j++){matrix_[i][j] = src_matrix[i][j];}}}void Matrix::Print() const{for (int i = 0; i < height_; i++){std::cout << std::endl;for (int j = 0; j < width_; j++){std::cout << " " << matrix_[i][j];}}std::cout << std::endl;}//linear_equations.h////////////////////////////////////////////////////////////////////////////线性方程组类//直接以矩阵作为线性方程组的表示形式,矩阵最右一列即为常数项//因此会有Matrix::height + 1 == Matrix::width//////////////////////////////////////////////////////////////////////////#ifndef LINEAR_EQUATIONS_H_2013_09_10#define LINEAR_EQUATIONS_H_2013_09_10#include"matrix.h"class LinearEquations :public Matrix{public:LinearEquations(int height, int width);~LinearEquations();//列主元法高斯迭代求解;//正确求解返回,否则返回非值;//得到的解放在数组中传递出去bool SolveByGauss(double* xx);};#endif//linear_equations.cpp#include<cmath>//abs()#include"linear_equations.h"LinearEquations::LinearEquations(int height, int width):Matrix(height,width){} LinearEquations::~LinearEquations(){}bool LinearEquations::SolveByGauss(double *xx){for (int h = 0; h < height_; h++) //逐行处理;{//选列主元;double max_value = abs(matrix_[h][h]);int max_row = h;for (int i = h + 1; i < height_; i++){if (abs(matrix_[i][h]) > max_value){max_value = abs(matrix_[i][h]);max_row = i;}}if (max_value == 0) //方程无唯一解;{return 0;}if (max_row > h) //主元不在最上一行,需要交换;{double temp = 0.0;for (int j = h; j < width_; j++){temp = matrix_[h][j];matrix_[h][j] = matrix_[max_row][j];matrix_[max_row][j] = temp;}}//处理主元所在行,每个非元除以主元;for (int j = width_ - 1; j >= h; j--){matrix_[h][j] /= matrix_[h][h];}//消元,对所有行;for (int row = 0; row < height_; row++){if (row != h) //当前行已在前面另行处理;{double factor = matrix_[row][h];for (int col = h; col < width_; col++){matrix_[row][col] -= matrix_[h][col] * factor;}}}}//此处只考虑了一次解一个方程组;//若有相同系数矩阵的多个方程组,可改进;for (int row = 0; row < height_; row++){xx[row] = matrix_[row][width_ - 1];}return 1;}//main.cpp#include<iostream>#include"linear_equations.h"int main(){const int height = 4; //此处控制方程组大小;const int width = 5; //此处控制方程组大小;//temp数组的存在是为了偷懒;//在此输入方程组;double temp[height][width] = {2, 1, 3, 5, 8,2, 3, 3, 6, 11,1, 2, 1, 1, 4,3, 2, 1, 0, 5};double **equations = new double *[height];for (int i = 0; i < height; i++){equations[i] = new double [width];}for (int i = 0; i < height; i++){for (int j = 0; j < width; j++){equations[i][j] = temp[i][j];}}std::cout << "\n此程序为求解线性方程组"<< "\n方程组以矩阵形式存储,最右一列即为常数项"<< "\n求解之后矩阵最后一列即为方程组的解"<< "\n\n";////////////////////////////////////////////////////////////////////////////此部分是程序主体;//前面可看作初始化;double xx[4];LinearEquations my_linear_equations(height,width);my_linear_equations.SetMatrix(equations);std::cout << "\n原方程组为:";my_linear_equations.Print();bool is_solved = my_linear_equations.SolveByGauss(xx);if (is_solved){std::cout << "\n方程组解为:";my_linear_equations.Print();}else{std::cout << std::endl << "there is no unique solution\n";}//////////////////////////////////////////////////////////////////////////for (int i = 0; i < height; i++){delete []equations[i];}delete []equations;return 0;}运行结果图:。

高斯列主元消去法

高斯列主元消去法

如果在高斯顺序消去法消去过程进行到第i 步时,现选取ri a )(n r i ≤≤中绝对值最大的元素,设为第j 行的元素ji a ,把矩阵的第i 行和第j 行互换,这时ii a 变为ji a ,然后将第i+1行至第n 行中的每一行减去第i 行乘以ii ki a a (k 代表行号),依次进行消元。

Gauss 列主元消去法的算法步骤如下:将方程组写成以下的增广矩阵的形式:⎪⎩⎪⎪⎨⎧43212423222114131211............n n n n a a a a a a a a a a a a对k=1,2,3,...,n-1,令∑==nks sk pk a a max ;交换增广矩阵的第k 行与第p 行;对j=k+1,k+2,...,n,计算kk jkkm jm jm a a a a a ⋅-=(m=看,k+1,...,n )kk jkk j j a a b b b ⋅-=算法结束。

三角分解法程序如下:建立相应的M 文件,其函数名为LU,程序如下:function y=LU(A,B);n=length(A);A=[A B];for k=1:n-1;for i=k:n;if (abs(A(i,k))==max(abs(A(k:n,k)))) P(k)=i;temp=A(k,:);A(k,:)=A(i,:);A(i,:)=temp;endendfor j=k+1:n;A(j,k)=A(j,k)/A(k,k);A(j,k+1:n+1)=A(j,k+1:n+1)-A(j,k)*A(k,k+1:n+1);endendP(n)=n;L(1,1)=1;L(2:n,1)=A(2:n,1);L(1,2:n)=0;U(1,1)=A(1,1);U(2:n,1)=0;U(1,2:n)=A(1,2:n);for i=2:n;L(i,1:i-1)=A(i,1:i-1);L(i,i)=1;L(i,i+1:n)=0;U(i,1:i-1)=0;U(i,i:n)=A(i,i:n);endx(n) = A(n,n+1)/U(n,n);for k = n-1:-1:1x(k)=A(k,n+1);for p=n:-1:k+1;x(k) = x(k)-U(k,p)*x(p); endx(k)=x(k)/U(k,k);endxLUPend在程序命令行输入:a=[0.101 2.304 1.5355;-1.347 3.712 4.623;-2.835 1.072 5.643];b=[1.183,2.137,3.035]';LU(a,b)运行结果为:x =3.1160 -1.1960 2.3305 L =1.0000 0 00.4751 1.0000 0-0.0356 0.7313 1.0000 U =-2.8350 1.0720 5.64300 3.2027 1.94180 0 0.3359 P =3 2 3。

列主元高斯消去法和列主元三角分解法解线性方程

列主元高斯消去法和列主元三角分解法解线性方程

计算方法实验报告1课题名称用列主元高斯消去法和列主元三角分解法解线性方程目的和意义高斯消去法是一个古老的求解线性方程组的方法,但由它改进得到的选主元的高斯消去法则是目前计算机上常用的解低阶稠密矩阵方程组的有效方法;用高斯消去法解线性方程组的基本思想时用矩阵行的初等变换将系数矩阵A 约化为具有简单形式的矩阵上三角矩阵、单位矩阵等,而三角形方程组则可以直接回带求解 用高斯消去法解线性方程组b Ax =其中A ∈Rn ×n 的计算量为:乘除法运算步骤为32(1)(1)(21)(1)(1)262233n n n n n n n n n n nMD n ----+=+++=+-,加减运算步骤为(1)(21)(1)(1)(1)(25)6226n n n n n n n n n n AS -----+=++=;相比之下,传统的克莱姆法则则较为繁琐,如求解20阶线性方程组,克莱姆法则大约要19510⨯次乘法,而用高斯消去法只需要3060次乘除法;在高斯消去法运算的过程中,如果出现absAi,i 等于零或过小的情况,则会导致矩阵元素数量级严重增长和舍入误差的扩散,使得最后的计算结果不可靠,所以目前计算机上常用的解低阶稠密矩阵方程的快速有效的方法时列主元高斯消去法,从而使计算结果更加精确; 2、列主元三角分解法高斯消去法的消去过程,实质上是将A 分解为两个三角矩阵的乘积A=LU,并求解Ly=b 的过程;回带过程就是求解上三角方程组Ux=y;所以在实际的运算中,矩阵L 和U 可以直接计算出,而不需要任何中间步骤,从而在计算过程中将高斯消去法的步骤进行了进一步的简略,大大提高了运算速度,这就是三角分解法采用选主元的方式与列主元高斯消去法一样,也是为了避免除数过小,从而保证了计算的精确度计算公式1、 列主元高斯消去法设有线性方程组Ax=b,其中设A 为非奇异矩阵;方程组的增广矩阵为第1步k=1:首先在A 的第一列中选取绝对值最大的元素1l a ,作为第一步的主元素:111211212222112[,]n n n l n nn n a a a a b a a a b a a a b ⎡⎤⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦a b然后交换A,b 的第1行与第l 行元素,再进行消元计算;设列主元素消去法已经完成第1步到第k -1步的按列选主元,交换两行,消元计算得到与原方程组等价的方程组 Akx=bk第k 步计算如下:对于k=1,2,…,n -11按列选主元:即确定t 使 2如果t ≠k,则交换A,b 第t 行与第k 行元素; 3消元计算消元乘数mik 满足:4回代求解2、 列主元三角分解法 对方程组的增广矩阵 经过k -1步分解后,可变成如下形式:111max 0l i i n a a ≤≤=≠(1)(1)(1)(1)(1)1112111(2)(2)(2)(2)22222()(()1)()()()()()1,1()(,)()[,][,] k k k k nk k nk n k k k k k kk kn k k k k n k k k n nn a a a a b a a a b a a b a b b a a a +++⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥→=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦A b A b ()()max 0k k tk ik k i na a ≤≤=≠,(1,,)ik ik ik kka a m i k n a ←=-=+, (,1,,), (1,,)ij ij ik kji i ik k a a m a i j k n b b m b i k n ←+=+⎧⎨←+=+⎩⎪⎪⎩⎪⎪⎨⎧--=-←←∑+=)1,,2,1(,)(1n n i a x a b x a b x ii n i j j ij i i nnn n [,]A A b =11121,11111222,122221,11,1,1,211,11,2121,112,112,1k k k k k k k j n k k j n k k k i i i k n n kk kj kn k ik ij in i nknjk k k j k n n nnk k n a a a b A a u u u u u u y l l l l l l ll l l l u u u u u y u u u u y a a b a a b l a -------------⎡→⎣⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎦第k 步分解,为了避免用绝对值很小的数kku 作除数,引进量1111 (,1,,;1,2,,) ()/ (1,2,,;1,2,,)k kj kj km mj m k ik ik im mk kkm u a l u j k k n k n l a l u u i k k n k n -=-=⎧=-=+=⎪⎪⎨⎪=-=++=⎪⎩∑∑11(,1,,)k i ik im mk m s a l u i k k n -==-=+∑,于是有kk u =ks ;如果 ,则将矩阵的第t 行与第k 行元素互换,将i,j 位置的新元素仍记为jjl 或jja ,然后再做第k 步分解,这时列主元高斯消去法程序流程图max t ik i n s s ≤≤= ()/ 1,2,,)1 (1,2,,),kk k k t iki k ik u s s s l s s i k k n l i k k n ===++≤=++即交换前的,(且列主元高斯消去法Matlab主程序function x=gauss1A,b,c %列主元法高斯消去法解线性方程Ax=bif lengthA~=lengthb %判断输入的方程组是否有误disp'输入方程有误'return;enddisp'原方程为AX=b:' %显示方程组Abdisp'------------------------'n=lengthA;for k=1:n-1 %找列主元p,q=maxabsAk:n,k; %找出第k列中的最大值,其下标为p,qq=q+k-1; %q在Ak:n,k中的行号转换为在A中的行号if absp<cdisp'列元素太小,detA≈0';break;elseif q>ktemp1=Ak,:; %列主元所在行不是当前行,将当前行与列主Ak,:=Aq,:; 元所在行交换包括bAq,:=temp1;temp2=bk,:;bk,:=bq,:;bq,:=temp2;end%消元for i=k+1:nmi,k=Ai,k/Ak,k; %Ak,k将Ai,k消为0所乘系数Ai,k:n=Ai,k:n-mi,kAk,k:n; %第i行消元处理bi=bi-mi,kbk; %b消元处理endenddisp'消元后所得到的上三角阵是'A %显示消元后的系数矩阵bn=bn/An,n; %回代求解for i=n-1:-1:1bi=bi-sumAi,i+1:nbi+1:n/Ai,i;endclear x;disp'AX=b的解x是' x=b;调用函数解题列主元三角分解法程序流程图列主元三角分解法Matlab主程序①自己编的程序:function x=PLUA,b,eps %定义函数列主元三角分解法函数if lengthA~=lengthb %判断输入的方程组是否有误disp'输入方程有误'return;enddisp'原方程为AX=b:' %显示方程组Abdisp'------------------------'n=lengthA;A=A b; %将A与b合并,得到增广矩阵for r=1:nif r==1for i=1:nc d=maxabsA:,1; %选取最大列向量,并做行交换if c<=eps %最大值小于e,主元太小,程序结束break;elseendd=d+1-1;p=A1,:;A1,:=Ad,:;Ad,:=p;A1,i=A1,i;endA1,2:n=A1,2:n;A2:n,1=A2:n,1/A1,1; %求u1,ielseur,r=Ar,r-Ar,1:r-1A1:r-1,r; %按照方程求取ur,iif absur,r<=eps %如果ur,r小于e,则交换行p=Ar,:;Ar,:=Ar+1,:;Ar+1,:=p;elseendfor i=r:nAr,i=Ar,i-Ar,1:r-1A1:r-1,i; %根据公式求解,并把结果存在矩阵A中endfor i=r+1:nAi,r=Ai,r-Ai,1:r-1A1:r-1,r/Ar,r; %根据公式求解,并把结果存在矩阵A中endendendy1=A1,n+1;for i=2:nh=0;for k=1:i-1h=h+Ai,kyk;endyi=Ai,n+1-h; %根据公式求解yiendxn=yn/An,n;for i=n-1:-1:1h=0;for k=i+1:nh=h+Ai,kxk;endxi=yi-h/Ai,i; %根据公式求解xiendAdisp'AX=b的解x是'x=x'; %输出方程的解②可直接得到P,L,U并解出方程解的的程序查阅资料得子函数PLU1,其作用是将矩阵A分解成L乘以U的形式;PLU2为调用PLU1解题的程序,是自己编的Ⅰ.function l,u,p=PLU1A %定义子函数,其功能为列主元三角分解系数矩阵A m,n=sizeA; %判断系数矩阵是否为方阵if m~=nerror'矩阵不是方阵'returnendif detA==0 %判断系数矩阵能否被三角分解error'矩阵不能被三角分解'endu=A;p=eyem;l=eyem; %将系数矩阵三角分解,分别求出P,L,Ufor i=1:mfor j=i:mtj=uj,i;for k=1:i-1tj=tj-uj,kuk,i;endenda=i;b=absti;for j=i+1:mif b<abstjb=abstj;a=j;endendif a~=ifor j=1:mc=ui,j;ui,j=ua,j;ua,j=c;endfor j=1:mc=pi,j;pi,j=pa,j;pa,j=c;endc=ta;ta=ti;ti=c;endui,i=ti;for j=i+1:muj,i=tj/ti;endfor j=i+1:mfor k=1:i-1ui,j=ui,j-ui,kuk,j;endendendl=trilu,-1+eyem;u=triuu,0Ⅱ.function x=PLU2A,b %定义列主元三角分解法的函数l,u,p=PLU1A %调用PLU分解系数矩阵A m=lengthA; %由于A左乘p,故b也要左乘p v=b;for q=1:mbq=sumpq,1:mv1:m,1;endb1=b1 %求解方程Ly=b for i=2:1:mbi=bi-sumli,1:i-1b1:i-1;endbm=bm/um,m; %求解方程Ux=y for i=m-1:-1:1bi=bi-sumui,i+1:mbi+1:m/ui,i;endclear x;disp'AX=b的解x是' x=b;调用函数解题①②编程疑难这是第一次用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 行元互换。

解线性方程组的方法

解线性方程组的方法

解线性方程组的方法线性方程组是数学中常见的一类方程组,它由一组线性方程组成,常用形式为:a₁₁x₁ + a₁₂x₂ + … + a₁ₙxₙ = b₁a₂₁x₁ + a₂₂x₂ + … + a₂ₙxₙ = b₂⋮aₙ₁x₁ + aₙ₂x₂ + … + aₙₙxₙ = bₙ其中,a₁₁, a₁₂, …, a₁ₙ, a₂₁, a₂₂, …, aₙₙ为已知系数,b₁,b₂, …, bₙ为已知常数,x₁, x₂, …, xₙ为未知数。

解线性方程组的方法有多种,下面将详细介绍其中的几种常用方法。

1. 列主元高斯消元法列主元高斯消元法是一种经典的解线性方程组的方法。

它的基本思想是通过消元将线性方程组转化为三角形式,然后逐步回代求解未知数。

具体步骤如下:(1)将系数矩阵按列选择主元,即选取每一列中绝对值最大的元素作为主元;(2)对系数矩阵进行初等行变换,使主元所在列下方的元素全部变为零;(3)重复上述步骤,直到将系数矩阵化为上三角矩阵;(4)从最后一行开始,逐步回代求解未知数。

2. Cramer法则Cramer法则是一种基于行列式的解线性方程组的方法。

它利用克拉默法则,通过求解线性方程组的系数矩阵的行列式和各个未知数对应的代数余子式的乘积,进而得到方程组的解。

具体步骤如下:(1)计算线性方程组的系数矩阵的行列式,若行列式为零,则方程组无解,否则进行下一步;(2)分别将每个未知数对应的列替换为常数向量,并计算替换后的系数矩阵的行列式;(3)将第二步计算得到的行列式除以第一步计算得到的行列式,得到各个未知数的解。

需要注意的是,Cramer法则只适用于系数矩阵为非奇异矩阵的情况。

3. 矩阵求逆法矩阵求逆法是一种利用矩阵求逆运算解线性方程组的方法。

它将线性方程组转化为矩阵形式,通过求解系数矩阵的逆矩阵,然后与常数向量相乘得到未知数向量。

具体步骤如下:(1)将线性方程组的系数矩阵记为A,常数向量记为b,未知数向量记为x;(2)判断A是否可逆,若A可逆,则进行下一步,否则方程组无解;(3)求解系数矩阵的逆矩阵A⁻¹;(4)计算未知数向量x = A⁻¹b。

作业一 高斯消元法和列主元消元法

作业一 高斯消元法和列主元消元法

用高斯消元法和列主元消去法求解线性代数方程组(X*是方程组的精确解)1 高斯消去法1.1 基本思想及计算过程高斯(Gauss )消去法是解线性方程组最常用的方法之一,它的基本思想是通过逐步消元,把方程组化为系数矩阵为三角形矩阵的同解方程组,然后用回代法解此三角形方程组得原方程组的解。

为便于叙述,先以一个三阶线性方程组为例来说明高斯消去法的基本思想。

⎪⎩⎪⎨⎧=++II =++I =++III)(323034)(5253)(6432321321321x x x x x x x x x 把方程(I )乘(23-)后加到方程(II )上去,把方程(I )乘(24-)后加到方程(III )上去,即可消去方程(II )、(III )中的x 1,得同解方程组⎪⎩⎪⎨⎧=+-II -=-I =++III)(20223)(445.0)(64323232321x x x x x x x将方程(II )乘(5.03)后加于方程(III ),得同解方程组: ⎪⎩⎪⎨⎧-=-II -=-I =++III)(42)(445.0)(6432332321x x x x x x由回代公式(3.5)得x 3 = 2,x 2 = 8,x 1 = -13。

下面考察一般形式的线性方程组的解法,为叙述问题方便,将b i 写成a i , n +1,i = 1, 2,…,n 。

⎪⎪⎩⎪⎪⎨⎧=++++=++++=+++++++1,3322111,223232221211,11313212111n n n nn n n n n n n n n n a x a x a x a x a a x a x a x a x a a x a x a x a x a(1-1)如果a 11 ≠ 0,将第一个方程中x 1的系数化为1,得)1(1,1)1(12)1(121+=+++n n n a x a x a x其中)0(11)0()1(1aa aijj=, j = 1, …, n + 1(记ij ij a a =)0(,i = 1, 2, …, n ; j = 1, 2, …, n + 1)从其它n –1个方程中消x 1,使它变成如下形式⎪⎪⎩⎪⎪⎨⎧=++=++=++++++)1(1,)1(2)1(2)1(1,2)1(22)1(22)1(1,1)1(12)1(121n n n nn n n n n n n n a x a x a a x a x a a x a x a x(1-2)其中n i a m a aij i ij ij ,,2)1(1)1( =⋅-=,1,,3,211)1(11+==n j a a m i i由方程(1-1)到(1-2)的过程中,元素11a 起着重要的作用,特别地,把11a 称为主元素。

解线性方程组-高斯消去法列主元

解线性方程组-高斯消去法列主元

的数作主元 arkk1

max
kin
aikk
1
,然后将第 r 行和第 k 行交换(如 r k )。从而在计算 lik 时保证了被除
数的绝对值大于等于除数的绝对值。
实际计算时,当最大的 arkk1 很小时,求解结果同样会严重失真,则求解过程应当停止。设 0是某个 很小的数,当 arkk1 时,过程应该停止,此时已不是算法的问题,而是方程组本身的问题了。
x3 5 1 5 , x2 3 3x3 3 3 35 3 4 , x1 7 x2 x3 2 7 4 5 2 1
此方法就是高斯消去法。
计算流程
记初始方程组 Ax b 为 A0 x b0 。
k 1,即消去第 2 到第 n 个方程中的 x1 ,假定 a110 0 , 目标
a110 a120
是:
A

a201
a202

an01 an02
a1n0
b10

a110 a120
a20n
b20


0
a212

对于j k 1, , n 做 aijk aijk1 lik akkj 1
bik bik1 lik bkk1
直到 k n 1时,消元过程结束, An1 成为上三角矩阵,最后一个方程成为一元一次方程(只含 xn ),
第一步,消元过程: 对增广矩阵进行消元,
7b 11ຫໍສະໝຸດ , 0 x1
x


x2


x3
2
A b 4
1
1 5 1
1 1 1

计算方法实验报告_列主元高斯消去法

计算方法实验报告_列主元高斯消去法
double row_first; //行首元素 //主对角元素单位化 for(int i=0;i<n;i++) {
row_first=A[i][i]; for(int j=0;j<n+1;j++)
计算方法实验报告
{ A[i][j]=A[i][j]/row_first;
} }
for(int k=n-1;k>0;k--) {
for(int i=0;i<N;i++) {
for(int j=0;j<N;j++) {
A_B[i][j]=A[i][j]; } A_B[i][N]=B[i][0]; } return A_B; }
3
//输出矩阵 A 的 row x col 个元素 void Show_Matrix(double **A,int row,int col) {
for(int i=0;i<N;i++)
{
int row=Choose_Colum_Main_Element(N,A_B,i);
if(Main_Element<=e) goto A_0;
Exchange(A_B,N+1,row,i);
Elimination(N,A_B,i);
cout<<"选取列主元后第"<<i+1<<"次消元:"<<endl;
double factor; for(int i=start+1;i<n;i++) {
factor=A[i][start]/A[start][start]; for(int j=start;j<n+1;j++) {

解线性方程组的列主元素高斯消去法和lu分解法

解线性方程组的列主元素高斯消去法和lu分解法

数值试验报告分析一、实验名称:解线性方程组的列主元素高斯消去法和LU 分解法二、实验目的及要求:通过数值实验,从中体会解线性方程组选主元的必要性和LU 分解法的优点,以及方程组系数矩阵和右端向量的微小变化对解向量的影响。

三、算法描述:本次试验采用的是高斯列主元消去法和LU 分解法求解线性方程组的解。

其中,高斯消去法的基本思想是避免接近于零的数作分母;能进行到底的条件:当A 可逆时,列主元Gauss(高斯)消去法一定能进行到底。

优点:具有很好的数值稳定性;具有与顺序Gauss 消去法相同的计算量。

列主元Gauss(高斯)消去法的精度显著高于顺序Gauss(高斯)消去法。

注意:省去换列的步骤,每次仅选一列中最大的元。

矩阵的三角分解法是A=LU,L 是下三角阵,U 是上三角阵,Doolittle 分解:L 是单位下三角阵,U 是上三角阵;Crout 分解:L 是下三角阵,U 是单位上三角阵。

矩阵三角分解的条件 是矩阵A 有唯一的Doolittle 分解的充要条件是A 的前n-1顺序主子式非零;矩阵A 有唯一的Crout 分解的充要条件是A 的前n-1顺序主子式非零。

三角分解的实现是通过(1)Doolittle 分解的实现; (2)Doolittle 分解的缺点:条件苛刻,且不具有数值稳定性。

(3)用Doolittle 分解求解方程组: AX=b LUX=b LY=bA=LU UX=Y ;四、实验内容:解下列两个线性方程组(1) ⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎭⎫ ⎝⎛--11134.981.4987.023.116.427.199.103.601.3321x x x (2) ⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎪⎪⎭⎫ ⎝⎛----15900001.582012151526099999.23107104321x x x x a 、用你熟悉的算法语言编写程序用列主元高斯消去法和LU 分解求解上述两个方程组,输出Ax=b 中矩阵A 及向量b, A=LU 分解的L 及U ,detA 及解向量x.b 、将方程组(1)中系数3.01改为3.00,0.987改为0.990,用列主元高斯消去法求解变换后的方程组,输出列主元行交换次序,解向量x及detA,并与(1)中结果比较。

线性方程组的解法

线性方程组的解法

线性方程组的解法1. 背景介绍线性方程组是数学中常见的一类方程组,由一系列线性方程组成。

求解线性方程组的目标是找到满足所有方程的解。

线性方程组的解法有多种,本文将介绍其中常用的几种方法。

2. 列主元消元法列主元消元法是解线性方程组的一种常用方法。

该方法基于矩阵的行变换和列变换,通过消元得到一种简化的矩阵形式,从而求解方程组的解。

使用列主元消元法解线性方程组的步骤如下:- 将系数矩阵按列进行排序,选择绝对值最大的列作为主元列;- 交换主元所在列和第一列,同时交换方程组中的等式;- 利用第一个方程进行消元,将主元所在列下方的元素都变为0;- 重复以上步骤,直到所有主元都变成1。

列主元消元法的优点是解法简单直观,但在实际应用中可能会遇到主元为0或接近0的情况,会导致计算结果不够精确。

3. 高斯-约旦消元法高斯-约旦消元法是另一种常见的解线性方程组的方法。

该方法通过矩阵的初等行变换,将方程组化为其简化形式,从而求解解的值。

使用高斯-约旦消元法解线性方程组的步骤如下:- 将系数矩阵与等式向量合并,形成增广矩阵;- 从第一行开始,找到第一个非零元素,将其变为1,同时该列的其他元素变为0;- 重复以上步骤,直到所有非零元素都变为1且其他元素都为0。

高斯-约旦消元法的优点是消元过程更为精确,计算结果更准确。

但该方法可能会遇到矩阵行或列的交换问题,需要额外的步骤进行处理。

4. 矩阵的逆和逆矩阵法对于特定类型的线性方程组,可以使用矩阵的逆和逆矩阵法来求解。

逆矩阵是方阵的一种特殊矩阵,具有一些特殊的性质,可以用于求解线性方程组。

利用矩阵的逆和逆矩阵法求解线性方程组的步骤如下:- 对系数矩阵进行求逆操作,得到逆矩阵;- 将逆矩阵与等式向量相乘,得到解向量。

矩阵的逆和逆矩阵法在理论上是一种高效且准确的解法,但实际应用中需要先判断矩阵是否可逆,且计算逆矩阵的过程可能较为复杂。

5. 小结本文介绍了线性方程组的三种常用解法:列主元消元法、高斯-约旦消元法和矩阵的逆和逆矩阵法。

高斯列主元消去法

高斯列主元消去法

问题提出:采用高斯列主元消去法解线性方程组。

算法(公式)推导:高斯顺序消去法有一个最大的缺点就是一旦对角元素为0,就进行不下去了,为了解决这个问题就有了高斯主元消去法。

如果在高斯顺序消去法消去过程进行到第i 步时,先选取a ri ()n r i ≤≤中(即第i 列)绝对值最大的元素,设为第j 行的元素aji ,然后将第i+1行至第n 行中的每一行减去第i 行乘以ii kj a a (k 代表行号),依次进行消元,这样得到的算法叫高斯按列主元消去法。

高斯按列主元消去法的算法步骤介绍如下:1. 将方程组写成以下的增广矩阵的形式: 432144434241343332312423222114131211b b b b a a a a a a a a a a a a a a a a 2. 对k=1,2,3,…..,n-1,令∑==nk s sk pk a a max ,交换增广矩阵的第k 行与第p 行;对j=k+1,K+2,……..,n,计算*km jkjm jm kk a a a a a =-(m=k,k+1,....n)kk jk k j j a a b b b *-=算法结束。

3. 在MATLABE 中编程实现的高斯按列主元消去法函数为:GaussXQLineMain功能:高斯按列主元消去法求线性方程组Ax=b 的解调用格式:[x,XA]=GaussXQLineMain(A,b)其中,A :线性方程组的系数矩阵;B:线性方程组中的常数向量;x:线性方程组的解:XA:消元后的系数矩阵(可选的输出参数)。

高斯列主元消去法用MATLAB实现如下所示:4.其中用到上三角矩阵求解函数:在MATLABE中编程实现的上三角系数矩阵求解函数为:SolveUPTriangle 功能:求上三角系数矩阵的线性方程组Ax=b的解调用格式:x=SolveUpTriangel(A,b)其中,A :线性方程组的系数矩阵;b :线性方程组中的常数向量; X :线性方程组的解;上三角系数矩阵求解函数用MATLAB 实现如下所示:高斯按列主元消去法解线性方程组应用实例:用高斯按列主元消去法求解下列线性方程组的解。

高斯消元法(完整)

高斯消元法(完整)

高斯消元法(完整)高斯消元法解线性方程组在工程技术与工程管理中有许多问题经常可以归结为线性方程组类型得数学模型,这些模型中方程与未知量个数常常有多个,而且方程个数与未知量个数也不一定相同.那么这样得线性方程组就是否有解呢?如果有解,解就是否唯一?若解不唯一,解得结构如何呢?这就就是下面要讨论得问题.一、线性方程组设含有n个未知量、有m个方程式组成得方程组(3、1)其中系数,常数都就是已知数,就是未知量(也称为未知数)。

当右端常数项,,…,不全为0时,称方程组(3、1)为非齐次线性方程组;当== …== 0时,即(3、2)称为齐次线性方程组.由n个数, , …, 组成得一个有序数组(,,…,),如果将它们依次代入方程组(3、1)中得,,…, 后,(3、1)中得每个方程都变成恒等式,则称这个有序数组(,,…,)为方程组(3、1)得一个解。

显然由=0, =0, …, =0组成得有序数组(0,0,…,0)就是齐次线性方程组(3、2)得一个解,称之为齐次线性方程组(3、2)得零解,而当齐次线性方程组得未知量取值不全为零时,称之为非零解.(利用矩阵来讨论线性方程组得解得情况或求线性方程组得解就是很方便得。

因此,我们先给出线性方程组得矩阵表示形式。

) 非齐次线性方程组(3、1)得矩阵表示形式为:AX =B其中A=,X=,B =称A为方程组(3、1)得系数矩阵,X为未知矩阵,B为常数矩阵。

将系数矩阵A与常数矩阵B放在一起构成得矩阵=称为方程组(3、1)得增广矩阵。

齐次线性方程组(3、2)得矩阵表示形式为:AX=O二、高斯消元法(下面介绍利用矩阵求解方程组得方法,那么矩阵初等行变换会不会改变方程组得解呢?我们先瞧一个定理。

)定理3、1若用初等行变换将增广矩阵化为,则AX= B与CX =D 就是同解方程组。

证由定理3、1可知,存在初等矩阵,,…, ,使…=记…= P,则P可逆,即存在。

设为方程组A X=B得解,即A= B在上式两边左乘P,得P A = PB即C=D说明也就是方程组C X=D得解。

高斯列主元消元法解线性方程组

高斯列主元消元法解线性方程组

1. 高斯列主元法解线性方程组1.1算法说明首先列出线性方程组的增广矩阵,对增广矩阵进行初等行变换。

主要步骤有:求主元、换行、消元,具体操作为:对元素ii a ,在第i 列中,第i 行及以下的元素选取绝对值最大的元素,将该元素所在的行与第i 行交换,然后采用高斯消元法将新得到的ii a 消去第i 行以下的元素。

一次进行直到nn a 。

从而得到上三角矩阵。

再对得到的上三角矩阵进行回代操作,即可以得到方程组的解。

1.2高斯列主元算法流程图图1-1 高斯列主元法解线性方程组算法流程图1.3高斯列主元算法程序调试以下列线性方程组为例进行算法调试,调试界面如下所示:x 1+2x 2+x 3+4x 4=132x 1+0x 2+4x 3+3x 4=284x 1+2x 2+2x 3+x 4=20-3x 1+x 2+3x 3+2x 4=6图1-2 1-3 1-4高斯列主元法解线性方程组程序调试界面1.4高斯列主元算法程序代码#include<iostream>#include<iomanip>#include<cmath>#define m 10using namespace std;double A[m][m],b[m],Aug[m][m+1];void equ(double A[m][m],double b[m],double x[m],int n){int i,i1,j,k;double Aug[m][m+1],maxele,Temp,l,s;for (i=0;i<n;i++) //构建增广矩阵Aug {for (j=0;j<n;j++)Aug[i][j]=A[i][j];Aug[i][n]=b[i];}for (i=0;i<n;i++) //输出增广矩阵Aug {for (j=0;j<n;j++)cout<<Aug[i][j]<<" ";cout<<Aug[i][n]<<endl;}for (i1=0;i1<n-1;i1++) //求主元{maxele=fabs(Aug[i1][i1]);k=i1;for(i=i1;i<n;i++)if (maxele<fabs(Aug[i][i1])){maxele=fabs(Aug[i][i1]);k=i;cout<<"i1="<<i1<<" "<<"k="<<k<<" "<<"maxele="<<maxele<<" "<<Aug[i][i1]<<" "<<endl;}for (j=i1;j<n+1;j++) //换行{Temp=Aug[i1][j];Aug[i1][j]=Aug[k][j];Aug[k][j]=Temp;}for (i=0;i<n;i++) //换行后输出增广矩阵Aug {for (j=0;j<n;j++)cout<<Aug[i][j]<<" ";cout<<Aug[i][n]<<endl;}for (k=i1+1;k<n;k++){l=-Aug[k][i1]/Aug[i1][i1];for (j=i1;j<n+1;j++)Aug[k][j]=Aug[k][j]+l*Aug[i1][j];}cout<<"每次消元结束输出增广矩阵Aug"<<endl;for (i=0;i<n;i++) //每次消元结束输出增广矩阵Aug{for (j=0;j<n;j++)cout<<Aug[i][j]<<" ";cout<<Aug[i][n]<<endl;}}x[n-1]=Aug[n-1][n]/Aug[n-1][n-1];//x[n-2]=(Aug[n-2][n]-Aug[n-2][n-1]*x[n-1])/Aug[n-2][n-2];for (i=n-2;i>=0;i=i-1){s=0;for (j=i+1;j<n;j++)s=s+Aug[i][j]*x[j];cout<<"s="<<s<<endl;x[i]=(Aug[i][n]-s)/Aug[i][i];cout<<"x["<<i<<"]="<<x[i]<<endl;}}int main(){void equ(double A[m][m],double b[m],double x[m],int n);double A[m][m],b[m],x[m];int i,j,n;cout<<"输入未知量的个数"<<endl;cin>>n;if (n>m){ cout<<"问题规模太大,需更改原程序中符号常量m"<<endl;return 0 ;}for (i=0;i<n;i++){cout<<"请输入A的第"<<i+1<<"行:";for(j=0;j<n;j++)cin>>A[i][j];cout<<"请输入b的第"<<i+1<<"行:";cin>>b[i];}equ( A,b, x,n);for (i=0;i<n;i++)cout<<x[i]<<" ";cout<<endl;return(0);}。

4-线性方程组的解法

4-线性方程组的解法

17
定理 1 矩阵 A 可以三角分解的条件如下:
1. 若矩阵 A 的所有顺序主子式不等于零; 2. 若矩阵 A 对称正定; 3. 若矩阵 A 严格对角占优,即:
akk akj , k 1, 2, n 。
j k
18
2 2 1 A 4 5 4 例 3 已知矩阵 ,检验 A 是否满足三角分解的条件, 2 4 3
n n n n a11 a1 a b k 1n 1 n n n akk akn bk n n ann bn
7
消元公式:
(0) aij aij , bi(0) bi , ( i , j 1, 2, ..., n) For k 1, 2, ..., n 1 (k ) ( k 1) ( k 1) aij aij lik akj b( k ) b( k 1) l b( k 1) i i ik k ( k 1) ( k 1) akk ; i , j k 1, ..., n lik aik
利用增广矩阵的初等行变换法表示为:
1 1 2 2 1 1 2 2 1 1 2 2 2 1 1 2 1 3 2 1 3 2 A b 4 1 2 1 3 6 7 3 1
k 1
1
ai1 lik uk1 li1u11 ,
k 1
1
即: li1 ai1 u11 i 2, 3,, n .
这是 U 的第一行和 L 的第一列。
22
设: U 的前 m 1 行和 L 前 m 1 列均已算出,那么:
amj lmk ukj lmk ukj lmmumj ,

数值分析计算实习题列主元高斯消去法解线性方程组

数值分析计算实习题列主元高斯消去法解线性方程组

数值分析计算实习题第5章解线性方程组的直接方法列主元高斯消去法解线性方程组。

书上的计算实习题1、2、3都要求用列主元高斯消去法解线性方程组,所以考虑写一个普适的程序来实现。

对于线性方程组Ax=b,程序允许用户从文件读入矩阵数据或直接在屏幕输入数据。

文件输入格式要求:(1)第一行为一个整数n (2<=n<=100),表示矩阵阶数。

(2)第2〜n+1行为矩阵A各行列的值。

(3 )第n+2〜n+n+2行为矩阵b各行的值。

屏幕输入:按提示输入各个数据。

输出:A、b、det(A)、列主元高斯消去计算过程、解向量X。

【算法说明】设有线性方程组Ax=b,其中设A为非奇异矩阵。

方程组的增广矩阵为[a,b] =a n…第1步(k=l):首先在A的第一列中选取绝对值最大的元素%,作为第一步的主元素:如凜产如工0然后交换(A, b)的第1行与第1行元素,再进行消元计算。

设列主元素消去法已经完成第1步到第k・l步的按列选主元,交换两行,消元计算得到与原方程组等价的方程组A(k)x=b(k)用姐…哦盘…於?MB•■•■■[A,b]T[A(?b (*)] =■…盅•a"〉■唱”■■■••••...卅•第k步计算如下:对于k=l, 2, n-1 |時卜maxaf"(1)按列选主元:即确定t使(2)如果tHk,则交换[A, b]第t行与第k行元素。

(3)消元计算a ik J叫=-bgk + X・・Ji)a kk% <-%+叫ciy (i,j = k + l,…川)»〜乞+叫几 (j = k + l,…屮)消元乘数mik满足:M =吃 + 1,产•,)(4)回代求解(b厂工陶形)兀< ----- -- ---- ,('=〃_1屮_2,・・、1)【程序】/*【普适列主元消去法解线性方程组】对于线性方程组:Ax=b输入:[选择屏幕直接输入]1・A的行阶数11(1 <=n <= 100)2.A的值3.b的值[选择读取文件]文件名(和主程序同级文件夹下)输出:1.A2.b3.det(A)4.解向量x#include <stdio.h>#include <stdlib.h>#include <math.h>double A[1O5][1O5],A_B[1O5][1O 习、b[105],x[105]; double detA;int njnaik = 1;〃读入数据void input(){int ij;char ch[20],name[100];FILE *f;printfC^—-\ii是否从文件读取数据(Y/N):”); scaufp%s:&ch);if(ch[O] = Y' || ch[0] = V){prmtfC'请输入文件名(包扌舌扩展名):”);scanfi(H%s,\name);f= fbpen(name;,i n);fscaiif(f/%d*\&n);fbr(i = 0;i < n;i ++)for(j = 0j<nj ++)fbr(i = 0;i < n;i ++)住canfg'%lf;&b[i]);pnntfC请输入A的阶数:”);scanf(n%d %cT,&n);prmtfC请输入A的值:”);fbr(i = 0;i < n;i ++)for(j = Oj<nj ++) scaiif(M%lf\&A[i][j]);printf("请输入b的值:”);fbr(i = 0;i < n;i ++)}}〃计算行列式的值double det(double s[105][105],int m){int zj,k;double b[105][105],total = 0,r; /*b[N][N]ffl于存放,在矩阵s[N][N]中元素s[0]的余子式*/fbr(z = 0;z < m;z-H-){for(j = 0j<m-lj++)for(k = 0;k < m-l;k ++)if(k >= z)b[j][k] = s[j+l][k+l];elsebQ][k] = s[j+l][k];if(z % 2==0)r = s[0][z] * det(b4ii - 1); /*递归调用elser = (-1) * s[O]JXl * det(bjn - 1);total = total + r;}}else if(m = 2)total = s[0][0] * s[l][l] - s[0][l] * s[l][0];else if(m = 1)total = s[0][0];return total;}//输出A和b和det(A) void output_lQ{int ij;pnntffA = \ii n);for(i = 0;i < n;i ++){for。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for c=1:n;
A(a,c)=1/(a+c-1);
end
end
b=[1:n]';
x=gauss(A,b);
fprintf('%12.8f ',x)
实验结果为:
-216.000000047350.00000120-57120.00000827
166320.00002178 -201600.00002425 85932.00000962
3、当n为50时,在command窗口输入如下代码:
format long
n=50;
for a=1:n;
for c=1:n;
A(a,c)=1/(a+c-1);
end
end
b=[1:n]';
x=gauss(A,b);
fprintf('%12.8f ',x)
实验结果为:
23964.74834020-4122991.37806186176597502.11690632-3260288682.1972771031898227709.80876200-181566275672.69705000 619956768219.91504000-1230092760464.934800001193508577123.06670000 -71714652666.11485300-587044042244.59863000-454093769462.97290000 1744941129911.71780000-2715153157131.341300002706193814657.00730000 758555481068.28345000-2729174782832.09330000-650678553386.91565000 770544482197.08948000661071297466.389400003114329102228.31640000 -2419453655729.64110000-2498342518894.922900001991167370388.64180000 806469536595.88586000-3357159715176.254400003434745294165.19480000 -1115456797533.65920000835226816241.179930001614362560020.15380000 -2300534244207.34180000781205861296.42358000-3724002810480.48780000 -101978267755.295900003815588397071.54350000-269576755745.41956000 -2354847317920.947800005144417865217.228500001355869718979.75980000 1213622862842.97950000-11349162850658.63300000367430197567.42474000 2362009479539.30520000712955508308.938350005794833430082.82320000 -2649289143449.391600002040834706833.95900000-2941986228491.25980000 -2402163300368.774400002234821162570.22750000
4、当n为100时,在command窗口输入如下代码:
%找列主元所在子矩阵的行r
%列主元所在大矩阵的行
%矩阵为0,报错
%把增广矩阵消元成为上三角
%解上三角方程组
%求得x值
四、实验数据及结果:
1、当n为4时,在command窗口输入如下代码:
format long
n=4;
for a=1:n;
for c=1:n;
A(a,c)=1/(a+c-1);
end
end
实验一、高斯列主元消元法解方程组
题目:
求解: , , ,n=4;6;50;100;……
求解精度为 ,并验证: 及 / 随着n的逐渐增大,你会发现什么?
一、实验目的:
1、学习使用matlab编写数值计算程序。
2、了解高斯列主元消元法解方程组原理和编程方法。
3、根据高斯列主元消元法解方程组原理编写matlab程序,并运行得出结果。
x(n) = b(n)/A(n,n);
for k = n-1:-1:1
x(k)=b(k);
for p=n:-1:k+1
x(k) = x(k)-A(k,p)*x(p);
end
x(k)=x(k)/A(k,k);
end
%use the function。
%求矩阵A的大小。
% 初始化x为0。
% 增广矩阵
%for循环
b=[1:n]';
x=gauss(A,b);
fprintf('%12.8f ',x)
实验结果为:
-64.00000000 900.00000000 -2520.00000000 1820.00000000
2、当n为6时,在command窗口输入如下代码:
format long
n=6;
for a=1:n;
二、实验原理:
如此至多经过n-1步,就得到与之同解的上三角形方程组的增广矩阵,再用回代过程即可得方程组的解.
三、实验内容与步骤:
1、实验内容:依照实验原理编写高斯列主元消元法解方程组的程序。
2、实验步骤:首先,在电脑上安装matlab,然后,启动matlab,新建一个gauss.m文件。
实验程序如下:
Aug(k,:)=Aug(r,:);
Aug(r,:)=temp;
end
if Aug(k,k)==0, error('对角元出现0'),
end
for p = k+1:n
Aug(p,:)=Aug(p,:)-Aug(k,:)*
Aug(p,k)/Aug(k,k);
end
end
A = Aug(:,1:n); b = Aug(:,n+1);
程序代码
程序代码说明
function x = gauss(A,b)
[n,n] = size(A);
x = zeros(n,1);
Aug = [A,b];
for k = 1:n-1
[piv,r]=max(abs(Aug(k:n,k)));
r = r + k - 1;
if r>k
temp=Aug(k,:);
相关文档
最新文档