解线性方程组的直接方法实验报告

合集下载

解线性方程组的直接方法实验报告范本

解线性方程组的直接方法实验报告范本

解线性方程组的直接方法实验报告Record the situation and lessons learned, find out the existing problems andform future countermeasures.姓名:___________________单位:___________________时间:___________________编号:FS-DY-20246 解线性方程组的直接方法实验报告解线性方程组的直接方法实验报告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=0;i--){temp=0;for(j=i+1;j=0;k--){temp=0;for(m=k+1;m0)d[i-1]=a[i][i-1];}a1[0]=a0[0];for(i=0;i=0;i--)x[i]=y[i]-b1[i]*x[i+1];for(i=0;i>n;cout<<" 请输入系数矩阵: ";for(i=0;i<n;i++)for(j=0;j<n;j++){Foonshion图文设计有限公司Fonshion Design Co., Ltd。

实验五 解线性方程组的直接法

实验五 解线性方程组的直接法

毕节学院实验报告实验名称:解线性方程组的直接法实验报告序号: 5 组别姓名罗晟同组实验者实验项目解线性方程组的直接法实验日期2012年11月17日实验类别□√1、验证性实验或基础性实验;□2、综合性实验□3、设计性实验;□4、创新性实验和研究性实验;教师评语实验成绩指导教师(签名)赖志柱年月日实验目的掌握线性方程组直接解法的基本思想,进一步熟练掌握高斯消去法,提高编程能力和解算线性方程组问题的实践技能。

实验任务与要求用一种高级语言(推荐用MATLAB)编写高斯消去法具体实现的函数,要求输入参数包含方程组的系数矩阵及常数项向量,输出方程组的解,并使用若干个有代表性的例子进行调试。

小组合作分工说明:实验过程及内容:function [x,det,index] = LGuass(A,b)[n,m] = size(A);nb = length(b);if n ~= merror('矩阵A的行列必须相等!');return;endif m ~= nberror('b矩阵的个数必须与矩阵A的行数相等!');return;end%开始计算,先赋初值index = 1;det = 1;x = zeros(n,1);for k = 1:n-1%选主元a_max = 0;for i = k:nif abs(A(i,k)) > a_maxa_max = abs(A(i,k));r = i;endendif a_max < 1e-20index = 0;return;end%交换两行if r > kfor j = k:nz = A(k,j);A(k,j) = A(r,j);A(r,j) = z;endz = b(k);b(k) = b(r);b(r) = z;det = -det;end%消元过程for i = k+1:nm = A(i,k)/A(k,k);for j = k+1:nA(i,j) = A(i,j) - m*A(k,j);endb(i) = b(i) - m*b(k);enddet = det*A(k,k);enddet = det*A(n,n);%回代过程if abs(A(n,n)) < 1e-10index = 0;return;endfor k = n:-1:1for j = k+1:nb(k) = b(k) - A(k,j)*x(j);endx(k)=b(k)/A(k,k);end。

线性方程组的直接解法

线性方程组的直接解法

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];

线性方程组的直接解法实验报告

线性方程组的直接解法实验报告

本科实验报告
课程名称:数值计算方法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();
}
四、实验结果与讨论、心得
讨论、心得:
刚开始调试代码的时候有时候就是很小的错误导致整个程序不能运行,需要我们一步一步慢慢来,经过无数次的检查程序错误的原因,以及在老师的帮助下,完成了这次实验。

这段时间的实验课提高了我的分析问题,解决问题的能力,特别提高了对一个程序的整。

实验五 解线性方程组的直接方法

实验五  解线性方程组的直接方法

实验五 解线性方程组的直接方法实验5.1 (主元的选取与算法的稳定性)问题提出:Gauss 消去法是我们在线性代数中已经熟悉的。

但由于计算机的数值运算是在一个有限的浮点数集合上进行的,如何才能确保Gauss 消去法作为数值算法的稳定性呢?Gauss 消去法从理论算法到数值算法,其关键是主元的选择。

主元的选择从数学理论上看起来平凡,它却是数值分析中十分典型的问题。

实验内容:考虑线性方程组n n n R b R A b Ax ∈∈=⨯,,编制一个能自动选取主元,又能手动选取主元的求解线性方程组的Gauss 消去过程。

实验要求:(1)取矩阵⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=1415157,6816816816 b A ,则方程有解T x )1,,1,1(* =。

取n=10计算矩阵的条件数。

让程序自动选取主元(顺序消元),结果如何?(2)现选择程序中手动选取主元的功能。

每步消去过程总选取按模最小或按模尽可能小的元素作为主元,观察并记录计算结果。

若每步消去过程总选取按模最大的元素作为主元,结果又如何?分析实验的结果。

(3)取矩阵阶数n=20或者更大,重复上述实验过程,观察记录并分析不同的问题及消去过程中选择不同的主元时计算结果的差异,说明主元素的选取在消去过程中的作用。

(4)选取其他你感兴趣的问题或者随机生成矩阵,计算其条件数。

重复上述实验,观察记录并分析实验结果。

实验5.2(线性代数方程组的性态与条件数的估计)问题提出:理论上,线性代数方程组b Ax =的摄动满足⎪⎪⎭⎫ ⎝⎛∆+∆∆-≤∆-b b A A A A A cond x x 11)(矩阵的条件数确实是对矩阵病态性的刻画,但在实际应用中直接计算它显然不现实,因为计算1-A 通常要比求解方程b Ax =还困难。

实验内容:MATLAB 中提供有函数“condest ”可以用来估计矩阵的条件数,它给出的是按1-范数的条件数。

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

计算方法-解线性方程组的直接法实验报告
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];
{
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=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");
{
s2=0;
for(j=n;j>i;j--)

求解线性方程组的直接方法算法实验报告

求解线性方程组的直接方法算法实验报告

求解线性方程组的直接方法(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.实验目的: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][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][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][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++){。

实验4解线性方程组的直接法

实验4解线性方程组的直接法

西华数学与计算机学院上机实践报告课程名称:计算方法A年级: 上机实践成绩: 指导教师:严常龙姓名: 上机实践名称:解线性方程组的直接法学号: 上机实践日期: 上机实践编号:1上机实践时间:16:00-17:40 一、目的1.通过本实验,加深对解线性方程组的直接法——高斯列主消元法、LU 分解法、LDL T 分解法的构造过程的理解;2.能将各种方法的算法描述正确地改编为程序并上机实现;3.熟悉并掌握各种方法的适用对象及优缺点,学会针对不同问题选择不同方法。

二、内容与设计思想自选线性方程组,编制一个程序,分别用高斯列主元消元法和LU 分解法求解。

然后完成作业: 分别用高斯列主元消元法和LU 分解法求解下面的方程组(以下方程组供选择)。

⎪⎪⎩⎪⎪⎨⎧=+++=-++=+-+=+-+9.369.57.34.05.16.163.11.89.06.58.18.25.33.63.11.155.04.43.22.74321432143214321x x x x x x x x x x x x x x x x自选线性方程组(系数矩阵为实对称正定矩阵),编制LDL T 分解法的程序完成求解三、使用环境操作系统:Windows XP软件环境:Microsoft Visual C++四、核心代码及调试过程#include<stdio.h>#include<math.h>#include<string.h>void main(){int i,j,k,p,N;float a[50][51],t,x[50];float max,temp;printf("\n 请输入方程未知数的个数N:");scanf("%d",&N);printf("\n 请输入方程的增广矩阵的数据,数据之间按回车键隔开!\n");for(i=0;i<N;i++){ printf("请输入第%d 行的%d 个数据:\n",i+1,N+1);for(j=0;j<N+1;j++){scanf("%f",&a[i][j]);}printf("\n");}printf("\n增广矩阵的初始数值:\n");for(i=0;i<N;i++){for(j=0;j<N+1;j++){printf("%f ",a[i][j]);}printf("\n");}for(k=0;k<N-1;k++){//*******************************if(a[k][k]>=0){max=a[k][k];}else{max=a[k][k];}for(i=k;i<N;i++){if((max<a[i][k])||(max<-a[i][k])){max=0;if(a[i][k]>=0){max=a[i][k];}else{max=-a[i][k];}}}for(i=k;i<N;i++){if((max=a[i][k])||(max=-a[i][k])){p=i;break;}}for(j=0;j<N+1;j++){temp=a[p][j];a[p][j]=a[k][j];a[k][j]=temp;}//****************************选主列的元。

线性方程组直接解法实验

线性方程组直接解法实验

实验一 线性方程组直接解法实验一、实验目的1.运用matlab 软件完成线性方程组的直接实验;2.通过实验,了解Doolittle 分解方法和列主元消去法解方程组的过程,并比较两种方法的优点。

二、实验题目分别用Doolittle 分解方法和列主元消去法解方程组123410-7018-3 2.09999962 5.9000015-15-1521021⎛⎫⎛⎫⎛⎫⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭⎝⎭x x x x . 输出A ,b ;Doolittle 分解方法的L 和U ;解向量x,det A ;列主元方法的行交换次序,解向量x,det A ;比较两种方法所得的结果。

三、实验原理1) Doolittle 分解方法的原理算法原理:应用高斯消去法解n 阶线性方程Ax b =经过1n -步消去后得出一个等价的上三角形方程组()()n n A x b =,对上三角形方程组用逐步回代就可以求出解来。

这个过程也可通过矩阵分解来实现。

将非奇异阵分解成一个下三角阵L 和上三角阵U 的乘积称为对矩阵A 的三角分解,又称LU 分解。

根据LU 分解,将Ax b =分解为Ly bUx y =⎧⎨=⎩形式,简化了求解问题。

程序框图:变量说明:ij a 为系数矩阵元素,i b 为常数矩阵系数,,ij ij l u 分别为下、上三角矩阵元素。

2)列主元消去法解方程组的原理算法原理:列选主元是当变换到第k步时,从k列的kk a及以下的各元素中选取绝对值a的位置上,然后再进行消元过程。

交换系数矩阵中最大的元素,通过行交换将其交换到kk的两行(包括常数项),相当于两个方程的位置交换了。

程序框图:Array变量说明:k表示消元到a为消元第k步时第k步,kk主对角线元素3)四、实验过程及结果1)Doolittle分解方法的输出结果----------计算实习题----------Page64 第1题用Doolittle分解方法解方程组A =10.0000 -7.0000 0 1.0000-3.0000 2.1000 6.0000 2.00005.0000 -1.0000 5.0000 -1.00002.0000 1.0000 0 2.0000b =8.00005.90005.00001.0000L =1.0e+006 *0.0000 0 0 0-0.0000 0.0000 0 00.0000 -2.5000 0.0000 00.0000 -2.4000 0.0000 0.0000 U =1.0e+007 *0.0000 -0.0000 0 0.00000 -0.0000 0.0000 0.00000 0 1.5000 0.57500 0 0 0.0000 X =-0.0000-1.00001.00001.0000det(A)值为-762.00009000----------输出完毕----------2)列主元消去法输出结果----------计算实习题----------Page64 第1题列主元消去法解方程组A =10.0000 -7.0000 0 1.0000-3.0000 2.1000 6.0000 2.00005.0000 -1.0000 5.0000 -1.00002.0000 1.0000 0 2.0000b =8.00005.90005.00001.0000X =0.0000-1.00001.00001.0000detA值为-762.00009000----------输出完毕----------五、实验分析1.运用LU分解法可以成批地解方程组,且速度快.若c先求LU=A3,再解(LU)x=b,则要重新计算,计算量增加;如果按照上述方法计算,能够减少运算次数,加快运算速度.3. ⑴无论当n=10、n=100、n=1000时,x1与x2的值都相等,且随着n的增大,变化的只是解的中间部分数字,头、前后几位数都没有变化.⑵高斯消去法应用于三对角方程组得到的就是所谓的“追赶法”.追赶法不需要对零元素计算,只有6n-5次乘除法计算量,求解速度快.且当系数矩阵对角占优时数值稳定,是解三对角方程组的优秀解法.⑶用LU分解法解此方程组速度慢.顺序高斯消去法实际上就是将方程组的系数矩阵分解成单位下三角矩阵与上三角矩阵的乘积.顺序高斯消去法的消元过程相当于LU分解过程和Ly=b的求解,回代过程则相当于解线性方程组Ux=y,故其求解速度慢.六、附原程序1)Doolittle分解方法原程序fprintf('----------计算实习题----------\n')fprintf('Page64 第1题用Doolittle分解方法解方程组\n')A=[10 -7 0 1 ; -3 2.099999 6 2 ;5 -1 5 -1 ; 2 1 0 2];b=[8;5.900001;5;1];n=length(A);U=zeros(n,n);L=eye(n,n);U(1,:)=A(1,:);L(2:n,1)=A(2:n,1)/U(1,1);for i=2:n;U(i,i:n)=A(i,i:n)-L(i,1:i-1)*U(1:i-1,i:n);L(i+1:n,i)=(A(i+1:n,i)-L(i+1:n,1:i-1)*U(1:i-1,i))/U(i,i); endY=zeros(n);Y(1)=b(1);for i=2:nY(i)=b(i)-L(i,1:i-1)*Y(1:i-1,1);endX=zeros(n,1);if det(U)==0;X=0;elseX(n)=Y(n)/U(n,n);for i=n-1:-1:1X(i)=(Y(i)-U(i,i+1:n)*X(i+1:n,1))/U(i,i);endendAbLUXfprintf('det(A)值为%9.8f\n',det(A))fprintf('----------输出完毕 ----------\n')2)列主元消去法原程序fprintf('----------计算实习题----------\n')fprintf('Page64 第1题列主元消去法解方程组\n')A=[10 -7 0 1 ; -3 2.099999 6 2 ;5 -1 5 -1 ; 2 1 0 2];b=[8;5.900001;5;1];C=[A b];n=length(A);D=zeros(n,n+1);l=zeros(n,1);for i=1:nD=C;k=min(find(C(i:n,i)==max(C(i:n,i))));C(i,i:n+1)=D(k+i-1,i:n+1);C(k+i-1,i:n+1)=D(i,i:n+1);l(i+1:n,1)=C(i+1:n,i)/C(i,i);C(i+1:n,i:n+1)= C(i+1:n,i:n+1)- l(i+1:n,1)*C(i,i:n+1); endX=zeros(n,1);X(n)=C(n,n+1)/C(n,n);for i=n-1:-1:1X(i)=(C(i,n+1)-C(i,i+1:n)*X(i+1:n,1))/C(i,i); endAbXfprintf('detA值为%9.8f\n',det(A))fprintf('----------输出完毕----------\n')。

实验2_求解线性方程组直接法

实验2_求解线性方程组直接法

数值分析实验报告二求解线性方程组的直接方法(2学时)班级专业 统计一班 姓名 何斌 学号 06 日期 2011-3-30一 实验目的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. 高斯消元法求解:设所求方程组的增广矩阵为A0,系数矩阵为A01,(择定值)L=(l11,l22,l33), 方程组右边的值用有序数组B 表示.clearA0=[3 -1 2 7;-1 2 -2 -1;2 -2 4 0];L=[1,1,1];A01=[3 -1 2 ;-1 2 -2 ;2 -2 4 ];B=[7 -1 0];%a=zeros(size(A0));a=A0;%l=zeros(1,3);l=L;%消元过程的计算公式u11=a(1,1)/l(1,1);u12=a(1,2)/l(1,1);u13=a(1,3)/l(1,1);z1=a(1,4)/l(1,1); a(2,1)=a(2,1)/u11;a(2,2)=(a(2,2)-a(2,1)*u12)/l(1,2);a(2,3)=(a(2,3)-a(2,1)*u13)/l(1,2);z2=(a(2,4)-a(2,1)*z1)/l(1,2);a(3,1)=a(3,1)/u11;a(3,2)=(a(3,2)-a(3,1)*u12)/a(2,2);a(3,3)=(a(3,3)-a(3,1)*u13-a(3,2)*a(2,3))/l(1,3);z3=(a(3,4)-a(3,1)*z1-a(3,2)*z2)/l(1,3);A1=[u11 u12 u13 ;0 a(2,2) a(2,3) ; 0 0 a(3,3)]; %得到上三角矩阵Z=[z1;z2;z3];%迭代求解x3=z3/a(3,3); x2=(z2-a(2,3)*x3)/a(2,2); x1=(z1-u13*x3-u12*x2)/u11;x=[x1 x2 x3];for k=1:3fprintf('x(%d)的结果为%.6f\n\n',k,x(k)),end %控制精度%残差法检验答案C=A01*X'-B'程序运行结果:x(1)的结果为3.500000x(2)的结果为-1.000000x(3)的结果为-2.250000残差法检验结果:C = 1.0e-014 *[ 0.0888, -0.0888, 0.1776]’显然符合要求2.克劳特法求解:易知克劳特法与高斯消元法求解中仅择取的L初值不同,故改取L=[3 2 4]即可。

实验三:解线性方程组的直接法(一)

实验三:解线性方程组的直接法(一)

计算方法(C语言版)实验报告实验三:解线性方程组的直接法(一)(第三章)一、实验目的:1.用程序验证消元法和三角分解法。

2.掌握直接求解线性方程组的常用算法:列主元高斯消元法、LU分解法等。

3.记录运行结果,回答问题,完成实验报告。

二、实验条件:Microsoft Visual C++C-Free三、实验内容及运行结果:(一)、用列主元高斯消元法求解线性方程组:x+y-z=1-x+y-z=1-x-y-z=31.源程序:#include<stdio.h>#include<math.h>#define MAXSIZE 50void input(double a[MAXSIZE] [MAXSIZE+1],long n);void output(double x[MAXSIZE],long n);int main(int){double a[MAXSIZE] [MAXSIZE+1],x[MAXSIZE],s,max,t;long n,i,j,k,maxi;printf("\n Please enter the original equations of order number:"); scanf("%ld",&n);input(a,n);for(k=0;k<=n-2;k++){max=a[k][k];maxi=k;for(i=k+1;i<=n-1;i++)if(fabs(a[i][k])>fabs(max)){max=a[i][k];maxi=i;}if(max==0)break;if(maxi!=k)for(j=k;j<=n;j++){t=a[k][j];a[k][j]=a[maxi][j];a[maxi][j]=t;}for(i=k+1;i<=n-1;i++){a[i][k]/=-a[k][k];for(j=k+1;j<=n;j++)a[i][j]+=a[i][k]*a[k][j];}}if(max==0)printf("\nThe original equations has no solution。

计算方法实验:解线性方程组的直接法

计算方法实验:解线性方程组的直接法

实验二解线性方程组的直接法一、实验目的用列主元素高斯消去法和三角分解法解线性方程组Ax=b。

式中,A为n阶非奇异方阵,x,b是n阶列向量,并分析选主元素的重要性。

二、实验方法(1)列主元素高斯消去法通过变换,将系数矩阵换成等价的上三角矩阵,在每步消元过程中,选列主元素。

对k=1,2,……n-1,逐次计算l ik=a ik(k-1)/a kk(k-1) (i=k+1,k+2,……,n)a ij(k)=a ij(k-1)-l ik a kj(k-1) (i,j=k+1,k+2,……,n)b i(k)=b i(k-1)-l ik b k(k-1) (i=k+1,k+2,……,n)逐步回代气的原方程组的解X n=b i(n-1)/a nn(n-1)X k=(b k(k-1)_a kj(k-1)x j)/a kk(k-1) (k=n-1,n-2, (1)(2)直接三角分解法由于两个矩阵相等就是它们的对应元素相等,因此通过比较A与LU的对应元素,即可得到直接计算L,U的元素的公式。

设A=L×U,其中U的第一行、L的第一列的元素分别为对(依次:U的第二行,L的第二列,U的第三行,L的第三列……),有由上述两种方法得到矩阵A的LU分解后,求解Ly=b与Ux=y的计算公式为∑+=n1kj三、实验内容解下列方程组·=四、实验程序(1)列主元素高斯消去法(2)直接三角分解法0147.06721.109998.42371.13142.17643.89217.44129.35435.15330.27875.15301.04017.31651.18326.31348.14321xxxx9237.164231.183941.65342.9五、实验结果(仅供参考)精确解为:(1,1,1,1)T六、结果分析实验的数学原理很容易理解,也容易上手。

把运算的结果带入原方程组,可以发现符合的还是比较好。

这说明列主元消去法计算这类方程的有效性。

数值分析-线性方程组的直接解法

数值分析-线性方程组的直接解法
2.得到U矩阵:
U =
Columns 1 through 7
16.0000 10.0000 -11.0000 -9.0000 17.0000 34.0000 2.0000
0 4.5000 3.2500 -3.2500 10.2500 15.5000 -2.5000
0 0 -3.2222 10.2222 -3.7778 -3.4444 1.5556
fori=2:n
t=0;
fork=1:i-1
t=t+L(i,k)*b(k);
end;
b(i)=b(i)-t;
end;
y=b
x(n)=b(n)/U(n,n);
fori=n-1:-1:1
t=0;
fork=i+1:n
t=t+U(i,k)*x(k);
end;
x(i)=(y(i)-t)/U(i,i);
end;
ifk~=1
A(k:n,k)=A(k:n,k)-A(k:n,1:k-1)*A(1:k-1,k);
end
t=find(abs(A(k:n,k))==max(abs(A(k:n,k))));
t=t(1)+k-1;
flag(k)=t;
ift~=k
p=A(k,:); A(k,:)=A(t,:); A(t,:)=p;
A=[4 2 -3 -1 2 1 0 0 0 0;
8 6 -5 -3 6 5 0 1 0 0;
4 2 -2 -1 3 2 -1 0 3 1;
0 -2 1 5 -1 3 -1 1 9 4 ;
-4 2 6 -1 6 7 -3 3 2 3;
8 6 -8 5 7 17 2 6 -3 5;
0 2 -1 3 -4 2 5 3 0 1;

线性方程组的直接解法实验报告

线性方程组的直接解法实验报告

本科实验报告
课程名称:数值计算方法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();
}
四、实验结果与讨论、心得
讨论、心得:
刚开始调试代码的时候有时候就是很小的错误导致整个程序不能运行,需要我们一步一步慢慢来,经过无数次的检查程序错误的原因,以及在老师的帮助下,完成了这次实验。

这段时间的实验课提高了我的分析问题,解决问题的能力,特别提高了对一个程序的整。

实验报告-解线性方程组参考模板

实验报告-解线性方程组参考模板
福州大学数学与计算机科学学院
计算机上机实验报告
专业和班级
数理综合班
姓名
王琪
成绩
学号
031201326
课程名称
数值计算方法
实验名称
解线性方程组的直接法







实验目的
本实验主要涉及用直接法求解线性方程组问题以及解线性方程组的迭代法法中的雅克比迭代法和高斯-赛德尔迭代法。
通过本实验可以使同学们更深入地理解这些数值方法的基本原理,并通过程序设计使同学们初步领会到数值计算方法与计算机程序设计的密切相关;
3.运用雅克比和高斯迭代法、SOR法解1-2个线性方程组。并将结果截图。





2高斯消去法
列主高斯消去法
3高斯消去法
雅可比
SOR法
友情提示:范文可能无法思考和涵盖全面,供参考!最好找专业人士起草或审核后使用,感谢您的下载!
实验基本要求
1.将调试好的程序解决一两组实验数据。
2.Matlab现成函数的使用。
3.分析数值结果



容和Biblioteka 步骤实验的主要内容
1.用给出的高斯消去法算法程序解决一到两个线性方程组求解的问题。并给出问题和结果,用图形表示(可以截图说明)。
2.设计列主元高斯消去法。将其与1的程序结果进行比较得出结论。
分别用顺序高斯消去法和列主高斯消去法解方程组a*x=d,并比较a=[0 1 2 3;9 11 23 34;62.5 23.4 15.5 17.2;192.01 124 25.1 59.3] d=[1;1;1;1]
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

解线性方程组的直接方法实验报告
解线性方程组的直接方法实验报告
1.实验目的:
1、通过该课题的实验,体会模块化结构程序设计方法的优点;
2、运用所学的计算方法,解决各类线性方程组的直接算法;
3、提高分析和解决问题的能力,做到学以致用;
4、通过三对角形线性方程组的解法,体会稀疏线性方程组解法的特点。

2.实验过程:
实验代码:
#include "stdio.h"
#include "math.h"
#include
using 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++){。

相关文档
最新文档