当前位置:文档之家› 求解线性方程组——超松弛迭代法(c)

求解线性方程组——超松弛迭代法(c)

求解线性方程组——超松弛迭代法
#include <iostream>
#include <cmath>
using namespace std;
float *one_array_malloc(int n); //一维数组分配float **two_array_malloc(int m,int n); //二维数组分配
float matrix_category(float* x,int n);
int main()
{
const int MAX=100;//最大迭代次数
int n,i,j,k;
float** a;
float* x_0; //初始向量
float* x_k; //迭代向量
float precision; //精度
float w; //松弛因子
cout<<"输入精度e:";
cin>>precision;
cout<<endl<<"输入系数矩阵的阶数,N:";
cin>>n;
a=two_array_malloc(n,n+1);
cout<<endl<<"输入增广矩阵的各值:\n";
for(i=0;i<n;i++)
{
for(j=0;j<n+1;j++)
{
cin>>a[i][j];
}
}
x_0=one_array_malloc(n);
cout<<endl<<"输入初始向量:\n";
for(i=0;i<n;i++)
{
cin>>x_0[i];
}
x_k=one_array_malloc(n);
cout<<"输入松弛因子w (1<w<2):\n"; cin>>w;
float temp;
//迭代过程
for(k=0;k<MAX;k++)
{
for(i=0;i<n;i++)
{
temp=0;
for(j=0;j<i;j++)
{
temp=temp+a[i][j]*x_k[j];
}
x_k[i]=a[i][n]-temp;
temp=0;
for(j=i+1;j<n;j++)
{
temp=temp+a[i][j]*x_0[j];
}
x_k[i]=(x_k[i]-temp)/a[i][i];
x_k[i]=(1-w)*x_0[i]+w*x_k[i];
}
//求两解向量的差的范数
for(i=0;i<n;i++)
{
x_0[i]=x_k[i]-x_0[i];
}
if(matrix_category(x_0,n)<precision) {
break;
}
else
{
for(i=0;i<n;i++)
{
x_0[i]=x_k[i];
}
}
}
//输出过程
if(MAX==k)
{
cout<<"迭代不收敛\n";
}
cout<<"迭代次数为:"<<k<<endl;
cout<<"解向量为:\n";
for(i=0;i<n;i++)
{
cout<<"x"<<i<<": "<<x_k[i]<<endl;
}
return 0;
}
float *one_array_malloc(int n) //一维数组分配
{
float *a;
a=(float *)malloc(sizeof(float)*n);
return a;
}
float **two_array_malloc(int m,int n) //二维数组分配{
float **a;
int i;
a=(float **)malloc(m*sizeof(float *));
for (i=0;i<m;i++)
{
a[i]=(float *)malloc(n*sizeof(float));
}
return a;
}
float matrix_category(float* x,int n)
{
int i;
float temp=0;
for(i=0;i<n;i++)
{
temp=temp+fabs(x[i]); }
return temp;
}。

相关主题