您的位置:首页 > 编程语言 > C语言/C++

【刘庆源码共享】稀疏线性系统求解算法 之 高斯-塞德尔算法(Gauss_Seide)GS类定义(C++)

2010-11-14 00:46 411 查看
/*
* Copyright (c) 2009 湖南师范大学数计院 一心飞翔项目组
* All Right Reserved
*
* 文件名:matrix.h
* 摘 要:定义矩阵类,包括矩阵的相关信息和方法
*
* 作 者:刘 庆
*
*/

#include <math.h>
#include <iostream>
#include <time.h>
#include "Gauss_Seide.h"

using namespace std;

/* 打开文件,三个参数分别为:文件名、指向文件的指针、打开的模式 */
void GS::OpenHFile(char* fileName, FILE** filePointer,const char* r){
if((*filePointer = fopen(fileName, r)) == NULL )
{
cout<<fileName<<".txt 打开失败!"<<endl;
exit(0);
}
}

/* 替算法所涉及的矩阵赋初始值,所有数据在fileName的文件中 */
void GS::SetMatrixsValue(char* fileName){
EvalFile file = EvalFile(fileName);
file.SetWithSub(A); /* 替系数矩阵赋值 */
file.SetWithoutSub(b); /* 替右端向量赋值 n*1 */

if(A.total_col<A.total_ln){
A.total_col = A.total_ln;
b.PosSetValue(A.total_col-1, 0, 0);
}
if(A.total_col>A.total_ln){
A.PosSetValue(A.total_col-1,0,0);
b.PosSetValue(A.total_col-1,0,0);
}
x = Matrix::GetE(A.total_col); /* 将x的各个值初始化为0 */
A.DisplayAsMatrix("A",1);
x.DisplayAsMatrix("x", 1);
b.DisplayAsMatrix("b", 1);
}

/* A*B、A+B运算中A都会发生变化,B不会 */
Matrix& GS::GSCode(){
double temp = 0, Dispersion = 9999;
Matrix AA, temp_x;
long itrator = 0, pos = 0, pos2 = 0;

do{
temp_x = x;

for(int i=0; i<A.total_ln; i++){
temp = 0;
for(int j=0; j<i; j++){
pos = A.QuickLocate(i,j);
pos2 = x.QuickLocate(j,0);
if(pos!=-1&&pos2!=-1){
temp += A.data[pos].value*x.data[pos2].value;
}
}
for( j++; j<A.total_ln; j++){
pos = A.QuickLocate(i,j);
pos2 = x.QuickLocate(j,0);
if(pos!=-1&&pos2!=-1){
temp += A.data[pos].value*temp_x.data[pos2].value;
}
}
pos = b.QuickLocate(i,0);
if(pos!=-1){
temp -= b.data[pos].value;
}
temp = (temp*(-1))/A.data[i].value;
x.PosSetValue(i,0,temp);
}

AA = A;
AA = AA*x;
AA = AA - b;
AA = AA*(-1);
Dispersion = AA.GetModulus();
cout<<"第 "<<++itrator<<" 次迭代, 误差为: "<<Dispersion<<endl;
}while(Dispersion>_PRECIOUS);

return x;
}

Matrix& GS::ValidateResult(){
return b-A*x;
}

int TOTAL_SPACE = 0;
int MAX_TOTAL_SPACE = 0;

void main(){
clock_t start, finsh;
start = clock();
{
GS gs;
gs.SetMatrixsValue("../matrixDatas.txt");
gs.GSCode().OutFile("result.txt");
gs.ValidateResult().OutFile("validate.txt");
}
finsh = clock();
double totalTime = (double)(finsh-start)/CLOCKS_PER_SEC;
cout<<"程序的运行时间为: "<<totalTime<<"s"<<endl;
cout<<"程序最大开销:"<<MAX_TOTAL_SPACE/1024.0<<"kb"<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐