• PUDN用户
    了解作者
  • Visual C++
    开发工具
  • 271KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 101
    下载次数
  • 2006-07-02 07:55
    上传日期
计算方法 用高斯消元法解方程组,源代码以及注释 注释在源代码中
gaosixiaoyuan.rar
  • 1
  • Debug
  • 1.dsw
    525B
  • 1.plg
    852B
  • 1.opt
    52.5KB
  • 1.dsp
    4.1KB
  • 1.cpp
    5.9KB
  • 1.ncb
    49KB
  • www.pudn.com.txt
    218B
内容介绍
#include "iostream.h" #include "stdlib.h" #include "math.h" #include "stdio.h" double* allocMem(int ); //分配内存空间函数 void GaussLineMain(double*,double*,double*,int );//采用高斯列主元素消去法求解x的初始向量值 void Jacobi(double*,double*,double*,double*,int,double*);//利用雅可比迭代公式求解x的值 void main() { short matrixNum; //矩阵A,初始系数矩阵 double *matrixD; //矩阵的行数(列数) double *matrixA; //矩阵D为A中的主对角阵 double *matrixL; //矩阵L为A中的下三角阵 double *matrixU; //矩阵U为A中的上三角阵 double *B; //矩阵B为雅可比方法迭代矩阵 double *f; //矩阵f为中间的过渡的矩阵 double *x; //x为一维数组,存放结果 double *xx; ////一维数组,存放无穷范数,用来求无穷范数的最大值 double *xk; //xk为一维数组,用来在迭代中使用 double *b; //b为一维数组,存放方程组右边系数 int i,j,k; cout<<"请输入矩阵的行数(列数与行数一致):"<<endl; cin>>matrixNum; //分别为A、D、L、U、B、f、x、b分配内存空间 matrixA=allocMem(matrixNum*matrixNum); matrixD=allocMem(matrixNum*matrixNum); matrixL=allocMem(matrixNum*matrixNum); matrixU=allocMem(matrixNum*matrixNum); B=allocMem(matrixNum*matrixNum); f=allocMem(matrixNum); x=allocMem(matrixNum); xx=allocMem(matrixNum); xk=allocMem(matrixNum); b=allocMem(matrixNum); //输入系数矩阵各元素值 cout<<endl<<"请输入矩阵中各元素值(为 "<<matrixNum<<"*" <<matrixNum<<",共计 "<<matrixNum*matrixNum<<" 个元素):"<<endl; for(i=0;i<matrixNum;i++) { cout<<"请输入矩阵中第 "<<i+1<<" 行的 "<<matrixNum<<" 个元素:"<<endl; for(j=0;j<matrixNum;j++) cin>>*(matrixA+i*matrixNum+j); } //输入方程组右边系数b的各元素值 cout<<endl<<"请输入方程组右边系数各元素值,共计 "<<matrixNum<< " 个:"<<endl; for(i=0;i<matrixNum;i++) cin>>*(b+i); /* 下面将A分裂为A=D-L-U */ //首先将D、L、U做初始化工作 for(i=0;i<matrixNum;i++) for(j=0;j<matrixNum;j++) *(matrixD+i*matrixNum+j)=*(matrixL+i*matrixNum+j)=*(matrixU+i*matrixNum+j)=0; //D、L、U分别得到A的主对角线、下三角和上三角;其中D取逆矩阵、L和U各元素取相反数 for(i=0;i<matrixNum;i++) for(j=0;j<matrixNum;j++) if(i==j&&*(matrixA+i*matrixNum+j)) *(matrixD+i*matrixNum+j)=1/(*(matrixA+i*matrixNum+j)); else if(i>j) *(matrixL+i*matrixNum+j)=-*(matrixA+i*matrixNum+j); else *(matrixU+i*matrixNum+j)=-*(matrixA+i*matrixNum+j); //求B矩阵中的元素 for(i=0;i<matrixNum;i++) for(j=0;j<matrixNum;j++) { double temp=0; for(k=0;k<matrixNum;k++) temp+=*(matrixD+i*matrixNum+k)*(*(matrixL+k*matrixNum+j)+*(matrixU+k*matrixNum+j)); *(B+i*matrixNum+j)=temp; } //求f中的元素 for(i=0;i<matrixNum;i++) { double temp=0; for(j=0;j<matrixNum;j++) temp+=*(matrixD+i*matrixNum+j)*(*(b+j)); *(f+i)=temp; } /* 计算x的初始向量值 */ GaussLineMain(matrixA,x,b,matrixNum); /* 利用雅可比迭代公式求解xk的值 */ /*int JacobiTime; cout<<endl<<endl<<endl<<"<<雅可比迭代开始,请输入希望迭代的次数>>:"; cin>>JacobiTime; while(JacobiTime<=0) { cout<<"迭代次数必须大于0,请重新输入:"; cin>>JacobiTime; }*/ Jacobi(x,xk,B,f,matrixNum,xx); //输出线性方程组的解 */ cout<<endl<<endl<<"方程组运算结果为:"<<endl; cout.precision(20); //设置输出精度,以此比较不同迭代次数的结果 for(i=0;i<matrixNum;i++) cout<<"x"<<i+1<<" = "<<*(xk+i)<<endl; //cout<<endl<<endl<<"求解过程结束..."<<endl<<endl; //释放掉所有动态分配的内存 delete [] matrixA; delete [] matrixD; delete [] matrixL; delete [] matrixU; delete [] B; delete [] f; delete [] x; delete [] xx; delete [] xk; delete [] b; } /* ---------------------- 分配内存空间函数 ---------------------- */ double* allocMem(int num) { double *head; if((head=new double[num])==NULL) { cout<<"内存空间分配失败,程序终止运行!"<<endl; exit(0); } return head; } /* ----------------------------------------------- 计算Ax=b中x的初始向量值,采用高斯列主元素消去法 ----------------------------------------------- */ void GaussLineMain(double* A,double* x,double* b,int num) { int i,j,k; //共处理num-1行 for(i=0;i<num-1;i++) { //首先每列选主元,即最大的一个 double lineMax=fabs(*(A+i*num+i)); int lineI=i; for(j=i;j<num;j++) if(fabs(*(A+j*num+i))>fabs(lineMax)) lineI=j; //主元所在行和当前处理行做行交换,右系数b也随之交换 for(j=i;j<num;j++) { //A做交换 lineMax=*(A+i*num+j); *(A+i*num+j)=*(A+lineI*num+j); *(A+lineI*num+j)=lineMax; //b中对应元素做交换 lineMax=*(b+i); *(b+i)=*(b+lineI); *(b+lineI)=lineMax; } if(*(A+i*num+i)==0) continue; //如果当前主元为0,本次循环结束 //将A变为上三角矩阵,同样b也随之变换 for(j=i+1;j<num;j++) { double temp=-*(A+j*num+i)/(*(A+i*num+i)); for(k=i;k<num;k++) { *(A+j*num+k)+=temp*(*(A+i*num+k)); } *(b+j)+=temp*(*(b+i)); } } /* 验证Ax=b是否有唯一解,就是验证A的行列式是否为0; 如果|A|!=0,说明有唯一解 */ double determinantA=1; for(i=0;i<num;i++) determinantA*=*(A+i*num+i); if(determinantA==0) { cout<<endl<<endl<<"通过计算,矩阵A的行列式为|A|=0,即A没有唯一解。\n程序退出..."<<endl<<endl; exit(0); } /* 从最后一行开始,回代求解x的初始向量值 */ for(i=num-1;i>=0;i--) { for(j=num-1;j>i;j--) *(b+i)-=*(A+i*num+j)*(*(x+j)); *(x+i)=*(b+i)/(*(A+i*num+i)); } } /* -------------------------------------- 利用雅可比迭代公式求解x的精确值 迭代公式为:xk=Bx+f -------------------------------------- */ void Jacobi(double* x,double* xk,double* B,double* f,int num,double* xx) { double max; int i,j; for (i=0;i<num;i++) *(xx+i)=1; max=1; //i=0; while(max>=0.000098) //while(*(xx+i)>=0.00000098) { for(i=0;i<num;i++) { double temp=0; for(j=0;j<num;j++) temp+=*(B+i*num+j)*(*(x+j)); *(xk+i)=temp+*(f+i); } //将xk赋值给x,准备下一次迭代 for(i=0;i<num;i++) *(xx+i)=*(xk+i)-*(x+i); *(x+i)=*(xk+i); max=*xx; for(i=0;i<num-1;i++) if(*(xx+i)<*(xx+i+1)) max=*(xx+i+1); } } //程序编写结束
评论
    相关推荐
    • 迭代法图像复原算法3月20日改.rar
      使用C#的WPF与打印机调用打印例子。使用PrintDialog 类,用打印队列实现打印。利用vc6.0+opencv实现人脸识别
    • Newton.zip
      牛顿迭代法的实现,应用此程序,封装成函数,即可调用。
    • gaussian.rar
      C++,java混合编程绘图工具封装包,条形统计图,扇形统计图,折现统计图等等,方便使用者自行加载
    • Gaussian.rar
      高斯迭代消元,用于数值分析计算的一种便捷算法
    • matlab加速迭代法代码-SGS:生成高斯场的顺序高斯模拟
      matlab加速迭代法代码顺序高斯模拟 您是否曾经想过产生一个高斯场? 使用此MATLAB脚本,您可以轻松创建所选高斯模型的多个有条件或无条件2D实现。 从哪儿开始? LiveScript很好地概述了此代码中可用的SGS的不同实现...
    • Gaussian-elimination.zip
      Gaussian elimination
    • 高斯牛顿迭代法matlab代码-MatLab:MatLab代码按类别划分
      高斯牛顿继承matlab代码测试编辑自述文件等等等等 EP501示例MATLAB程序 Embry-Riddle航空大学的EP 501(数值方法)课程的示例代码,作业和考试。 该存储库正在进行中,并将在学期进行时进行更新。 FA2020学期更新...
    • 高斯牛顿迭代法matlab代码-Computational-Methods:包含数值分析技术的Matlab代码
      高斯牛顿继承matlab代码计算方法 包含数值分析技术的Matlab代码 #1。 牛顿·拉夫森 #2。 多变量牛顿拉夫森 #3。 二等分 ...割线 ...雅可比迭代 #14。 高斯西德尔 #15。 SOR #16。 雅可比式
    • gaussian.rar
      数值计算方法(马东升 第二版) 第三章线性代数方程组的数值解法实验 包括列主高斯消去 雅可比迭代 高斯-赛德尔迭代 使用Java程序编写 每一步有较详细的解释 本人编写,
    • 高斯牛顿迭代法matlab代码-gaisan:计算科学中的快速数值方法
      定点迭代 牛顿 优化 黄金分割搜索 牛顿 线性系统高斯消去 静脉注射欧拉 BVP 射击方式 有限差异 蒙特卡洛方法一体化 建造 要构建库,只需 make 要生成文档,请运行 make docs 要构建示例(在examples/目录中)...