//********************以下是接口程序****************************************
#include<iostream>
#include"sor.h"
using namespace std;
void gs::jiekou(double x)
{ double u1=x;
//**********通过以下的get函数得到方阵的系数和b向量以及初始化x向量********
get();
//***********通过以下的out_a_and_b函数输出系数矩阵和b向量****************
out_a_and_b();
//***********通过以下的out_x函数输出初始化x向量**************************
out_x();
cout<<endl;
//***********通过以下的yunsuan函数求出x向量的值**************************
yunsuan(u1);
}
//**************************************************************************
//*******************以下是gs类的各种成员函数的实现*************************
#include<iostream>
#include<fstream>
#include<iomanip>
#include"sor.h"
using namespace std;
//****************以下是gs类的构造函数******************
gs::gs(int n1,double w1)
{ n=n1;
x=new double [n]; //生成一个动态一维数组
b=new double [n]; //生成一个动态一维数组
int v=n*n;
a=new double [v]; /*生成一个动态一维数组,它在物理存储方面是一维数组,但在使用时是逻辑上的二维数组使用,所以它表示的是二维的系数矩阵。*/
w=w1; //给松弛因子赋值。
}
//*******************************************************
//****************以下是gs类的析构函数******************
gs::~gs()
{ delete x;
delete b;
delete a;
}
//*******************************************************************
//*****************以下是get函数的实现部分***************************
void gs::get()
{ cout<<"按行的顺序输入矩阵的系数和b的值!"<<endl;
//以下两个循环给系数矩阵a和向量b赋值以及初始化向量x
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){ cout<<" ";
cin>>a[i*n+j]; }
cout<<" ";
cin>>b[i];
x[i]=0;
cout<<endl; }
}
//*******************************************************************
//*****************以下是out_a_and_b函数的实现部分********************
void gs::out_a_and_b()
{ cout<<"按行的顺序输出矩阵的系数和b的值!"<<endl;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){ cout<<setw(8)<<a[i*n+j];
ofstream ofile("sor1.txt",ios::app);
ofile<<setw(8)<<a[i*n+j]; }
ofstream ofile1("sor1.txt",ios::app);
ofile1<<endl;
cout<<setw(8)<<b[i]<<endl;
ofstream ofile("sor2.txt",ios::app);
ofile<<setw(8)<<b[i]<<endl;
}
}
//************************************************************************
//*****************以下是out_x函数的实现部分****************************
void gs::out_x()
{ cout<<"输出 x 向量的数据如下: "<<endl;
for(int i=0;i<n;i++){ cout<<setw(8)<<x[i];
ofstream ofile("sor3.txt",ios::app);
ofile<<setw(8)<<x[i];
}
cout<<endl;
}
//****************************************************************************
//****************以下是SOR算法的实现部分******************************
#include<iostream>
#include<math.h>
#include<fstream>
#include<iomanip>
//#include <stdlib.h>
#include"sor.h"
using namespace std;
void gs::yunsuan(double u)
{
for(int k=0; ;k++){ double fabsx=0; //这里k是指的迭代的次数
for(int i=0;i<n;i++){ double c=0;
double XI=x[i];
for(int j=0;j<n;j++) c+=a[i*n+j]*x[j];/*这里必须先求出然后代入下面的式子中去*/
x[i]=x[i]+w*(b[i]-c)/a[i*n+i];/*这里求出第i个未知数,然后存入原来的第i个存储空间,当作k+1迭代的数据,然后用于以后的迭代*/
if(fabs(XI-x[i])>fabsx) fabsx=fabs(XI-x[i]);
cout<<setw(15)<<x[i];
ofstream ofile("sor4.txt",ios::app); /*将结果存入 sor4.txt文本文件中*/
ofile <<setw(15)<<x[i];//设置宽度 }
cout<<endl;
ofstream ofile("sor4.txt",ios::app);
ofile <<endl;
if (fabsx<u)break; }
cout<<endl<<"迭代次数 k= "<<k+1<<endl;
ofstream ofile("sor5.txt"); //将迭代次数存入sor5.txt文本文件
ofile<<endl<<"迭代次数k= "<<k+1<<endl;
}
//***********