📄 wyr.cpp
字号:
//第三章逐次超松弛迭代法
//王玉荣051791,B组。
#include<iostream.h>
#include<math.h>
int n=9; //方程组的维数
double limit;
double b[9]={-15,27,-23,0,-20,12,-7,7,10};
double max(double a,double b)
{
if(a>b)
{
return a;
}
else
{
return b;
}
}
void func(double a[9][9])
{
double Rn=2*limit;
double rk,value,w;
int p;
int bestp=1; //迭代过程中要用到的递增变量
int k;
int mink; //k用来保存本次松弛因子对应的迭代次数,mink用来保存最优迭代次数
double x[20];
double A; //中间变量,用于计算中间出现的复杂变量和
double bestx[20];
int i;
double aii;
for(p=0;p<99;p++)
{
w=(double)(p+1)/50.0;
k=0;
Rn=2*limit;
for(i=0;i<n;i++) //迭代向量初始化为0矩阵
x[i]=0.0;
while(Rn>limit)
{
for(int i=0;i<n;i++) //执行一次变换xi
{
A=0.0;
for(int j=0;j<n;j++)
{
if(j!=i)
{
A+=a[i][j]*x[j];
}
}
value=x[i];
aii=1.0/a[i][i];
x[i]=(1-w)*x[i]+w*(b[i]-A)*aii;
if(i==0)
{
Rn=fabs(x[i]-value);
}
else
{
rk=fabs(x[i]-value);
Rn=max(rk,Rn);
}
}
k++;
}
if(p==0)
{
mink=k;
}
else
{
if(k<mink)
{
for(i=0;i<n;i++)
bestx[i]=x[i];
mink =k;
bestp =p+1; //记录最佳的p
}
}
cout<<"松弛因子w"<<(p+1)<<"="<<(p+1)/50.0<<"时,迭代次数k="<<k;
if(!(p%2))
cout<<'\t';
else
cout<<'\n';
}
cout<<"\n最佳松弛因子w="<<bestp/50.0<<";\n";
cout<<"对应的迭代次数为"<<mink<<'\n';
cout<<"解向量是:"<<'\n';
for(i=0;i<n;i++)
{
cout<<"x("<<(i+1)<<")="<<bestx[i]<<'\t';
}
cout<<'\n';
}
void main(void)
{
double a1[9][9]={{31,-13,0,0,0,-10,0,0,0},{-13,35,-9,0,-11,0,0,0,0},{0,-9,31,-10,0,0,0,0,0},{0,0,-10,79,-30,0,0,0,-9},{0,0,0,-30,57,-7,0,-5,0},{0,0,0,0,-7,47,-30,0,0},{0,0,0,0,0,-30,41,0,0},{0,0,0,0,-5,0,0,27,-2},{0,0,0,-9,0,0,0,-2,29}};
cout<<"***********数值分析第三章逐次超松弛迭代法解方程组的计算***********\n";
cout<<"请输入容许误差:";
cin>>limit;
func(a1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -