⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 liner.cpp

📁 线性迭代法求解矩阵方程的解。包含检验方程组是否满足 迭代条件
💻 CPP
字号:
//沈硕 自动化5班 3004203132

#define N 5//矩阵列数--未知量个数+1
#define M 4//矩阵行数--方程个数
#include <iostream.h>
#include <stdlib.h>
#include <iomanip.h>
class LINE//方程每一行的信息 类
{
private:double line[N];
public:void set_line(double s[])
	   {
		   for(int i=0;i<N;i++)
			   line[i]=s[i];
	   }
	   double ll(int i)
	   {
		   return line[i];
	   }
	double jd(int i)//求绝对值
	   {
		   return line[i]>0?line[i]:-line[i];
	   }
	   int max_check()//求系数最大值 并检验收敛
	   {
		   double max=jd(0);//记录最大值
		   double sum=0;//记录绝对值和
		   int k=0;//记录最大值的下标
		   for(int i=0;i<N-1;i++)//求最大值
		   {
			   sum+=jd(i);
			   if(jd(i)>max)
			   {
			   max=jd(i);
			   k=i;
			   }
		   }
		   sum=sum-max;
		   if(max>sum)return k;
		   else {
			   cout<<"请检验你输入的方程组是否满足收敛条件!"<<endl;
			   cout<<max<<"***"<<sum<<endl;
			   exit(1);
		   }
	   }
	   void print ()//格式化输出方程的矩阵
	   {
		   for(int i=0;i<N;i++)
			   cout<<" "<<setw(6)<<line[i];
		   cout<<endl;
	   }
	   void one()//归一 变换函数
	   {
		   int k=max_check(),i;
		   double p=line[k];
		   for (i=0;i<N;i++)
			   line[i]/=p;
		   for ( i=0;i<N-1;i++)
		   {
			   if(i==k)continue;
			   line[i]=-line[i];
		   }
	   }
};
class JUZ//方程组 类
{
private:LINE *zhen[M];
		double key[M];//解
		int num;//迭代次数
public:void set_zhen(LINE s[])
	   {
		   for(int i=0;i<M;i++)
		   {
			   zhen[i]=&s[i];
		   }
	   }
	   void set_key(double a[])
	   {
		   for(int i=0;i<M;i++)
		   {
			   key[i]=a[i];
			   cout<<" "<<setw(6)<<key[i];
		   }
		   cout<<endl;
	   }

	   void set_num(int n)
	   {
		   num=n;
	   }
	   void Check()
		   //检验方程组是否满足 迭代条件
		   //归一后每行变量不同
	   {
		   int a[M],i;
		   for(i=0;i<M;i++)a[i]=-1;
		   for(i=0;i<M;i++)
		   {
			   int k=zhen[i]->max_check();
			   if(a[i]>=0){
				   cout<<"请检验你输入的方程组!"<<endl;
				   exit(1);
			   }
			   else a[i]=k;
		   }
	   }
	   void diedai()//迭代
	   {
		   int i,kk[M];
		   for(i=0;i<M;i++)
			   kk[i]=zhen[i]->max_check();//每行解的下标
		   for(i=0;i<M;i++)//归一
			   zhen[i]->one();
		   for(i=0;i<num;i++)
		   {
			   for(int t=0;t<M;t++)
			   {
				   int k=kk[t];
				   double s=0;
				   for(int j=0;j<N-1;j++)
					   s+=key[j]*(zhen[t]->ll(j));
				   s=s-key[k]+(zhen[t]->ll(N-1));
				   key[k]=s;
			   }
		   }
	   }
	   void jz_print()
	   {
		   for(int j=0;j<M;j++)
			   zhen[j]->print();
		   
	   }
	   void key_print()
	   {
		   cout<<"方程经过"<<num<<"次迭代后的解:"<<endl;
		   for(int i=0;i<M;i++)
			   cout<<" "<<setw(6)<<key[i];
		   cout<<endl;
	   }

};


	   
void main()
{
	cout<<"homework of 沈硕 自动化5班 学号3004203132"<<endl;
	double ff[M][N]={{2,-1,10,0,-11},
	{0,3,-1,8,-11},{10,-1,2,0,6},{-1,11,-1,3,25}};//方程矩阵
	//用第一题作事例,解第二题时改变M,N,ff[][],内容即可
	LINE s[M];
	for(int i=0;i<M;i++)
		s[i].set_line (ff[i]);

	JUZ aa;
	aa.set_zhen (s);
	aa.Check ();
	aa.jz_print ();
	double k[M]={0,0,0,0};//出始解
    cout<<"初始迭代解:"<<endl;
	aa.set_key (k);
    aa.set_num (100);//迭代次数
	aa.diedai ();
	aa.key_print ();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -