分别使用迭代法(Jacobi与Gausss-Seidel迭代法)和直接求解法(消元法)求解线性方程组:
要求:使误差不超过。
目录
一、雅可比迭代(Jacobi)
- 迭代公式:
- 代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n=4;
double A[4][4]={7.2,2.3,-4.4,0.5,
1.3,6.3,-3.5,2.8,
5.6,0.9,8.1,-1.3,
1.5,0.4,3.7,5.9};//定义系数矩阵
double B[4]={15.1,1.8,16.6,36.9};//定义行数列矩阵
double X0[4]={0};//定义迭代初值
double e=pow(10,-8);//定义精度
double C[4][5];//定义迭代公式中的各项系数矩阵
double X[4];//定义结果数组
void Jacobi();//定义雅可比函数
void Matrix();//定义求迭代公式中的各项系数矩阵的函数
bool Accuracy(double x1,double x2,double x3,double x4);//定义判断是否满足精度的函数
void output();//定义输出函数
int main()
{
Matrix();//求迭代公式中的各项系数矩阵的函数
cout<<"雅可比迭代:"<<endl;
Jacobi();//雅可比函数
cout<<"结果:"<<endl;
output();//输出函数
return 0;
}
void Jacobi()//雅可比函数
{
double x1=X0[0],x2=X0[1],x3=X0[2],x4=X0[3];//定义方程组的四个解并把迭代初值付给4个解
int i=0,m=0;//定义计数器m
while(true)
{
for(i=0;i<n;i++)//雅各比迭代
X[i]=C[i][0]*x1+C[i][1]*x2+C[i][2]*x3+C[i][3]*x4+C[i][4];
m++;//计数器加一
if(Accuracy(x1,x2,x3,x4)) break;//如果精度满足要求,跳出循环
cout<<"第"<<m<<"次计算:"<<endl;
output(); //输出计算过程
x1=X[0];
x2=X[1];
x3=X[2];
x4=X[3];
}
}
void Matrix()//求迭代公式中的各项系数矩阵的函数
{
int i,j;
for(i=0;i<n;i++)//求迭代各项的系数
for(j=0;j<n;j++)
{
C[i][j]=-A[i][j]/A[i][i];
if(i==j)
C[i][j]=0;
}
for(i=0;i<n;i++)//求常数项的系数
C[i][4]=B[i]/A[i][i];
}
bool Accuracy(double x1,double x2,double x3,double x4)//判断是否满足精度的函数
{
int i,m(0);//定义计数器m
if(abs(X[0]-x1)<e) m++;//判断满足精度则计数器加一
if(abs(X[1]-x2)<e) m++;
if(abs(X[2]-x3)<e) m++;
if(abs(X[3]-x4)<e) m++;
if(m==4) return 1;//如果4个都满足要求则返回真值
else return 0;//否则返回假值
}
void output()//定义输出函数
{
int i;
for(i=0;i<n;i++)
{
printf("x%d=%-12.7lf",i+1,X[i]);//输出函数
if(i==1||i==3) cout<<endl;//每隔两个换行保持页面整齐
}
}
二、高斯-赛德尔(Gausss-Seidel)迭代
- 迭代公式:
- 代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n=4;
double A[4][4]={7.2,2.3,-4.4,0.5,
1.3,6.3,-3.5,2.8,
5.6,0.9,8.1,-1.3,
1.5,0.4,3.7,5.9};//定义系数矩阵
double B[4]={15.1,1.8,16.6,36.9};//定义行数列矩阵
double X0[4]={0};//定义迭代初值
double e=pow(10,-8);//定义精度
double C[4][5];//定义迭代公式中的各项系数矩阵
double X[4];//定义结果数组
void Gauss();//定义高斯-赛德尔函数
void Matrix();//定义求迭代公式中的各项系数矩阵的函数
bool Accuracy(double x1,double x2,double x3,double x4);//定义判断是否满足精度的函数
void output();//定义输出函数
int main()
{
Matrix();//求迭代公式中的各项系数矩阵的函数
cout<<"高斯-赛德尔迭代:"<<endl;
Gauss();//高斯-赛德尔函数
cout<<"结果:"<<endl;
output();//输出函数
return 0;
}
void Gauss()//高斯-赛德尔函数
{
double x1=X0[0],x2=X0[1],x3=X0[2],x4=X0[3];//定义方程组的四个解并把迭代初值付给4个解
int i=0,m=0;//定义计数器m
while(true)
{
for(i=0;i<n;i++)//高斯-赛德尔迭代
{
X[i]=C[i][0]*x1+C[i][1]*x2+C[i][2]*x3+C[i][3]*x4+C[i][4];
if(Accuracy(x1,x2,x3,x4)) return;//如果精度满足要求,跳出循环
x1=X[0];//更新新 结果
x2=X[1];
x3=X[2];
x4=X[3];
}
m++;//计数器加一
cout<<"第"<<m<<"次计算:"<<endl;
output(); //输出计算过程
}
return;
}
void Matrix()//求迭代公式中的各项系数矩阵的函数
{
int i,j;
for(i=0;i<n;i++)//求迭代各项的系数
for(j=0;j<n;j++)
{
C[i][j]=-A[i][j]/A[i][i];
if(i==j)
C[i][j]=0;
}
for(i=0;i<n;i++)//求常数项的系数
C[i][4]=B[i]/A[i][i];
}
bool Accuracy(double x1,double x2,double x3,double x4)//判断是否满足精度的函数
{
int i,m(0);//定义计数器m
if(abs(X[0]-x1)<e) m++;//判断满足精度则计数器加一
if(abs(X[1]-x2)<e) m++;
if(abs(X[2]-x3)<e) m++;
if(abs(X[3]-x4)<e) m++;
if(m==4) return 1;//如果4个都满足要求则返回真值
else return 0;//否则返回假值
}
void output()//定义输出函数
{
int i;
for(i=0;i<n;i++)
{
printf("x%d=%-12.7lf",i+1,X[i]);//输出函数
if(i==1||i==3) cout<<endl;//每隔两个换行保持页面整齐
}
}
三、高斯消去法(顺序高斯消去法)
- 计算步骤:
1)消元过程:
设,对计算
2)回代过程:
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n=4;
double A[4][5]={7.2,2.3,-4.4,0.5,15.1,
1.3,6.3,-3.5,2.8,1.8,
5.6,0.9,8.1,-1.3,16.6,
1.5,0.4,3.7,5.9,36.9};//定义矩阵数组
double Ans[4]={0}; //定义答案数组
void Elimination();//消元法
void output();//定义输出函数
int main()
{
cout<<"消元法:"<<endl;
Elimination();//消元法
output();//输出答案
return 0;
}
void Elimination()//消元法
{
int i,j,k;
for(k=0;k<n-1;k++)
for(i=k+1;i<n;i++)
for(j=n;j>=0;j--)
A[i][j]+=-A[i][k]/A[k][k]*A[k][j];//消元过程
for(i=n-1;i>=0;i--)//回代过程
{
Ans[i]=A[i][n]/A[i][i];
for(j=n-1;j>=0;j--)
if(i!=j)
Ans[i]+=-A[i][j]/A[i][i]*Ans[j];
}
}
void output()//输出函数
{
int i;
cout<<"结果为:"<<endl;
for(i=0;i<n;i++)
printf("x%d=%-12.7lf",i+1,Ans[i]);//输出结果
}