第四章 高斯消元法与选主元
- 格式:pdf
- 大小:420.44 KB
- 文档页数:37
高斯消元法解线性方程组在工程技术和工程管理中有许多问题经常可以归结为线性方程组类型的数学模型,这些模型中方程和未知量个数常常有多个,而且方程个数与未知量个数也不一定相同。
那么这样的线性方程组是否有解呢?如果有解,解是否唯一?若解不唯一,解的结构如何呢?这就是下面要讨论的问题。
一、线性方程组设含有n 个未知量、有m 个方程式组成的方程组a x a x a xb a x a x a x b a x a x a x b n n n n m m mn n m11112211211222221122+++=+++=+++=⎧⎨⎪⎪⎩⎪⎪ (3.1) 其中系数a ij ,常数b j 都是已知数,x i 是未知量(也称为未知数)。
当右端常数项b 1,b 2, …, b m 不全为0时,称方程组(3.1)为非齐次线性方程组;当b 1=b 2= … =b m = 0时,即a x a x a x a x a x a x a x a x a x n n n n m m mn n 111122121122221122000+++=+++=+++=⎧⎨⎪⎪⎩⎪⎪ (3.2) 称为齐次线性方程组。
由n 个数k 1, k 2, …, k n 组成的一个有序数组(k 1, k 2, …, k n ),如果将它们依次代入方程组(3.1)中的x 1, x 2, …, x n 后,(3.1)中的每个方程都变成恒等式,则称这个有序数组(k 1, k 2, …, k n )为方程组(3.1)的一个解。
显然由x 1=0, x 2=0, …, x n =0组成的有序数组(0, 0, …, 0)是齐次线性方程组(3.2)的一个解,称之为齐次线性方程组(3.2)的零解,而当齐次线性方程组的未知量取值不全为零时,称之为非零解。
(利用矩阵来讨论线性方程组的解的情况或求线性方程组的解是很方便的。
因此,我们先给出线性方程组的矩阵表示形式。
)非齐次线性方程组(3.1)的矩阵表示形式为:AX = B其中A = ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡mn m m n n a a a a a a a a a 212222111211,X = ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡n x x x 21,B = ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡n b b b 21 称A 为方程组(3.1)的系数矩阵,X 为未知矩阵,B 为常数矩阵。
全选主元高斯消去法求解实系数线性方程组实验3 全选主元高斯消去法求解实系数线性方程组全选主元的基本思想和基本原理在教材的第40页,全选主元高斯消去法求解线性代数方程组的步骤在教材的第41页。
一、算法描述参数说明:n整型变量。
方程组的阶数。
a双精度实型二维数组,体积为n*n。
存放方程组的系数矩阵,返回时将被破坏。
b双精度实型一维数组,长度为n。
存放方程组右端的常数向量;返回方程组的解向量。
本函数返回整型标志值。
若返回的标志值为0,则表示原方程组的系数矩阵奇异,输出信息“fail”;若返回的标志值不为0,则表示正常返回。
#include”stdlib.h”#include “math.h”#include “stdio.h”int rgauss(n,a,b)int n;double a[],b[];{ int *js,l,k,I,j,is,p,q;double d,t;js=malloc(n*sizeof(int)); /*开辟用于记忆列交换信息的动态空间*/l=1; /*置非奇异标志*/for (k=0;k<=n-2;k++){d=0.0;for (i=k;i<=n-1;i++) /*全选主元*/for (j=k;j<=n-1;j++){t=fabs(a[i*n+j]);if (t>0) {d=t;js[k]=j;is=i;} /*记忆行、列交换信息*/ }if (d+1.0==1.0)l=0; /*置奇异标志*/else{if (js[k]!=k)for (i=0;i<=n-1;i++) /*列交换*/{p=i*n+k;q=i*n+js[k];t=a[p];a[p]=a[q];a[q]=t;}if (is!=k){ for (j=k;j<=n-1;j++) /*行交换*/{ p=k*n+j;q=is*n+j;t=a[p];a[p]=a[q];a[q]=t;}t=b[k];b[k]=b[is];b[is]=t;}}if (l==0) /*奇异返回*/, free(js); printf(…fail\n);return(0);}d=a[k*n+k];for (j=k+1;j<=n-1;j++) /*归一化*/{ p=k*n+j; a[p]=a[p]/d;}b[k]=b[k]/d;for (i=k+1;i<=n-1;i++) /*消元*/{ for (j=k+1;j<=n-1;j++){ p=i*n+j;a[p]=a[p]-a[i*n+k]*a[k*n+j];}b[i]=b[i]-a[i*n+k]*b[k];}}d=a[(n-1)*n+n-1];if (fabs(d)+1.0==1.0) /*奇异返回*/, free(js); prin tf(“fail\n”);return(0);}b[n-1]=b[n-1]/d; /*计算解向量的最后一个分量*/ for (i=n-2;i>=0; i--) /*回代*/{ t=0.0;for (j=i+1; j<=n-1; j++)t=t+a[i*n+j]*b[j];b[i]=b[i]-t;}js[n-1]=n-1;for (k=n-1;k>=0; k--) /*恢复解向量*/if (js[k]!=k){ t=b[k]; b[k]=b[js][k]}; b[js[k]]=t;} /*解向量行交换*/ free(js); /*释放动态空间*/return(l); /*返回正常标志*/}二、用高斯消去法求解下列方程组:0.2388x0+0.2471x1+0.2568x2+1.2671x3=1.84710.1968x0+0.2071x1+1.2168x2+0.2271x3=1.74710.1581x0+1.1675x1+0.1768x2+0.1871x3=1.64711.1161x0+0.1254x1+0.1397x2+0.1490x3=1.5471主函数程序如下:/*rgaus0.c*/#include “stdio.h”#include “rgauss.c”main(){ int I;static double a[4][4]={{0.2388,0.2471,0.2568,1.2671},{0.1968,0.2071,1.2168,0.2271},{0.1581,1.1675,0.1768,0.1871},{1.1161,0.1254,0.1397,0.1490}};static double b[4]={1.8471,1.7471,1.6471,1.5471}; if (rgauss(4,a,b)!=0)for (i=0; i<=3; i++)printf(“x(%d)=%e\n”,i,b*i+);}程序运行结果为x(0)=1.04058e+00x(1)=9.87051e-01x(2)=9.35040e-01x(3)=8.81282e-01。
高斯消元法解线性方程组 在工程技术和工程管理中有许多问题经常可以归结为线性方程组类型的数学模型,这些模型中方程和未知量个数常常有多个,而且方程个数与未知量个数也不一定相同。
那么这样的线性方程组是否有解呢?如果有解,解是否唯一?若解不唯一,解的结构如何呢?这就是下面要讨论的问题。
一、线性方程组 设含有n 个未知量、有m 个方程式组成的方程组(3.1)a x a x a x b a x a x a x b a x a x a x b n n n n m m mn n m11112211211222221122+++=+++=+++=⎧⎨⎪⎪⎩⎪⎪ 其中系数,常数都是已知数,是未知量(也称为未知数)。
当右端常数项a ij b j x i , , …, 不全为0时,称方程组(3.1)为非齐次线性方程组;当== … =b 1b 2b m b 1b 2= 0时,即b m (3.2)a x a x a x a x a x a x a x a x a x n n n n m m mn n 111122121122221122000+++=+++=+++=⎧⎨⎪⎪⎩⎪⎪ 称为齐次线性方程组。
由n 个数, , …, 组成的一个有序数组(, , …, ),如果将它们k 1k 2k n k 1k 2k n 依次代入方程组(3.1)中的, , …, 后,(3.1)中的每个方程都变成恒等式,x 1x 2x n 则称这个有序数组(, , …, )为方程组(3.1)的一个解。
显然由=0, k 1k 2k n x 1=0, …, =0组成的有序数组(0, 0, …, 0)是齐次线性方程组(3.2)的一个解,x 2x n 称之为齐次线性方程组(3.2)的零解,而当齐次线性方程组的未知量取值不全为零时,称之为非零解。
(利用矩阵来讨论线性方程组的解的情况或求线性方程组的解是很方便的。
因此,我们先给出线性方程组的矩阵表示形式。
)非齐次线性方程组(3.1)的矩阵表示形式为:AX = B其中A = ,X = ,B = ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡mn m m n n a a a a a a a a a 212222111211⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡n x x x 21⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡n b b b 21称A 为方程组(3.1)的系数矩阵,X 为未知矩阵,B 为常数矩阵。
高斯消元法(完整)高斯消元法解线性方程组在工程技术和工程管理中有许多问题经常可以归结为线性方程组类型的数学模型,这些模型中方程和未知量个数常常有多个,而且方程个数与未知量个数也不一定相同。
那么这样的线性方程组是否有解呢?如果有解,解是否唯一?若解不唯一,解的结构如何呢?这就是下面要讨论的问题。
一、线性方程组设含有n 个未知量、有m 个方程式组成的方程组a x a x a xb a x a x a x b a x a x a x b n n n n m m mn n m11112211211222221122+++=+++=+++=⎧⎨⎪⎪⎩⎪⎪ (3.1) 其中系数a ij ,常数b j 都是已知数,x i 是未知量(也称为未知数)。
当右端常数项b 1,b 2, …, b m 不全为0时,称方程组(3.1)为非齐次线性方程组;当b 1=b 2= … =b m = 0时,即a x a x a x a x a x a x a x a x a x n n n n m m mn n 111122121122221122000+++=+++=+++=⎧⎨⎪⎪⎩⎪⎪ (3.2) 称为齐次线性方程组。
由n 个数k 1, k 2, …, k n 组成的一个有序数组(k 1, k 2, …, k n ),如果将它们依次代入方程组(3.1)中的x 1, x 2, …, x n 后,(3.1)中的每个方程都变成恒等式,则称这个有序数组(k 1, k 2, …, k n )为方程组(3.1)的一个解。
显然由x 1=0,x 2=0, …, x n =0组成的有序数组(0, 0, …, 0)是齐次线性方程组(3.2)的一个解,称之为齐次线性方程组(3.2)的零解,而当齐次线性方程组的未知量取值不全为零时,称之为非零解。
(利用矩阵来讨论线性方程组的解的情况或求线性方程组的解是很方便的。
因此,我们先给出线性方程组的矩阵表示形式。
数值分析-牛顿迭代法实验报告一、实验内容和要求用列主元高斯消去法解线性方程组Ax=b方程1:=;方程2:=;二、算法说明设Ax=b。
本算法用A的具有行交换的列祖元素消去法,校园结果冲掉A,乘数冲掉,计算解x冲掉常数项b,行列式存放在det中。
1.det←12.对于k=1,2,…,n-1(1)按列选主元=,(2)如果,=0,则计算停止(det(A)=0)(3)如果,=k,则转(4)(j=k,k+1,……,n)换行:,←-det(4)消元计算对于i=k+1,……,ni.←/ii.对于i=k+1,……,n←*iii.←-(5)det←*det3.如果,则计算停止(det(A)=0)4.回带求解(1)/(2)对于i=n-1,…,2,1←()/5.det←*det三、源程序#include <stdio.h>#include<conio.h>#include <math.h>#define max_dimension 20 //定义最大阶数为20 int n;static float a[max_dimension][max_dimension]; static float b[max_dimension];static float x[max_dimension];void main() {int I,j,d,row;float temp;float known_items;float l[max_dimension][max_dimension];printf("请输入方程的阶数:"); //输入矩阵阶数scanf("%d",&n);printf("\n");for (i=0; i<n; i++){printf("请输入第%d 的系数:",i+1); //矩阵输入for (j=0; j<n; j++){scanf("%f",&a[i][j]);}printf("\n");}printf("请输入常数项: "); //常数输入for (i=0; i<n; i++)scanf("%f",&b[i]);for (i=0; i<n; i++) //计算增广矩阵{for (j=0; j<n; j++);} for (d=0; d<n-1; d++){ row=d;for (i=d+1; i<n; i++) //查找最大元素所在行{if (fabs(a[i][d])>fabs(a[row][d]))row=i;}if (row!=d){for (j=d; j<n; j++){temp=a[row][j];a[row][j]=a[d][j];a[d][j]=temp;}temp=b[row];b[row]=b[d];b[d]=temp;}for (i=d+1; i<n; i++){l[i][d]=-a[i][d]/a[d][d];for (j=d; j<n; j++){a[i][j]=a[i][j]+a[d][j]*l[i][d];}b[i]=b[i]+b[d]*l[i][d];}}for (i=0; i<n; i++) //计算上三角矩阵{for (j=0; j<n; j++);}printf("\n");for (i=n-1; i>-1; i--){known_items=0;for (j=1; j<n-i; j++){known_items=known_items+a[i][i+j]*x[i+j]; }x[i]=(b[i]-known_items)/a[i][i];} printf("X的值分别为:\n");for (i=0; i<n; i++)printf("%.5f ",x[i]);//输出x的值printf("\n");getch();}四、实验结果方程1:=1592.22119=-631.76123=-493.50037方程2:=119.52600=-47.14207=-36.83984五、说明与分析在高斯消去法运算的过程中,如果出现(A(i,i))的绝对值等于零或过小的情况,则会导致矩阵元素数量级严重增长和舍入误差的扩散,使得最后的计算结果不可靠,所以需先对矩阵进行变换在计算。