使用迭代法(雅可比Jacobi与高斯-赛德尔Gausss-Seidel迭代法)和直接求解法(消元法)求解线性方程组(C++)

本文详细介绍了如何使用雅可比迭代法(Jacobi)、Gauss-Seidel迭代法和高斯消元法求解线性方程组,并通过代码展示了三种方法的实现过程,确保误差在千万分之一以内。通过实例演示了这些算法在解决实际问题中的应用和精度控制。
摘要由CSDN通过智能技术生成

分别使用迭代法(Jacobi与Gausss-Seidel迭代法)和直接求解法(消元法)求解线性方程组:

\begin{cases} & \text7.2x_{1}+2.3x_{2} -4.4x_{3}+0.5x_{4}=15.1\\ & \text1.3x_{1}+6.3x_{2} -3.5x_{3}+2.8x_{4}=1.8 \\ & \text5.6x_{1}+0.9x_{2} +8.1x_{3}-1.3x_{4}=16.6 \\ & \text1.5x_{1}+0.4x_{2} +3.7x_{3}+5.9x_{4}=36.9 \end{cases}

要求:使误差不超过\varepsilon =10^{-7}

目录

一、雅可比迭代(Jacobi)

二、高斯-赛德尔(Gausss-Seidel)迭代

三、高斯消去法(顺序高斯消去法)

一、雅可比迭代(Jacobi)

  • 迭代公式:

x_{i}^{(k+1)}=\frac{1}{a_{ii}}\left ( b_{i}-\sum_{j=1}^{i-1}a_{ij}x_{j}^{(k)}-\sum_{j=i+1}^{n}a_{ij}x_{j}^{(k)} \right ),i=1,2,\cdots ,n

  • 代码:
#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)迭代

  • 迭代公式:

x_{i}^{(k+1)}=\frac{1}{a_{ii}}\left ( b_{i}-\sum_{j=1}^{i-1}a_{ij}x_{j}^{(k+1)}-\sum_{j=i+1}^{n}a_{ij}x_{j}^{(k)} \right ),i=1,2,\cdots ,n

  • 代码:
#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)消元过程:

a_{kk}^{(k)}\neq 0,对k=1,2,\cdots ,n-1计算

\begin{cases} &m_{ik}=a_{ik}^{(k)}/a_{kk}^{(k)} \\ &a_{ij}^{(k+1)}=a_{ij}^{(k)}-m_{ik}a_{kj}^{(k)} \\ &b_{i}^{(k+1)}=b_{i}^{(k)}-m_{ik}b_{k}^{(k)} \end{cases}\;\;\;\; i,j=k+1,k+2,\cdots ,n

2)回代过程:

\begin{cases} &x_{n}=b_{n}^{(n)}/a_{nn}^{(n)} \\ &x_{i}=\left ( b_{i}^{(i)}-\sum_{j=i+1}^{n}a_{ij}^{(i)}x_{j} \right )/a_{ii}^{(i)} \end{cases}\; \; \; \; i=n-1,\cdots ,2,1

代码:

#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]);//输出结果 
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

画圆儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值