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

/*
 * 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值