📄 liner.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 + -