一,要解决的问题

选用合适的算法,求解三种线性方程组:一般线性方程组,对称正定方程组,三对角线性方程组。
方程略。


二,数值方法

1,使用Guass列主元消去法求解一般线性方程组。

Guass列主元是为了防止Guass消去法中大数吃掉小数而引出的一种线性方程组求解方法,消元时选用一列中绝对值最大的元素作为列主元素。

算法伪代码:

消元过程

回代过程

2,使用平方根法求解对称正定方程组

平方根法。它把系数矩阵(对称正定矩阵)表示成一个下三角矩阵L和其转置的乘积的分解。这样的分解又称为Cholesky分解。

3,使用追赶法求解三对角线性方程组

三对角线性方程组是指这一类的线性方程组:系数矩阵是一个对角占优的三对角矩阵。追赶法是专门用来求解三对角线性方程组的,它将系数矩阵分解成alpha矩阵和beta矩阵的乘积,例如以下图所看到的:


三。算法

1。Guass列主元消去法

/*
CreateOn:2016/03/20
Author:linxiaobai
Function:linear equation solution
solution1:列主元Guass消去法求解一般线性方程组
*/
#include "stdafx.h"
# include<iostream>
# include<algorithm>
# include<fstream>
# include<iomanip>
# include<cmath>
using namespace std;
double a[15][15];
const int N=10;
double res[N+1];
void printArry(double a[][15])//打印增广矩阵
{for(int i=1;i<=10;i++){for(int j=1;j<=11;j++){cout<<setw(3)<<a[i][j]<<" ";}cout<<endl;}
}
int _tmain(int argc, _TCHAR* argv[])
{cout<<"【运用列主元Guass求解一般线性方程组】"<<endl;//读入增广矩阵ifstream in;in.open("data.txt");if(!in){cerr<<"file open failed!"<<endl;return 0;}double x;int i=1,j=1;while(!in.eof()){in>>a[i][j];j++;if(j>11){i++;j=1;}}cout<<"增广矩阵:"<<endl<<"++++++++++++++++++++++++++"<<endl;printArry(a);cout<<"++++++++++++++++++++++++++";for(int k=1;k<=N-1;k++){double tmp=abs(a[k][k]);int ind=k;for(int j=k;j<=N;j++)//找绝对值最大的行{if(abs(a[j][k])>tmp) {tmp=abs(a[j][k]);ind=j;}}//若a[ind][k]=0,停止计算if(a[ind][k]==0){cout<<"no unique solution"<<endl;return 0;}//绝对值最大的行交换到第k行if(ind!=k)for(int j=1;j<=N+1;j++)swap(a[ind][j],a[k][j]);//消元计算double p;for(int i=k+1;i<=N;i++){p=a[i][k]/a[k][k];for(int j=k;j<=N+1;j++)a[i][j]-=p*a[k][j];}}if(a[N][N]==0){cout<<"no unique solution"<<endl;return 0;}//回代求解res[N]=a[N][N+1]/a[N][N];double s;for(int i=N-1;i>=1;i--){s=0;for(int j=i+1;j<=N;j++)s+=a[i][j]*res[j];res[i]=(a[i][N+1]-s)/a[i][i];}//输出解向量为cout<<endl<<endl<<"解向量为:"<<endl;for(int i=1;i<=N;i++)if(abs(res[i])<10e-14)cout<<"0"<<" ";elsecout<<res[i]<<" ";cout<<endl;return 0;
}

2,使用平方根算法解对称正定方程组

/*
CreateOn:2016/03/20
Author:linxiaobai
Function:linear equation solution
solution1:使用平方根算法解对称正定方程组
*/
# include"stdafx.h"
# include<iostream>
# include<fstream>
# include<cmath>
# include<iomanip>
using namespace std;
double a[10][10];
const int N=8;
double b[N+1],xx[N+1],yy[N+1];
void printArry(double a[][10])//输出系数矩阵
{for(int i=1;i<=8;i++){for(int j=1;j<=8;j++){cout<<setw(3)<<a[i][j]<<" ";}cout<<endl;}
}int main()
{cout<<"【运用平方根算法解对称正定方程组】"<<endl;/*读入系数矩阵*/ifstream in;in.open("data2.txt");if(!in){cerr<<"file open failed!"<<endl;return 0;}int i=1,j=1;while(i<=N){in>>a[i][j];j++;if(j>8){i++;j=1;}}/*读入b[]*/for(int i=1;i<=N;i++)in>>b[i];cout<<"系数矩阵:"<<endl<<"++++++++++++++++++++++++++"<<endl;printArry(a);cout<<endl<<endl<<"b:"<<endl;for(int i=1;i<=N;i++)cout<<setw(3)<<b[i]<<" ";cout<<endl<<"++++++++++++++++++++++++++";//開始计算。A=GG',G存在A的下三角for(int k=1;k<=N;k++){double s1=0;for(int m=1;m<=k-1;m++)s1+=pow(a[k][m],2);a[k][k]=sqrt(a[k][k]-s1);for(int i=k+1;i<=N;i++){double s2=0;for(int m=1;m<=k-1;m++)s2+=a[i][m]*a[k][m];a[i][k]=(a[i][k]-s2)/a[k][k];}//计算ydouble s3=0;for(int m=1;m<=k-1;m++)s3+=a[k][m]*yy[m];yy[k]=(b[k]-s3)/a[k][k];}//计算xxx[N]=yy[N]/a[N][N];for(int k=N-1;k>=1;k--){double s4=0;for(int m=k+1;m<=N;m++)s4+=a[m][k]*xx[m];xx[k]=(yy[k]-s4)/a[k][k];}cout<<endl<<"解向量为:"<<endl;for(int i=1;i<=N;i++)cout<<setw(3)<<xx[i]<<" ";cout<<endl;return 0;
}

3,使用追赶法解三对角线性方程组

/*
CreateOn:2016/03/20
Author:linxiaobai
Function:linear equation solution
solution1:使用追赶法解三对角线性方程组
*/
# include"stdafx.h"
# include<iostream>
# include<fstream>
# include<iomanip>
# include<cmath>
using namespace std;
const int N=10;
double a[N+1],c[N+1],d[N+1],xx[N+1],yy[N+1];
int main()
{cout<<"【运用追赶法解三对角线性方程组】"<<endl;//a[N]:主对角线上的元素for(int i=1;i<=N;i++)a[i]=4;//c[N]:上辅对角线上的元素for(int i=1;i<=N-1;i++)c[i]=-1;//d[N]:下辅对角线上的元素for(int i=2;i<=N;i++)d[i]=-1;double b[]={0,7,5,-13,2,6,-12,14,-4,5,-5};cout<<"++++++++++++++++++++++++++"<<endl;cout<<"主对角线上的元素a:"<<endl;for(int i=1;i<=N;i++)cout<<setw(3)<<a[i]<<" ";cout<<endl<<endl<<"上辅对角线上的元素c:"<<endl;for(int i=1;i<=N-1;i++)cout<<setw(3)<<c[i]<<" ";cout<<endl<<endl<<"下辅对角线上的元素d:"<<endl;for(int i=2;i<=N;i++)cout<<setw(3)<<d[i]<<" ";cout<<endl<<endl<<"b:"<<endl;for(int i=1;i<=N;i++)cout<<setw(3)<<b[i]<<" ";cout<<endl<<"++++++++++++++++++++++++++"<<endl;/*開始计算*/double alpha[N+1],beta[N+1];alpha[1]=a[1];for(int i=1;i<=N-1;i++){beta[i]=c[i]/alpha[i];alpha[i+1]=a[i+1]-d[i+1]*beta[i];}yy[1]=b[1]/alpha[1];for(int i=2;i<=N;i++){yy[i]=(b[i]-d[i]*yy[i-1])/alpha[i];}xx[N]=yy[N];for(int i=N-1;i>=1;i--)xx[i]=yy[i]-beta[i]*xx[i+1];//解向量为:cout<<endl<<"解向量为:"<<endl;for(int i=1;i<=N;i++)if(abs(xx[i])<10e-14)cout<<"0"<<" ";elsecout<<xx[i]<<" ";cout<<endl;return 0;
}

四,数值结果

1,Guass列主元消去法

2,使用平方根算法解对称正定方程组

3,使用追赶法解三对角线性方程组



五,结果分析与实验总结

浮点计算产生的误差

在Guass消元算法之前的代码中,我使用了近似的方法,将绝对值小于10的-14次方的值近似为0,如今去掉这个处理。来看一下结果:

for(int i=1;i<=N;i++)//if(abs(res[i])<10e-14)//cout<<"0"<<" ";//elsecout<<res[i]<<" ";

能够看到x3的值是一个十分接近于0的数,假设将消元后的系数矩阵打印出来。能够看到消元后的系数矩阵并非一个真正的上三角矩阵,下三角部分有几处的值是一个绝对值极小的值。这是因为计算机的浮点计算造成的,浮点数在计算机中本身就不是一个精确的数,在消元的过程中。一些浮点运算有误差,于是最后得到的是近似值,而不是0。

同理,平方根法和追赶法也会产生由浮点数计算引起的误差,降低计算误差正是学习数值分析的目的。

转载于:https://www.cnblogs.com/mfmdaoyou/p/7161125.html

Guass列主元、平方根法、追赶法求解方程组的C++实现相关推荐

  1. 追赶法求解方程组备忘

    本篇内容为数值分析中,用追赶法求解方程组的方法,备忘如下: 1. 原理部分 追赶法求解的矩阵格式一般如下: a1 c1 0 0 b2 a2 c2 0 0 b3 a3 c3 0 0 b4 a4 如果矩阵 ...

  2. c语言程序 用追赶法求解方程组,编写用追赶法解三对角线性方程组的程序,并解下列方程组(3页)-原创力文档...

    计算方法与实习上机实验(二) 实验名称: 编写用追赶法解三对角线性方程组的程序,并解下列方程组: (1) (2)Ax=b,其中 A10×10=, b10×1= 程序代码: #include using ...

  3. c语言程序 用追赶法求解方程组,编写用追赶法解三对角线性方程组的程序,并解下列方程组...

    计算方法与实习上机实验(二) 实验名称: 编写用追赶法解三对角线性方程组的程序,并解下列方程组: 2x1 x2 5, x 2x x 12, 123(1) x 2x x 11,34 2 x3 2x4 1 ...

  4. 追赶法求解三对角方程组

    1. 来源和背景 对于一个(主)三对角方程组,我们常用"追赶法"来进行求解. 而三对角方程组常常出现于微分方程的数值求解,例如热传导方程的边值问题 {y′′(x)=f(x,y,y′ ...

  5. 用追赶法求方程组c语言程序,数值计算——追赶法求解三对角方程组(附代码)...

    目录 追赶法基础理论 追赶法c++程序代码 程序运行结果 源码文件下载地址 追赶法基础理论 在数值计算中,对三次样条曲线插值和用差分方法求解常微分方程边值问题时,通常会遇到Ax=d三对角形式的方程组: ...

  6. 【数学建模之Python】12.追赶法求解三对角方程组

    如果解决了你的问题,点个赞再走嘛٩(๑❛ᴗ❛๑)۶ 目录 一.前言 二.方程组的特点 1.类型 2.要求 3.方法的优势 三.算法步骤 四.例题+代码 1.用追赶法求解以下五阶方程组 2.代码 一.前 ...

  7. 追赶法求解三对角线性方程组的MATLAB程序

    function [M] = after_method(a,b,c,g,tolerance) %% 追赶法求解三对角矩阵 % a为三对角矩阵左下对角线上的值 % b为三对角矩阵中间对角线上的值 % c ...

  8. 利用稀疏格式矩阵求解方程组以及机器学习训练速度对比

    本文要点: 1.几个稀疏矩阵的应用场景 2.scipy得到稀疏格式矩阵后专用的方程组求解器 3.用稀疏格式求解方程组的速度对比 4.稀疏矩阵与原矩阵内存大小对比 5.python稀疏格式与array格 ...

  9. Python 克莱姆法则求解方程组

    克莱姆法则求解方程组 请用克莱姆法则解下面的线性方程2x2系统: 编写程序,用户输入数字a.b.c.d.e和f,然后显示x和y的结果.如果ad-bc为零,呈现"The equation ha ...

  10. 列主元Gauss消元法求解线性方程组的MATLAB实现

    目录 顺序高斯消去法求解线性方程组的MATLAB实现 列主元Gauss消元法求解线性方程组的MATLAB实现 一.简介 MATLAB实现列主元Gauss消去法求解线性方程组,并与不列主元的Gauss消 ...

最新文章

  1. java update set_mybatis update set 多个字段实例
  2. Linux 2.6 下通过 ptrace 和 plt 实现用户态 API Hook
  3. MYSQL触发器记录用户操作的命令
  4. mysql 配置文件设置最大链接数 max_connections不生效
  5. HarmonyOS之深入解析自定义组件与布局的实现
  6. Java:14 个 Spring MVC 顶级技巧,随时用随时爽,一直用一直爽
  7. postgis安装_从零开始,构建电子地图网站:0_2_数据处理postgis
  8. 【AI视野·今日NLP 自然语言处理论文速览 第二十六期】Wed, 3 Nov 2021
  9. Python Cookbook 资料链接
  10. MVC Code First中的惯例(约定)
  11. 经典SQL语句大全(转)
  12. Linux中tty框架与uart框架之间的调用关系剖析
  13. mysql odbc 没有_如何解决mysql odbc安装丢失的问题
  14. 百度地图设置卫星地图显示图文教程
  15. java婚纱摄影网站计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  16. html刷浏览量,批量刷网页点击量工具
  17. 王牌英雄怎么服务器维护了,王牌英雄新手入门指南 王牌英雄玩法技巧
  18. Java实现扑克牌程序(数据结构)
  19. Python3---站在大佬肩膀写爬虫-爬取网易云音乐热歌榜歌曲热评(精彩评论)
  20. 光纤布线兵法之热点问题篇(二)

热门文章

  1. wpsppt放映时间_wps演示怎么调整放映速度?
  2. 黑客教父郭盛华:提升家庭WiFi的10个方法
  3. 双耳节拍 枕头_枕头2.2.1发布
  4. 一招教你如何调整图片的分辨率DPI?
  5. 如何使用光盘启动计算机,电脑如何设置光驱启动 电脑设置光驱启动方法【图文】...
  6. 简洁的表白java_java简短表白代码怎么写?实操讲解
  7. 铁路、公路施工企业劳务实名制管理系统解决方案
  8. 用最简单的方法解决:linux系统重启网络delaying initialization错误
  9. 几种常用的传感器(加速度传感器、重力传感器、方向传感器、陀螺仪)简介
  10. 从0开始学习scrapy框架——(六)item的实例——阳光政务平台爬虫