一、问题提出
给出下列几个不同类型的线性方程组,请用适当的算法计算其解。
1、设线性方程组
10
4 2 -3 -1 2 1 0 0 0 0 5
8 6 -5 -3 6 5 0 1 0 0 12
4 2 -2 -1 3 2 -1 0 3 1 3
0 -2 1 5 -1 3 -1 1 9 4 2
-4 2 6 -1 6 7 -3 3 2 3 3
8 6 -8 5 7 17 2 6 -3 5 46
0 2 -1 3 -4 2 5 3 0 1 13
16 10 -11 -9 17 34 2 -1 2 2 38
4 6 2 -7 13 9 2 0 12 4 19
0 0 -1 8 -3 -24 -8 6 3 -1 -21
二、要求
1、对上述三个方程组分别用Gauss顺序消元法与Gauss列主元消元法:平方根法与改进平方根法:追赶法求解(选择其一);
2、应用结构程序设计编出通用程序;
3、比较计算结果、分析数值解误差的原因;
4、尽可能利用相应模板输出系数矩阵的三角分解式;
三、目的和意义
1、通过该课题的实验,体会模板化结构程序设计方法的优点;
2、通过所学的计算方法,解决各类线性方程组的直接算法;
3,提高分析和解决问题的能力,做到学以致用;
4,通过三对角线性方程组的解法,体会稀疏线性方程组解法的特点;
四、代码实现
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=100;
int n,i,j,k=1;
double a[maxn][maxn],b[maxn],sum;
int main()
{
freopen("in.txt","r",stdin);
cin>>n;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
cin>>a[i][j];
cin>>b[i];
}
for(int k=1; k<=n; k++)
{
for(j=k+1; j<=n; j++) a[k][j]=a[k][j]/a[k][k]; //系数化为1
b[k]=b[k]/a[k][k];
for(i=k+1; i<=n; i++) //消元
{
for(j=k+1; j<=n; j++)
a[i][j]-=a[i][k]*a[k][j];
b[i]-=a[i][k]*b[k];
}
}
for(i=n-1; i>=1; i--) //求值
{
sum=0;
for(j=i+1; j<=n; j++)
sum+=a[i][j]*b[j];
b[i]-=sum;
}
for(i=1; i<=n; i++)
printf("b[%2d]=%lf\n",i,b[i]);
return 0;
}