c++课程设计3-6 迭代法求线性方程

更新时间:2024-05-09 16:56:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

/*第6题 高斯-赛德尔迭代法--源代码及关键源代码注解如下:*/ /******************************************* * Class Matrix * *******************************************/ #include #include #include #include #include #define MAX 10 class Csimple {

friend void operator<<(ostream &,Csimple &); friend void operator>>(istream &,Csimple &); protected: int flag;

int row,column;

//'mat' is my actual matrix double **mat;

//size of 'variable' always =(column-1) int varnum;

//contains the solution set double *variable;

//counts number of iterations int itercount;

//performs a single iteration on all the equations //the argument is the relaxation coefficient double realx;

void iteration(double,double *); //checks the allowable error

bool epsilon(double*,double*,int,double); public:

Csimple(int nRow,int nColumn,double rex,double Mat[MAX][MAX+1]); Csimple();

Csimple(int,int);

//small funtion for asking the user for the number of rows and columns void ReadFromFile(); void WriteToFile();

static void initialize(int&,int&); //prepares function for reduction void rearrange();

//solves by gauss-seigel method,

//perfomes multiple iterations until a solution is found

//the argument is the relaxation-coefficient, and this is \

void solve(double); //prints the solution void show_answer(); };

//END OF CLASS MATRIX /************************** * constructor--构造函数 * **************************/ Csimple::Csimple(int nRow,int nColumn,double Mat[MAX][MAX+1]):row(nRow),column(nColumn),realx(rex) { mat=new double*[row]; for(int i=0;i

Csimple::Csimple(){ mat[MAX][MAX+1]; flag=0; }

Csimple::Csimple(int r, int c):row(r),column(c) {

//creates my matrix dynamically, but there are still no values in the positions mat=new double*[row]; for(int i=0;i

//end of constructor

/********************************* * 矩阵行列设置 * ROWS:线性方程数

* COLUMNS:系数及常数的个数 *********************************/ /********************************* * static initialization *

*********************************/ void Csimple::initialize(int&i,int&j) {

cout<<\

rex,double

cin>>i;

cout<<\cin>>j; }

//clrscr();

/********************************* * 简单矩阵变换函数 *

* rearrange function * *********************************/

//rearranges the system so that it can be solved by gauss-seigel method //must always rearange before solving void Csimple::ReadFromFile() { char str[10][100]; int i=0; ifstream infile(\ while(!infile.eof()) {infile.getline(str[i],100); i++; } row=i; column=i+1; mat=new double*[row]; for(i=0;i

mat[i][j]=-mat[i][j]; } else { for(int q=0;q

}

while(str[i][p]!='=') {

if(str[i][p]=='x') { j=(int)(str[i][p+1]-'0')-1; int k=0; for(k=0;str[i][p-k]!='+'&&str[i][p-k]!='-';k++) {} if(k==1) { if(str[i][p-k]=='+') mat[i][j]=1; else mat[i][j]=-1; } else{ if(str[i][p-k]=='+') for(;k>1;k--) mat[i][j]=mat[i][j]*10+(double)(str[i][p-k+1]-'0'); else{ if(str[i][p-k]=='-') { for(;k>1;k--) mat[i][j]=mat[i][j]*10+(double)(str[i][p-k+1]-'0'); mat[i][j]=-mat[i][j]; } } } } p++;

} if(str[i][p+1]=='-') { for(int m=2;str[i][p+m];m++) mat[i][row]=10*mat[i][row]+(double)(str[i][p+m]-'0'); mat[i][row]=-mat[i][row]; } else { for(int m=1;str[i][p+m];m++) mat[i][row]=10*mat[i][row]+(double)(str[i][p+m]-'0'); } } infile.close(); }

void Csimple::WriteToFile() { ofstream outfile(\解.txt\ outfile<<\用简单迭带法求方程解依次为:\ for(int i=0;i

void Csimple::rearrange() {

varnum=column-1;

//'variable' will contain the solution set

//they will get initialized with the first guess in the 'solve' function variable=new double[varnum];

/*divides all terms by the desired variables (the variable which is being solved for) coefficient*/ for(int i=0;i

double coefficient=mat[i][i]; for(int j=0;j

mat[i][j]/=coefficient; } }

//all variables except the diagonal are being brought to the other side for( i=0;i

{

for(int j=0;j

mat[i][j]*=-1; }

mat[i][i]=0; } }

//END OF 'REARRANGE' FUNCTION /********************************** * iteration funtion--迭代函数 * **********************************/

//performes a single iteration on the system, using passed assumed values void Csimple::iteration(double lambda,double *t) { for(int i=0;i

variable[i]=0;

for(int j=0;j

variable[i]+=mat[i][j]*t[j]; }

variable[i]+=mat[i][column-1]; //new value after relaxation

variable[i]=t[i]+lambda*(variable[i]-t[i]); } }

/******************************** * solve function--求解函数 * ********************************/ void Csimple::solve(double lambda) {

//DECLARATIONS AND INITIALIZATIONS for (int i=0;i

itercount=0;

//this is the allowable error this value can be changed to suit the problem double criterion=0.0001;

double *newest=new double[varnum]; double *last=new double[varnum]; for( i=0;i

{

newest[i]=variable[i]; }

//END OF DECLARATIONS AND INITIALIZATIONS //MAIN BODY OF THE FUNCTION STARTS HERE- //while('condition not met'){perform another iteration} do {

for(int i=0;i

last[i]=newest[i]; }

//this is the most important part,

//everything else in this loop is only to check that the criterion is met if(flag==1){iteration(realx,last);} else iteration(lambda,last); for( i=0;i

/******************************************* * Epsilon Criterion-Epsilon 精度要求 * *******************************************/

bool Csimple::epsilon(double *newest,double *last,int size,double criterion) { for(int i=0;i

//if(it has not met the criterion)

if((fabs(newest[i]-last[i])/newest[i])>criterion) {

//then (return 1)=(condition not met) and the loop is repeated return 1; } }

//criterion has been met return 0; }

/************************************************ * show answer function-- 输出求解结果函数 *

*************************************************/ //'solve' function must be executed before 'show_answer' function void Csimple::show_answer() { cout<<\ for(int i=0;i

cout<

/*********************************************************** * stream operators--矩阵输入、输出流重载函数 * ***********************************************************/ void operator<<(ostream& out,Csimple& m) {

for (int i=0;i

out<

void operator>>(istream& in,Csimple& m) {

for(int i=0;i

for(int j=0;j

cout<<\ in>>m.mat[i][j]; } } //clrscr(); }

class matrix //高斯-赛德尔矩阵算法类 {

friend void operator<<(ostream &,matrix &); friend void operator>>(istream &,matrix &); protected: int flag;

int row,column;

//'mat' is my actual matrix double **mat;

//size of 'variable' always =(column-1) int varnum;

//contains the solution set double *variable;

//counts number of iterations int itercount;

//performs a single iteration on all the equations //the argument is the relaxation coefficient double realx;

void iteration(double);

//checks the allowable error

bool epsilon(double*,double*,int,double); public:

matrix(int nRow,int nColumn,double rex,double Mat[MAX][MAX+1]); matrix();

matrix(int,int);

//small funtion for asking the user for the number of rows and columns void ReadFromFile(); void WriteToFile();

static void initialize(int&,int&); //prepares function for reduction void rearrange();

//solves by gauss-seigel method,

//perfomes multiple iterations until a solution is found

//the argument is the relaxation-coefficient, and this is \void solve(double); //prints the solution void show_answer(); };

//END OF CLASS MATRIX /************************** * constructor--构造函数 * **************************/ matrix::matrix(int nRow,int nColumn,double Mat[MAX][MAX+1]):row(nRow),column(nColumn),realx(rex) { mat=new double*[row]; for(int i=0;i

rex,double

matrix::matrix(){ mat[MAX][MAX+1]; flag=0; }

matrix::matrix(int r, int c):row(r),column(c) {

//creates my matrix dynamically, but there are still no values in the positions mat=new double*[row]; for(int i=0;i

//end of constructor

/********************************* * 矩阵行列设置 * ROWS:线性方程数

* COLUMNS:系数及常数的个数 *********************************/ /********************************* * static initialization *

*********************************/ void matrix::initialize(int&i,int&j) {

cout<<\cin>>i;

cout<<\cin>>j; }

void matrix::ReadFromFile() { char str[10][100]; int i=0; ifstream infile(\ while(!infile.eof()) {infile.getline(str[i],100); i++; } row=i; column=i+1; mat=new double*[row]; for(i=0;i

}

for(i=0;i

}

while(str[i][p]!='=') {

if(str[i][p]=='x') { j=(int)(str[i][p+1]-'0')-1; int k=0; for(k=0;str[i][p-k]!='+'&&str[i][p-k]!='-';k++){} if(k==1) { if(str[i][p-k]=='+') mat[i][j]=1;

else mat[i][j]=-1; } else{ if(str[i][p-k]=='+') for(;k>1;k--) mat[i][j]=mat[i][j]*10+(double)(str[i][p-k+1]-'0'); else{ if(str[i][p-k]=='-') { for(;k>1;k--) mat[i][j]=mat[i][j]*10+(double)(str[i][p-k+1]-'0'); mat[i][j]=-mat[i][j]; } } } } p++; } if(str[i][p+1]=='-') { for(int m=2;str[i][p+m];m++) mat[i][row]=10*mat[i][row]+(double)(str[i][p+m]-'0'); mat[i][row]=-mat[i][row]; } else { for(int m=1;str[i][p+m];m++) mat[i][row]=10*mat[i][row]+(double)(str[i][p+m]-'0'); } } infile.close(); }

void matrix::WriteToFile() { ofstream outfile(\解.txt\ outfile<<\用高斯-赛德尔迭带法求方程解为:\ for(int i=0;i

//clrscr();

/********************************* * 高斯-赛德尔矩阵变换函数 * * rearrange function * *********************************/

//rearranges the system so that it can be solved by gauss-seigel method //must always rearange before solving void matrix::rearrange() {

varnum=column-1;

//'variable' will contain the solution set

//they will get initialized with the first guess in the 'solve' function variable=new double[varnum];

/*divides all terms by the desired variables (the variable which is being solved for) coefficient*/ for(int i=0;i

double coefficient=mat[i][i]; for(int j=0;j

mat[i][j]/=coefficient; } }

//all variables except the diagonal are being brought to the other side for( i=0;i

for(int j=0;j

mat[i][j]*=-1; }

mat[i][i]=0; } }

//END OF 'REARRANGE' FUNCTION /********************************** * iteration funtion--迭代函数 * **********************************/

//performes a single iteration on the system, using passed assumed values void matrix::iteration(double lambda) {

//'last' is for the relaxation equation double last; for(int i=0;i

{

last=variable[i]; variable[i]=0;

for(int j=0;j

variable[i]+=mat[i][j]*variable[j]; }

variable[i]+=mat[i][column-1]; //new value after relaxation

variable[i]=last+lambda*(variable[i]-last); } }

/******************************** * solve function--求解函数 * ********************************/ void matrix::solve(double lambda) {

//DECLARATIONS AND INITIALIZATIONS //initializes first guess for (int i=0;i

itercount=0;

//this is the allowable error this value can be changed to suit the problem double criterion=0.0001;

double *newest=new double[varnum]; double *last=new double[varnum]; for( i=0;i

newest[i]=variable[i]; }

//END OF DECLARATIONS AND INITIALIZATIONS //MAIN BODY OF THE FUNCTION STARTS HERE- //while('condition not met'){perform another iteration} do {

for(int i=0;i

last[i]=newest[i]; }

//this is the most important part,

//everything else in this loop is only to check that the criterion is met

if(flag==1){iteration(realx);} else iteration(lambda); for( i=0;i

/******************************************* * Epsilon Criterion-Epsilon 精度要求 * *******************************************/

bool matrix::epsilon(double *newest,double *last,int size,double criterion) { for(int i=0;i

//if(it has not met the criterion)

if((fabs(newest[i]-last[i])/newest[i])>criterion) {

//then (return 1)=(condition not met) and the loop is repeated return 1; } }

//criterion has been met return 0; }

/************************************************ * show answer function-- 输出求解结果函数 * *************************************************/ //'solve' function must be executed before 'show_answer' function void matrix::show_answer() { cout<<\ for(int i=0;i

cout<

/*********************************************************** * stream operators--矩阵输入、输出流重载函数 * ***********************************************************/

void operator<<(ostream& out,matrix& m) {

for (int i=0;i

out<

void operator>>(istream& in,matrix& m) {

for(int i=0;i

for(int j=0;j

cout<<\ in>>m.mat[i][j]; } } //clrscr(); }

//end of stream operators

/************************ * MAIN * ************************/ void main() { cout<<\ cout<<\学号:******\ cout<<\ char Y; cout<<\you want to input from keyboard,press 1,if you want to input from file,press 2\ cin>>Y; if(Y=='2'){ matrix one; Csimple two; one.ReadFromFile(); two.ReadFromFile(); char X; cout<<\ cin>>X;

if(X=='y'){cout<

for(char x='y';x=='y' && x!='n';) {

cout<\cin>>relax_coef; int flag=1; while(flag) { if(relax_coef<0||relax_coef>2) { cout<<\,input again\ cin>>relax_coef; continue;} if(relax_coef==1) { cout<<\ cin>>relax_coef; continue;} flag=0; }

one.solve(relax_coef); two.solve(relax_coef); one.show_answer(); two.show_answer(); one.WriteToFile(); two.WriteToFile();

cout<<\已经存放到解文件中\

cout<>x; }

cout<<\}

else if(Y=='1') { int i,j;

matrix::initialize(i,j); Csimple::initialize(i,j); matrix one(i,j); Csimple two(i,j); cin>>one; cin>>two; char X;

cout<<\ cin>>X; if(X=='y'){cout<\ cin>>relax_coef; int flag=1; while(flag) { if(relax_coef<0||relax_coef>2) { cout<<\,input again\ cin>>relax_coef; continue;} if(relax_coef==1) { cout<<\ cin>>relax_coef; continue;} flag=0; } one.solve(relax_coef); two.solve(relax_coef); one.show_answer(); two.show_answer(); cout<>x; } cout<<\ }

cin.ignore(128,'\\n'); cin.ignore(128,'\\n'); }

方程为x1-x2=1 -x1+2x2+2x3=1

x1+x2-x3=0保存在a.txt中 结果在解.Txt显示

本文来源:https://www.bwwdw.com/article/fs8g.html

Top