实验六 解方程组的直接法
计算方法-解线性方程组的直接法实验报告

计算方法实验二实验报告专业班级:姓名:学号:实验成绩:1.【实验题目】解线性方程组的直接法2.【实验目的】●掌握高斯消元法及选列主元素的技术●掌握三角分解法与追赶法●掌握向量与矩阵的三种范数及其计算方法●理解方程组的性态、条件数及误差分析3.【实验内容】求解方程组,AX=b 其中4. 【实验要求】(1)分别列选主元消去法与不选主元消去法分别对以上两个方程组求解(2)观察小主元并分析对计算结果的影响。
(3)用追赶法求下述三对角线性方程组的解5. 【算法描述】6. 【源程序(带注释)】(1)一:列主元素消去法#include<iostream>#include<cmath>#define N 20using namespace std;void load();float a[N][N];int m;int main(){int i,j;int c,k,n,p,r;float x[N],l[N][N],s,d;cout<<"下面请输入未知数的个数m=";cin>>m;cout<<endl;cout<<"请按顺序输入增广矩阵a:"<<endl;load();for(i=0;i<m;i++){for(j=i;j<m;j++)c=(fabs(a[j][i])>fabs(a[i][i]))?j:i; /*找列最大元素*/ for(n=0;n<m+1;n++){s=a[i][n];a[i][n]=a[c][n];a[c][n]=s;}/*将列最大数防在对角线上*/for(p=0;p<m+1;p++)cout<<a[i][p]<<"\t";cout<<endl;for(k=i+1;k<m;k++){l[k][i]=a[k][i]/a[i][i];for(r=i;r<m+1;r++) /*化成三角阵*/a[k][r]=a[k][r]-l[k][i]*a[i][r];}}x[m-1]=a[m-1][m]/a[m-1][m-1];for(i=m-2;i>=0;i--){d=0;for(j=i+1;j<m;j++)d=d+a[i][j]*x[j];x[i]=(a[i][m]-d)/a[i][i]; /*求解*/}cout<<"该方程组的解为:"<<endl;for(i=0;i<m;i++)cout<<"x["<<i<<"]="<<x[i]<<"\t";//system("pause");return 0;}void load(){int i,j;for(i=0;i<m;i++)for(j=0;j<m+1;j++)cin>>a[i][j];}一般消去法#include<stdio.h>void solve(float l[][100],float u[][100],float b[],float x[],int n){int i,j;float t,s1,s2;float y[100];for(i=1;i<=n;i++) /* 第一次回代过程开始*/{s1=0;for(j=1;j<i;j++){t=-l[i][j];s1=s1+t*y[j];}y[i]=(b[i]+s1)/l[i][i];}for(i=n;i>=1;i--) /* 第二次回代过程开始*/{s2=0;for(j=n;j>i;j--){t=-u[i][j];s2=s2+t*x[j];}x[i]=(y[i]+s2)/u[i][i];}}void main(){float a[100][100],l[100][100],u[100][100],x[100],b[100];int i,j,n,r,k; float s1,s2;for(i=1;i<=99;i++)/*将所有的数组置零,同时将L矩阵的对角值设为1*/ for(j=1;j<=99;j++){l[i][j]=0,u[i][j]=0;if(j==i) l[i][j]=1;}printf ("input n:\n");/*输入方程组的个数*/scanf("%d",&n);printf ("input array A:\n");/*读取原矩阵A*/for(i=1;i<=n;i++)for(j=1;j<=n;j++)scanf("%f",&a[i][j]);printf ("input array B:\n");/*读取列矩阵B*/for(i=1;i<=n;i++)scanf("%f",&b[i]);for(r=1;r<=n;r++)/*求解矩阵L和U*/{for(i=r;i<=n;i++){s1=0;for(k=1;k<=r-1;k++)s1=s1+l[r][k]*u[k][i];u[r][i]=a[r][i]-s1;}for(i=r+1;i<=n;i++){s2=0;for(k=1;k<=r-1;k++)s2=s2+l[i][k]*u[k][r];l[i][r]=(a[i][r]-s2)/u[r][r];}}printf("array L:\n");/*输出矩阵L*/ for(i=1;i<=n;i++) {for(j=1;j<=n;j++)printf("%7.3f ",l[i][j]);printf("\n");}printf("array U:\n");/*输出矩阵U*/for(i=1;i<=n;i++){for(j=1;j<=n;j++)printf("%7.3f ",u[i][j]); printf("\n");}solve(l,u,b,x,n);printf("解为:\n");for(i=1;i<=n;i++)printf("x%d=%f\n",i,x[i]);}(2)(3)#include <stdio.h>#include <math.h>#include<stdlib.h>#define N 20double a[N], b[N], c[N-1], f[N], r[N]; int n;void LUDecompose();// LU分解void backSubs();// 回代void main(){printf("请输入方程的维数n=");scanf("%d",&n);getchar();if(n>N||n<=0){printf("由于该维数过于犀利, 导致程序退出!");return;}printf("\n输入下三角元素\n");printf("输入%d个a值: ", n-1);for (int i=1; i<n; i++)scanf("%lf", &a[i]);getchar();printf("\n输入主对角线元素\n");printf("输入%d个b值: ", n);for (i=0; i<n; i++)scanf("%lf", &b[i]);getchar();printf("\n输入上三角元素\n");printf("输入%d个c值: ", n-1);for (i=0; i<n-1; i++)scanf("%lf", &c[i]);getchar();printf("\n输入%d个方程组右端项: \n", n);for (i=0; i<n; i++)scanf("%lf", &f[i]);getchar();LUDecompose();backSubs();printf("\n线性方程组的解为: \n");for (i=0; i<n; i++)printf("x%d=%lf\n", i+1, f[i]);}void LUDecompose(){c[0]=c[0]/b[0];for(int i=1;i<n-1;i++){r[i]=a[i];b[i]=b[i]-r[i]*c[i-1];c[i]=c[i]/b[i];}r[i]=a[i];b[i]=b[i]-r[i]*c[i-1];}void backSubs(){f[0]=f[0]/b[0];for(int i=1; i<n; i++)f[i]=(f[i]-r[i]*f[i-1])/b[i];f[n-1]=f[n-1];for(i=n-2;i>=0;i--)f[i]=f[i]-c[i]*f[i+1];}7.【实验结果与分析总结(含运行结果截图)】。
解线性代数方程组的直接方法

n1n n
( n 1) n 1
a x b (n)
(n)
nn n
n
x b a = ( n )
n
n
(n) nn
n
x b a x a ( (i)
i
i
(i) )
(i)
ij j
ii
j i 1
i n 1 , n 2 , L , 1
例1:用消去法解方程组
x1 x2 x3 6; 4x2 x3 5;
. (k 2,3,L , n)
a11 L D1=a11 0, Di M O
ai1 L 证:详细归纳法证(略)。
a1i M0 aii
(i 2,3,L , k).
证:详细归纳法证(略)。
a1(11)
a (1) 12
a(2) 22
L L
L L
A(1) A(k )
O
LL LL
a(k) kk
L
LL
a(k) kk
L
D2
a (1) 11
(1)
a12
(1) ( 2)
a a (2)
11 22
a22
D3
a a a (1) (2) (3) 11 22 33
a (1) 11
L
Dk
O
a (1) 1k
M
a a (1) (2) 11 22
L
a(k kk
)
;
11 1
12 2
13 3
1n n
1
a x a x a x b (2) (2) L (2) (2)
解线性方程组的直接方法

解线性方程组的直接方法一、高斯消元法高斯消元法是解线性方程组最常用的方法之一、它通过一系列的消元操作,将线性方程组转化为阶梯型方程组,从而求解未知数的值。
1.确定线性方程组的阶数和未知数的个数。
设线性方程组中有n个未知数。
2.将线性方程组写成增广矩阵的形式。
增广矩阵是一个n行n+1列的矩阵,其中前n列是线性方程组的系数矩阵,第n+1列是等号右边的常数。
3.通过初等行变换(交换行、数乘行、行加行)将增广矩阵化为阶梯型矩阵。
具体步骤如下:a.首先,找到第一个非零元素所在的列,将它所在的行视为第一行。
b.将第一行的第一个非零元素(主元)变成1,称为主元素。
c.将主元所在列的其他元素(次元素)变为0,使得主元所在列的其他元素只有主元素是非零的。
d.再找到第一个非零元素所在的列,将它所在的行视为第二行,并重复上述步骤,直到将增广矩阵化为阶梯型矩阵。
4.根据阶梯型矩阵求解未知数的值。
具体步骤如下:a.从最后一行开始,依次求解每个未知数。
首先,将最后一行中非零元素所在的列作为含有该未知数的方程,将该未知数的系数设为1b.将含有该未知数的方程中其他未知数的系数设为0,并对其他方程进行相应的变换,使得该未知数所在列的其他元素都为0。
c.重复上述步骤,直到求解出所有未知数的值。
高斯消元法的优点是简单易懂、容易实现,但当线性方程组的系数矩阵接近奇异矩阵时,计算精度可能会降低。
二、矩阵求逆法矩阵求逆法是解线性方程组的另一种直接方法。
它通过对系数矩阵求逆,然后与常数矩阵相乘,得到未知数的值。
1.确定线性方程组的阶数和未知数的个数。
设线性方程组中有n个未知数。
2.将线性方程组写成矩阵方程的形式,即Ax=b,其中A是一个n阶方阵,x和b分别是n维列向量。
3.求系数矩阵A的逆矩阵A^-1a. 首先,计算系数矩阵A的行列式det(A)。
b. 判断det(A)是否为0,如果det(A)=0,则该线性方程组无解或有无穷多解;如果det(A)≠0,则系数矩阵A可逆。
解线性方程组的直接解法

解线性方程组的直接解法一、实验目的及要求关于线性方程组的数值解法一般分为两大类:直接法与迭代法。
直接法是在没有舍入误差的情况下,通过有限步运算来求方程组解的方法。
通过本次试验的学习,应该掌握各种直接法,如:高斯列主元消去法,LU分解法和平方根法等算法的基本思想和原理,了解它们各自的优缺点及适用范围。
二、相关理论知识求解线性方程组的直接方法有以下几种:1、利用左除运算符直接求解线性方程组为bx\=即可。
AAx=,则输入b2、列主元的高斯消元法程序流程图:输入系数矩阵A,向量b,输出线性方程组的解x。
根据矩阵的秩判断是否有解,若无解停止;否则,顺序进行;对于1p:1-=n选择第p列中最大元,并且交换行;消元计算;回代求解。
(此部分可以参看课本第150页相关算法)3、利用矩阵的分解求解线性方程组(1)LU分解调用matlab中的函数lu即可,调用格式如下:[L,U]=lu(A)注意:L往往不是一个下三角,但是可以经过行的变换化为单位下三角。
(2)平方根法调用matlab 中的函数chol 即可,调用格式如下:R=chol (A )输出的是一个上三角矩阵R ,使得R R A T =。
三、研究、解答以下问题问题1、先将矩阵A 进行楚列斯基分解,然后解方程组b Ax =(即利用平方根法求解线性方程组,直接调用函数):⎪⎪⎪⎪⎪⎭⎫ ⎝⎛--------=19631699723723312312A ,⎪⎪⎪⎪⎪⎭⎫ ⎝⎛-=71636b 解答:程序:A=[12 -3 2 1;-3 23 -7 -3;2 -7 99 -6;1 -3 -6 19];R=chol(A)b=[6 3 -16 7]';y=inv(R')*b %y=R'\bx=inv(R)*y %x=R\y结果:R =3.4641 -0.8660 0.5774 0.28870 4.7170 -1.3780 -0.58300 0 9.8371 -0.70850 0 0 4.2514y =1.73210.9540-1.59451.3940x =0.54630.2023-0.13850.3279问题 2、先将矩阵A 进行LU 分解,然后解方程组b Ax =(直接调用函数):⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛----=8162517623158765211331056897031354376231A ,⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛-=715513252b解答:程序:A=[1/3 -2 76 3/4 5;3 1/sqrt(3) 0 -7 89;56 0 -1 3 13;21 65 -7 8 15;23 76 51 62 81];b=[2/sqrt(5);-2;3;51;5/sqrt(71)];[L,U]=lu(A)y=inv(L)*bx=inv(U)*y结果:L = 0.0060 -0.0263 1.0000 0 00.0536 0.0076 -0.0044 0.1747 1.00001.0000 0 0 0 00.3750 0.8553 -0.6540 1.0000 00.4107 1.0000 0 0 0U =56.0000 0 -1.0000 3.0000 13.00000 76.0000 51.4107 60.7679 75.66070 0 77.3589 2.3313 6.91370 0 0 -43.5728 -50.06310 0 0 0 96.5050y =3.0000-0.63880.859850.9836-11.0590x =0.13670.90040.0526-1.0384-0.1146问题3、利用列主元的高斯消去法,求解下列方程组:⎪⎪⎩⎪⎪⎨⎧=+--=--+=-+-=+-+01002010100511.030520001.0204321432143214321x x x x x x x x x x x x x x x x解答:程序:function [RA,RB,n,X]=liezhu(A,b)B=[A b];n=length(b);RA=rank(A);RB=rank(B);zhica=RB-RA;if zhica>0disp('Çë×¢Ò⣺RA~=RB£¬ËùÒÔ´Ë·½³Ì×éÎ޽⡣')returnendif RA==RBif RA==ndisp('Çë×¢Ò⣺ÒòΪRA=RB=n,ËùÒÔ´Ë·½³Ì×éÓÐΨһ½â¡£')X=zeros(n,1);C=zeros(1,n+1);for p=1:n-1[Y ,j]=max(abs(B(p:n,p)));C=B(p,:);for k=p+1:nm=B(k,p)/B(p,p);B(k,p:n+1)=B(k,p:n+1)-m*B(p,p:n+1)endendb=B(1:n,n+1);A=B(1:n,1:n);X(n)=b(n)/A(n,n);for q=n-1:-1:1X(q)=(b(q)-sum(A(q,q+1:n)*X(q+1:n)))/A(q,q);endelsedisp('Çë×¢Ò⣺ÒòΪRA=RB¡´n£¬ËùÒÔ´Ë·½³ÌÓÐÎÞÇî¶à½â¡£') endend键入A=[1 20 -1 0.0012 -5 30 -0.15 1 -100 -102 -100 -1 1];b=[0;1;0;0];[RA,RB,n,X]=liezhu(A,b)结果:请注意:因为RA=RB=n,所以此方程组有唯一解。
线性方程组的直接解法

2、 实验结果 求得������1 = 2; ������2 = 2; ������3 = 3
五、实验结论
1、 在计算机上直接高斯消去法是一种比较高效率的算法, 但是要求矩阵各顺 序主子式不能为 0 以保证主元不为 0. 2、通过选主元的方式可以保证高斯消去法的顺利进行。 3、满足对角占优或对称正定的矩阵方程可以更高效地求解。
三、实验分析 Problem1:
������1 + 2������2 + 3������3 = 14, 用列主元高斯消去法解方程组:{2������1 + 5������2 + 2������3 = 18, 3������1 + ������2 + 5������3 = 20. 1、 实验步骤 1 2 3 14 利用附录程序,输入增广矩阵[2 5 2 18],运行程序得如图结果 3 1 5 20
[附录]迭代法源程序(C 语言)
① 列主元 Gauss 消去法 #include<stdio.h> #include<math.h> #define M 4 void select(int k, double x[][M+1]) { double t=x[k][k],e[M][M+1]; int i,j,m; for(i=k;i<M;i++)//第 k 次选主元 { if(fabs(x[i][k])>fabs(t)) { t=x[i][k]; m=i; } else m=k; } for(j=k;j<M+1;j++) { e[k][j]=x[k][j]; x[k][j]=x[m][j]; x[m][j]=e[k][j]; } } int main() { int i,j,k; double t=0,a[M][M+1],l[M][M+1],x[M]; printf("Input the matrix:\n"); for(i=1;i<M;i++) { for(j=1;j<M+1;j++) scanf("%lf",&a[i][j]); } for(k=1;k<M-1;k++)//消元过程 { select(k,a);//第 k 次选主元 for(i=k+1;i<M;i++)//消元 { l[i][k]=a[i][k]/a[k][k];//消元因子 for(j=k+1;j<M+1;j++) a[i][j]=a[i][j]-l[i][k]*a[k][j];
6第六章 线性方程组的直接解法

( 3) ij
a12
( 2) a22
a13
a1n
0 0 0
( 2) ( 2) a23 a2 n ( 3) ( 3) a33 a3 n
0 0
( 3) ( 3) an a 3 nn
b1 ( 2) b2 ( 3) b3 ( 3) bn
即 其中
Numerical Analysis 第二步: 若 (2) 22
a
0
2015/11/6
J. G. Liu
a1n a a
( 2) 2n
( 2) nn
b1 ( 2) b2 ( 2) bn
, a 11
a 第i行 第2行 a ( 2)
A b
1 2 3
2 5 1
3 14 3 14r 2 r 1 2 r2 3r1 0 1 4 10 2 18 3 1 0 5 4 22 5 20
School of Math. & Phys.
9
North China Elec. P.U.
( 2) n
( 2) nn
b
( 2) i
ai1 bi b1 a11
运算量: (n-1)*(n+1)
11 North China Elec. P.U.
School of Math. & Phys.
a11 a12 ( 2) 0 a22 0 a ( 2) n2
a a a
0 0
(1) 13 (2) 23 (3) 33
a a
0
线性方程组的直接解法实验报告
本科实验报告
课程名称:数值计算方法B
实验项目:线性方程组的直接解法
最小二乘拟合多项式
实验地点:ZSA401
专业班级:学号:201000
学生姓名:
指导教师:李志
2012年4月13日
for(i=1;i<=n;i++)
{
for(j=1;j<=n+1;j++)
printf("%lf\t",A[i][j]);
printf("\n");
}
double answer[N];
Gauss_eliminate(n,answer);
/*输出解*/
for(i=1;i<=n;i++)
printf("a[%d]=%lf\t",i-1,answer[i]);
getchar();
getchar();
}
四、实验结果与讨论、心得
讨论、心得:
刚开始调试代码的时候有时候就是很小的错误导致整个程序不能运行,需要我们一步一步慢慢来,经过无数次的检查程序错误的原因,以及在老师的帮助下,完成了这次实验。
这段时间的实验课提高了我的分析问题,解决问题的能力,特别提高了对一个程序的整。
解线性方程组的直接方法实验报告
解线性方程组的直接方法实验报告解线性方程组的直接方法实验报告1.实验目的:1、通过该课题的实验,体会模块化结构程序设计方法的优点;2、运用所学的计算方法,解决各类线性方程组的直接算法;3、提高分析和解决问题的能力,做到学以致用;4、通过三对角形线性方程组的解法,体会稀疏线性方程组解法的特点。
2.实验过程:实验代码:#include "stdio.h"#include "math.h"#includeusing namespace std;//Gauss法void lzy(double **a,double *b,int n){int i,j,k;double l,x[10],temp;for(k=0;k<n-1;k++){for(j=k,i=k;j<n;j++){if(j==k)temp=fabs(a[j][k]);else if(temp<fabs(a[j][k])) {temp=fabs(a[j][k]);i=j;}}if(temp==0){cout<<"无解" ; return;}else{for(j=k;j<n;j++){temp=a[k][j];a[k][j]=a[i][j];a[i][j]=temp;}temp=b[k];b[k]=b[i];b[i]=temp;}for(i=k+1;i<n;i++){l=a[i][k]/a[k][k];for(j=k;j<n;j++)a[i][j]=a[i][j]-l*a[k][j];b[i]=b[i]-l*b[k];}}if(a[n-1][n-1]==0){cout<<"无解" ; return;}x[n-1]=b[n-1]/a[n-1][n-1]; for(i=n-2;i>=0;i--){temp=0;for(j=i+1;j<n;j++)temp=temp+a[i][j]*x[j];x[i]=(b[i]-temp)/a[i][i];}for(i=0;i<n;i++){printf("x%d=%lf ",i+1,x[i]);printf(" ");}}//平方根法void pfg(double **a,double *b,int n) {int i,k,m;double x[8],y[8],temp;for(k=0;k<n;k++){temp=0;for(m=0;m<k;m++)temp=temp+pow(a[k][m],2);if(a[k][k]<temp)return;a[k][k]=pow((a[k][k]-temp),1.0/2.0);for(i=k+1;i<n;i++){temp=0;for(m=0;m<k;m++)temp=temp+a[i][m]*a[k][m]; a[i][k]=(a[i][k]-temp)/a[k][k]; }temp=0;for(m=0;m<k;m++)temp=temp+a[k][m]*y[m];y[k]=(b[k]-temp)/a[k][k];}x[n-1]=y[n-1]/a[n-1][n-1];for(k=n-2;k>=0;k--){temp=0;for(m=k+1;m<n;m++)temp=temp+a[m][k]*x[m];x[k]=(y[k]-temp)/a[k][k];}for(i=0;i<n;i++){printf("x%d=%lf ",i+1,x[i]);printf(" ");}}//追赶法void zgf(double **a,double *b,int n){int i;double a0[10],c[10],d[10],a1[10],b1[10],x[10],y[10]; for(i=0;i<n;i++) {a0[i]=a[i][i];if(i<n-1)c[i]=a[i][i+1];if(i>0)d[i-1]=a[i][i-1];}a1[0]=a0[0];for(i=0;i<n-1;i++){b1[i]=c[i]/a1[i];a1[i+1]=a0[i+1]-d[i+1]*b1[i];}y[0]=b[0]/a1[0];for(i=1;i<n;i++)y[i]=(b[i]-d[i]*y[i-1])/a1[i];x[n-1]=y[n-1];for(i=n-2;i>=0;i--)x[i]=y[i]-b1[i]*x[i+1];for(i=0;i<n;i++){printf("x%d=%lf ",i+1,x[i]);printf(" ");}}int main{int n,i,j;double **A,**B,**C,*B1,*B2,*B3;A=(double **)malloc(n*sizeof(double)); B=(double **)malloc(n*sizeof(double));C=(double **)malloc(n*sizeof(double));B1=(double *)malloc(n*sizeof(double));B2=(double *)malloc(n*sizeof(double));B3=(double *)malloc(n*sizeof(double));for(i=0;i<n;i++){A[i]=(double *)malloc((n)*sizeof(double)); B[i]=(double *)malloc((n)*sizeof(double)); C[i]=(double *)malloc((n)*sizeof(double)); } cout<<"第一题(Gauss列主元消去法):"<<endl<<endl; cout<<"请输入阶数n:"<<endl;cin>>n;cout<<" 请输入系数矩阵: ";for(i=0;i<n;i++)for(j=0;j<n;j++){。
解线性方程组的直接方法
或写为矩阵形式
a11 a21
a12
a22
a1n x1 b1
a2n
x2
b2
,
am1 am2 amn xn bm
(2.1)
17
简记为 Ax b. 例1 用消去法解方程组
x1 x2 x3 6,
4x2 x3 5,
2x1 2x2 x3 1.
(2.2) (2.3) (2.4)
其中用 r表i 示矩阵的第 行i . 由此看出,用消去法解方程组的基本思想是用逐次消
去未知数的方法把原方程组 Ax 化b为与其等价的三角 形方程组,而求解三角形方程组可用回代的方法.
上述过程就是用行的初等变换将原方程组系数矩阵化
为简单形式(上三角矩阵),从而将求解原方程组(2.1)的
问题转化为求解简单方程组的问题.
x
j
)/ ai(ii)
(i n1,n2,,1).
(2) 如果 为A非奇异矩阵,则可通过高斯消去法(及交
换两行的初等变换)将方程组 Ax约b化为(2.10).
29
算法1(高斯算法)
设 AR mn (m 1), s min( m1,n), 如果
a(k) kk
0(k
1,2,,s),
本算法用高斯方法将
非奇异矩阵 P使得
设 A为 n阶矩阵,则存在一个
J1(1)
P1 AP
J 2 (2 )
,
J r (r )
13
其中
i
1
i
J
i
(i
)
i 1
i ni ni
r
ni 1(i 1,2,,r),且 ni n. i1
为若当(Jordan)块.
求解线性方程组的直接方法算法实验报告
求解线性方程组的直接方法(2学时)一 实验目的1.掌握求解线性方程组的高斯消元法及列主元素法;2. 掌握求解线性方程组的克劳特法;3. 掌握求解线性方程组的平方根法。
二 实验内容1.用高斯消元法求解方程组(精度要求为610-=ε):1231231233272212240x x x x x x x x x -+=⎧⎪-+-=-⎨⎪-+=⎩2.用克劳特法求解上述方程组(精度要求为610-=ε)。
3. 用平方根法求解上述方程组(精度要求为610-=ε)。
4. 用列主元素法求解方程组(精度要求为610-=ε):1231231233432222325x x x x x x x x x -+=⎧⎪-+-=⎨⎪--=-⎩三 实验步骤(算法)与结果1. #include<stdio.h>main(){ float a11,a12,a13,b1,a21,a22,a23,b2,a31,a32,a33,b3,l21,l31,l32,u11,u12,u13,u22,u23,u33,z1,z2,z3,x1,x2,x3;printf("enter a11,a12,a13,b1,a21,a22,a23,b2,a31,a32,a33,b3 :"); scanf("%f%f%f%f%f%f%f%f%f%f%f%f/n",&a11,&a12,&a13,&b1,&a21,&a22, &a23,&b2,&a31,&a32,&a33,&b3 );l21=a12/a11;l31=a31/a11;u22=a22-l21*a12;l32=(a32-l31*a12)/u22;u23=a23-l21*a13;u33=a33-l31*a13-l32*u23;z2=b2-l21*b1;z3=b3-l31*b1-l32*z2;printf("u22=%fu23=%fz2=%fu33=%fz3=%f`````",u22,u23,z2,u33,z3); x3=z3/u33;x2=(z2-u23*x3)/u22;x1=(b1-a13*x3-a12*x2)/a11;printf("x1=%f x2=%f x3=%f ",x1,x2,x3);return 0;}2.#include<stdio.h>main(){float a11,a12,a13,b1,a21,a22,a23,b2,a31,a32,a33,b3,l22,l32,l33,u11,u12,u13,u22,u23,u33,z1,z2,z3,x1,x2,x3;printf("enter a11,a12,a13,b1,a21,a22,a23,b2,a31,a32,a33,b3 :");scanf("%f%f%f%f%f%f%f%f%f%f%f%f/n",&a11,&a12,&a13,&b1,&a21,&a22,&a23,&b2,&a31,&a32,&a33,&b3 );u11=1;u22=1; u33=1;u12=a12/a11;u13=a13/a11;z1=b1/a11;l22=a22-a21*u12;u23=(a23-a21*u13)/l22;z2=(b2-a21*z1)/l22;l32=a32-a31*u12;l33=a33-a31*u13-l32*u23;z3=(b3-a31*z1-l32*z2)/l33;printf("u11=%f u12=%f u13=%f z1=%f u22=%f u23=%f z2=%f u33=%f z3=%f------",u11,u12,u13,z1,u22,u23,z2,u33,z3);x3=z3;x2=z2-u23*x3;x1=z1-u13*x3-u12*x2;printf("x1=%f x2=%f x3=%f ",x1,x2,x3);getch();return 0;}3. #include<stdio.h>#include<math.h>{float a11,a12,a13,b1,a21,a22,a23,b2,a31,a32,a33,b3,l11,l12,l13,l23,l21,l22,l31,l32,l33,z1,z2,z3,x1,x2,x3;printf("enter a11,a12,a13,b1,a21,a22,a23,b2,a31,a32,a33,b3 :");scanf("%f%f%f%f%f%f%f%f%f%f%f%f/n",&a11,&a12,&a13,&b1,&a21,&a22, &a23,&b2,&a31,&a32,&a33,&b3 );l11=sqrt(a11);l21=a21/l11; l31=a31/l11;l22=sqrt(a22-l21*l21);l32=(a32-l21*l31)/l22;l33=sqrt(a33-l31*l31-l32*l32);z1=b1/l11;z2=(b2-l21*z1)/l22;z3=(b3-l31*z1-l32*z2)/l33;printf("l11=%f z1=%f l22=%f z2=%f l33=%fz3=%f---",l11,z1,l22,z2,l33,z3);x3=z3/l33;x2=(z2-l32*x3)/l22;x1=(z1-l31*x3-l21*x2)/l11;printf("x1=%f x2=%f x3=%f ",x1,x2,x3);getch();return 0;}4. #include "stdio.h"#include "math.h"main(){ float a11,a12,a13,b1,a21,a22,a23,b2,a31,a32,a33,b3,l21,l31,A22,A23,d1,A32,A33,d2,l32,a,d3,x1,x2,x3,A,B,C,D;printf("enter a11,a12,a13,b1,a21,a22,a23,b2,a31,a32,a33,b3:"); scanf("%f%f%f%f%f%f%f%f%f%f%f%f", &a11,&a12,&a13,&b1,&a21,&a22,&a23,&b2,&a31,&a32,&a33,&b3);if(fabs(a11)<fabs(a21)){ if(fabs(a11)>fabs(a31))A=a11;a11=a31;a31=A;B=a12;a12=a32;a32=B;C=a13;a13=a33;a33=C;D=b1;b1=b3;b3=D ;}if (fabs(a11)<fabs(a21)){if(fabs(a21)>fabs(a31)){A=a11;a11=a21;a21=A;B=a12;a12=a22;a22=B;C=a13;a13=a23;a23=C;D=b1;b1=b2;b2=D ;}elseA=a11;a11=a31;a31=A;B=a12;a12=a32;a32=B;C=a13;a13=a33;a33=C;D=b1;b1=b3;b1=D ;}printf("now a11=%f a12=%f a13=%f b1=%f\n",a11,a12,a13,b1); printf("now a21=%f a22=%f a23=%f b2=%f\n",a21,a22,a23,b2); printf("now a31=%f a32=%f a33=%f b3=%f\n",a31,a32,a33,b3);l21=a21/a11; l31=a31/a11;A22=a22-l21*a12;A23=a23-l21*a13;d1=b2-l21*b1;A32=a32-l31*a12; A33=a33-l31*a13;d2=b3-l31*b1;if(fabs(A22)>fabs(A32)){ l32=A32/A22;a=A33-l32*A23;d3=d2-l32*d1;x3=d3/a;x2=(d1-A23*x3)/A22;x1=(b1-a13*x3-a12*x2)/a11;}else l32=A22/A32;a=A23-l32*A33;d3=d1-l32*d2;x3=d3/a;x2=(d2-A33*x3)/A32;x1=(b1-a13*x3-a12*x2)/a11;printf("x1=%f x2=%f x3=%f\n",x1,x2,x3);getch(); return 0; }。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2016-2017学年第1学期数值分析实验
班级姓名实验日期
实验六解方程组的直接法
一、实验目的
熟悉Mathematics中有关矩阵的函数、掌握求解线性方程组的高斯消去法、三角分解法、追赶法的求解方法和计算机实现。
一、实验内容与过程
1 Mathematics中有关矩阵的运算和函数矩阵输入:Shift+Ctri+C
(1)a.b.c or Dot[a, b, c] 矩阵或向量相乘。
In[1]:= {a1,a2,a3}.{b1,b2,b3}
Out[1]= a1 b1+a2b2+a3b3
In[2]:=
1113
236
4326
135
4218
⎛⎫
⎛⎫ ⎪
∙
⎪ ⎪
⎝⎭ ⎪
⎝⎭
//MatrixForm Out[2]=
38231472
33201261
⎛⎫
⎪
⎝⎭
(2)Inverse[A] 求矩阵A的逆矩阵
In[3]:=
123
[203]
111
B Inverse A
⎛⎫
⎛⎫
⎪
⎪
==-
⎪
⎪
⎪
⎪
-
⎝⎭
⎝⎭
//MatrixForm
Out[3]=
3/135/136/13 5/134/133/13 2/131/134/13 -⎛⎫ ⎪
-
⎪ ⎪
-
⎝⎭
(3)Transpose[list] 求矩阵的转置矩阵
In[4]:=Transpose[
123
456
⎛⎫
⎪
⎝⎭
]//MatrixForm Out[4]=
14
25
36
⎛⎫
⎪
⎪
⎪
⎝⎭
(4)Det[m] 求矩阵的行列式
In[5]:=Det[
2346
7852
2312
3541
⎛⎫
⎪
⎪
⎪
⎪
-
⎝⎭
] Out[5]=-112
(5)Tr[list] 求矩阵的迹
In[7]:= mat={{a,b,c},{d,e,f},{g,h,i}})//MatrixForm
Tr[mat]
Out[7]=a+e+i
(6)Eigenvalues[m] 求矩阵的特征值
In[8]:=
21 {,}[]
31
Eigenvalues
λμ
⎛⎫= ⎪
-
⎝⎭
Out[8]=
11 {(1
22
+
(7)LinearSolve [m , b ] 求解线性方程组m .x =b .
In[9]:= 1213m ⎛⎫
= ⎪⎝⎭
;v={5,8};
s=LinearSolve[m,v]
Out[9]= {-1,3}
(8)用三角分解法求解方程组的解
Step1:lub=LUDecomposition [A ] 矩阵A 三角分解A=LU,并将其存放在变量lub 中; Step2:LUBackSubstitution[lub,b], 求解方程Ly=b 和Ux=y 得出方程组的解。
例求解方程组12115108x x ⎛⎫⎛⎫⎛⎫
= ⎪ ⎪ ⎪⎝⎭⎝⎭
⎝⎭
In[10]:= lud=LUDecomposition[1110A ⎛⎫
= ⎪⎝⎭
]
Out[10]= {{{1,1},{1,-1}},{1,2},1}(表示111011101101A ⎛⎫⎛⎫⎛⎫
== ⎪ ⎪⎪-⎝⎭⎝⎭⎝⎭)
In[11]:= LUBackSubstitution [lud,{5,8}] Out[1]= {8,-3}
问题1、用函数LinearSolve 解线性方程组⎪⎩
⎪
⎨⎧=--=++=++2
33322021321321x x x x x x x x
In[9]:= s=LinearSolve[111223130⎛⎫
⎪
⎪ ⎪--⎝⎭
,{0,3,2}]
Out[9]= (写出实验结果)
问题2、用三角分解法解线性方程组 ⎪⎩⎪
⎨⎧=+-=++--=++3
1032202412
25321
321321x x x x x x x x x
In[11]:= lud=LUD ecom position[m=5211422310⎛⎫ ⎪
- ⎪ ⎪-⎝⎭
]
Out[11]= (写出结果)
In[12]:= LUBackSubstitution [lud,{-12,20,3}] Out[12]= (写出结果)
问题3 列主元消去法解线性方程组123412412341342x x -3x -x 13x x 7x 2x 2x 4x 2x 1x x 5x 5+=⎧⎪++=⎪
⎨-++-=-⎪⎪-+=⎩
A={{2,1,-3,-1},{3,1,0,7},{-1,2,4,-2},{1,0,-1,5}};
b={1,2,-1,5};
{m,n}=Dimensions[A];(*求矩阵的行列数*)
Do[temp=Flatten[Abs[Take[A,{k,m},{k}]]];(*从第k列中取出第k到第m个元素*)
kmax=Position[temp,Max[temp]][[1,1]]+k-1;(*找出第k列中最大元素所处的行*)
If[k≠kmax,{A[[k]],A[[kmax]]}={A[[kmax]],A[[k]]};(*矩阵第k行与第kmax行交换*)
{b[[k]],b[[kmax]]}={b[[kmax]],b[[k]]}];(*向量b第k个元素与第kmax个元素交换*)
If[A[[k,k]]≠0,Do[A[[i,k]]=A[[i,k]]/A[[k,k]];
Do[A[[i,j]]=A[[i,j]]-A[[i,k]]*A[[k,j]],
{j,k+1,n}];
b[[i]]=b[[i]]-A[[i,k]]*b[[k]],{i,k+1,m}],
Print["Error"];Break[]],{k,m-1}](*消元*)
b[[m]]=b[[m]]/A[[m,m]];(*求解x
m
*)
Do[b[[i]]=(b[[i]]-Sum[A[[i,j]]*b[[j]],{j,i+1,m}])/A[[i,i]],{i,m-1,1,-1}];(*回代求解*)
b
方程组的解为:
问题4 追赶法解线性方程组
12
123
234
34
3x2x7
-x3x2x11
x3x2x15
x3x9
+=
⎧
⎪++=
⎪
⎨
-++=⎪
⎪-+=
⎩
b={3,3,3,3};
a={-1,-1,-1};
c={2,2,2};
d={7,11,15,9};
n=Length[b];
Moduleodule[{},Do[c[[i-1]]=c[[i-1]]/b[[i-1]];(*计算*)
b[[i]]=b[[i]]-a[[i-1]]*c[[i-1]],{i,2,n}];
d[[1]]=d[[1]]/b[[1]];
Do[d[[i]]=(d[[i]]-a[[i-1]]*d[[i-1]])/b[[i]],{i,2,n}];
Do[d[[i]]=d[[i]]-c[[i]]*d[[i+1]],{i,n-1,1,-1}];d] 方程组的解为:。