数值计算实验报告
数值计算实验报告
实验题目
2.5 (a)用单精度Gauss消去法求解方程Ax=b,其中
(b)计算残差r=b-Ax
实验目的
练习用LU分解、前代、回代函数、部分列主元求解线性方程组
编程环境
采用java实现
实验内容(算法、程序、步骤和方法)
算法:对于线性方程组Ax=b,可以写成LUx=b,令y=Ux,因而可以先用前代法解下三角方程组Ly=b,然后用回代法解上三角方程组Ux=y。
for k=1 to n-1 {列循环}
if a[kk]=0,then stop {如果主元为0,停止}
继续下一个k
for i=k+1 to n {计算当前列的乘数}
m[ik]=a[ik]/a[kk]
end
for j=k+1 to n
for j=k+1 to n
a[ij]=a[ij]-m[ik]a[ik] {对剩余的子矩阵进行变换}
}
System.out.println();
}
for(intk = 0; k<n; k++){
h[k][k] = (float)Math.sqrt(h[k][k]);
for(inti=k+1; i<n; i++)
h[i][k]=h[i][k]/h[k][k];
for(intj=k+1; j<n; j++)
if(s.length()<8)
System.out.print(h[i][j] +"\t"+"\t");
else
System.out.print(h[i][j] +"\t");
}
System.out.println();
}
}
}Hale Waihona Puke 步骤和方法:采用的是高斯消去法进行LU分解
(1)对于线性方程组Ax=b,可以写成LUx=b,
end
end
end
程序:
importjava.util.Scanner;
publicclassb {
publicstaticvoidmain(String[] args) {
System.out.println("请输入希尔伯特矩阵的阶");
Scanner scan =newScanner(System.in);
for(inti = 0; i< n; i++ ){
for(intj = 0; j< n; j++ ){
String s =""+h[i][j];
if(s.length()<8)
System.out.print(h[i][j] +"\t"+"\t");
else
System.out.print(h[i][j] +"\t");
(2)令y=Ux,用前代法解下三角方程组Ly=b,
(3)用回代法解上三角方程组Ux=y。
计算结果
(数字或图形)
计算结果如下图:
分析与
结 论
分析与结论:
(1)利用高斯消去法进行LU分解,可以将前代与回代与矩阵的LU分解分开使用,LU分解中的L和U可以用来解其他的系数矩阵相同的而右端量不同的方程组,从而避免了重新对A做LU分解。
for(int i = 0; i< n; i++ ){
for(int j = 0; j< n; j++ ){
Scanner s = new Scanner(System.in);
float g = s.nextFloat();
h[i][j] = g;
}
}*/
System.out.println("输出原矩阵");
intn = scan.nextInt();
floath[][] =newfloat[n][n];
for(inti = 0; i<n; i++)
for(intj = 0; j<n; j++)
h[i][j] = (float)1/(i+j+1);
/*System.out.println("请依次输入方程组系数矩阵的各项");
for(inti=k+1; i<n; i++)
h[i][j]=h[i][j]-h[i][k]*h[i][k];
}
//输出矩阵
System.out.println("输出LU分解矩阵");
for(inti = 0; i< n; i++ ){
for(intj = 0; j< n; j++ ){
String s =""+h[i][j];
(2)利用残差r=b-Ax,求解方程组Az=r,可以得到改进的解x+z。
指导老师评 议
成绩评定: 指导教师签名: