[算法] 高斯消元法 列主消元法 C++ 代码

简介:


 

复制代码
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<iomanip>
  4 using namespace std;
  5 #define e     0.00000001
  6 #define maxn 50
  7 
  8 int    n;//规模nXn
  9 double a[maxn][maxn];//系数矩阵
 10 double b[maxn];//b矩阵
 11 double m[maxn][maxn];//中间变量矩阵
 12 double x[maxn];//最终解
 13 int    H=1;//扩大H被结算(优化)
 14 /*
 15 读取数据
 16 */
 17 void read(){
 18     cout<<"请输入系数矩阵规模n:= ";
 19     cin>>n;
 20     cout<<"|-----------------------------\n";
 21     cout<<"|请输入系数矩阵,如:\n";
 22     cout<<"|1.1348 3.8326 1.1651 3.4017\n"; 
 23     cout<<"|0.5301 1.7875 2.5330 1.5435\n";
 24     cout<<"|3.4129 4.9317 8.7643 1.3142\n";
 25     cout<<"|1.2371 4.9998 10.6721 0.0147\n";
 26     cout<<"|-----------------------------\n";
 27     for(int i=1;i<=n;i++)
 28         for(int j=1;j<=n;j++){
 29             cin>>a[i][j];
 30             a[i][j]*=H;
 31         }
 32     cout<<"|-----------------------------\n";
 33     cout<<"|请输入b矩阵,如:\n";
 34     cout<<"|9.5342 6.3941 18.4231 16.9237\n";
 35     cout<<"|-----------------------------\n";
 36     for(int i=1;i<=n;i++){
 37         cin>>b[i];
 38         b[i]*=H;
 39     }
 40 }
 41 
 42 /*
 43 中间矩阵输出
 44 参数:消元次数
 45 */
 46 void PrintProc(int cases){
 47     printf("--------第%d次消元结果如下:\n",cases);
 48     for(int i=1;i<=n;i++){
 49         for(int j=1;j<=n;j++){
 50             cout<<setw(10)<<a[i][j]<<' ';
 51         }
 52         cout<<setw(10)<<b[i]<<'\n';
 53     }
 54     cout<<"END THIS SHOW-------------\n";
 55 }
 56 
 57 /*
 58 显示结果
 59 */
 60 void Print(){
 61     cout<<"|-----------------------------\n";
 62     cout<<"|结果为:\n";
 63     for(int i=1;i<=n;i++){
 64         printf("x[%d]=  %lf\n",i,x[i]);
 65     }
 66     cout<<"|-----------------------------\n\n";
 67 }
 68 
 69 /*
 70 顺序消元法
 71 */
 72 void ShunXuXiaoYuan(){
 73     //消元计算
 74     for(int k=1;k<n;k++){
 75         for(int i=k+1;i<=n;i++){
 76             m[i][k]=a[i][k]/a[k][k];
 77             for(int j=k+1;j<=n;j++){
 78                 a[i][j]-=m[i][k]*a[k][j];
 79             }
 80         }
 81         for(int i=k+1;i<=n;i++){
 82             b[i]-=m[i][k]*b[k];
 83         }
 84         PrintProc(k);//输出中间计算过程
 85     }
 86     //回代求解
 87     x[n]=b[n]/a[n][n];
 88     for(int i=n-1;i>0;i--){
 89         x[i]=b[i];
 90         for(int j=i+1;j<=n;j++)
 91             x[i]-=a[i][j]*x[j];
 92         x[i]/=a[i][i];
 93     }
 94     //输出结果
 95     Print();
 96 }
 97 
 98 /*
 99 列主消元
100 */
101 void LieZhuXiaoYuan(){
102     for(int k=1;k<n;k++){
103         //选主元[这一列的绝对值最大值]
104         double ab_max=-1;
105         int       max_ik;
106         for(int i=k;i<=n;i++){
107             if(abs(a[i][k])>ab_max){
108                 ab_max=abs(a[i][k]);
109                 max_ik=i;
110             }
111         }
112         //交换行处理[先判断是否为0矩阵]
113         if(ab_max<e){//0矩阵情况
114             cout<<"det A=0\n";
115             break;
116         }else if(max_ik!=k){//是否是当前行,不是交换
117             double temp;
118             for(int j=1;j<=n;j++){
119                 temp=a[max_ik][j];
120                 a[max_ik][j]=a[k][j];
121                 a[k][j]=temp;
122             }
123             temp=b[max_ik];
124             b[max_ik]=b[k];
125             b[k]=temp;
126         }
127         //消元计算
128         for(int i=k+1;i<=n;i++){
129             a[i][k]/=a[k][k];
130             for(int j=k+1;j<=n;j++){
131                 a[i][j]-=a[i][k]*a[k][j];
132             }
133             b[i]-=a[i][k]*b[k];
134         }
135         PrintProc(k);//输出中间计算过程
136         if(k<n-1)continue;
137         else{
138             if(abs(a[n][n])<e){
139                 cout<<"det A=0\n";
140                 break;
141             }else{//回代求解
142                 x[n]=b[n]/a[n][n];
143                 for(int i=n-1;i>0;i--){
144                     x[i]=b[i];
145                     for(int j=i+1;j<=n;j++)
146                         x[i]-=a[i][j]*x[j];
147                     x[i]/=a[i][i];
148                 }
149                 //输出结果
150                 Print();
151             }
152         }
153     }
154 }
155 
156 /*
157 主函数
158 */
159 int main(){
160     while(1){
161         read();
162         LieZhuXiaoYuan();
163         //ShunXuXiaoYuan();
164     }return 0;
165 }
166 /*
167 书上高斯消元的例子:
168 1 1 1 
169 1 3 -2
170 2 -2 1
171 
172 6 1 1
173 */
174 /*
175 书上列主消元的例子:
176 -0.002 2 2
177 1 0.78125 0
178 3.996 5.5625 4
179 
180 0.4 1.3816 7.4178
181 */
复制代码
相关文章
|
12天前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
13天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
37 1
|
21天前
|
存储 缓存 算法
通过优化算法和代码结构来提升易语言程序的执行效率
通过优化算法和代码结构来提升易语言程序的执行效率
|
27天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
27天前
|
算法 安全 C++
提高C/C++代码的可读性
提高C/C++代码的可读性
41 4
|
1月前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
41 3
|
1月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
2月前
|
存储 缓存 算法
如何通过优化算法和代码结构来提升易语言程序的执行效率?
如何通过优化算法和代码结构来提升易语言程序的执行效率?
|
2月前
|
搜索推荐
插入排序算法的讲解和代码
【10月更文挑战第12天】插入排序是一种基础的排序算法,理解和掌握它对于学习其他排序算法以及数据结构都具有重要意义。你可以通过实际操作和分析,进一步深入了解插入排序的特点和应用场景,以便在实际编程中更好地运用它。
|
2月前
|
存储 算法 C++
高精度算法(加、减、乘、除,使用c++实现)
高精度算法(加、减、乘、除,使用c++实现)
579 0
高精度算法(加、减、乘、除,使用c++实现)