高斯消元法解向量方程Ax=b
来源:互联网 发布:飞思卡尔16位单片机 编辑:程序博客网 时间:2024/05/21 21:17
#include <iostream>#include <malloc.h>#include <math.h>//非齐次线性方程组Ax=bdouble **mat_A; //存放系数矩阵Adouble *mat_b; //存放右值数组bdouble *result; //结果数组const int M=3; //方阵的阶const int N=3;///////////////////////////////////////void init_ary() { //初始化系数矩阵 A 和右值数组 b; std::cout << "系数矩阵的行为 " << M << "列为 " << N << '\n';std::cout << "input the mat_A and mat_b" << '\n';mat_A = (double **)malloc(M*sizeof(double));for(int i=0; i<M; i++)*(mat_A+i) = (double *)malloc(N*sizeof(double));std::cout << "input the mat_A " << '\n';for(i=0; i<M; i++)for(int j=0; j<N; j++)std::cin >> *(*(mat_A+i)+j);std::cout << "input the mat_b" << '\n';mat_b = (double *)malloc(M*sizeof(double));for(i=0; i<M; i++)std::cin >> *(mat_b+i);}/////////////////////////////////////////////void guassi() { //对增广矩阵进行高斯消元, 将系数矩阵变成上三角矩阵double *temp; //当该行主元为0时需要与主元列元素不为0的行交换, 临时数组temp用于交换temp = (double *)malloc(N*sizeof(double));/*----高斯消元游戏开始了----*/for(int i=0; i<M-1; i++) { //需要对前 M-1 行进行消元double keyData = *(*(mat_A+i)+i); //记录当前行的主元int keyRow = i; //记录当前主元行/*---------当前主元为0,需要找到新的主元行进行交换--------*/if(keyData == 0) { for(int k=i+1; k<M; k++)if(*(*(mat_A+k)+i) != 0) {keyRow = k;break; //找到当前主元列中当前元素不为0的行 k ,用于交换使其成成为真正的主元行}/*----交换两行-----------------------------*/for(int j=i; j<N; j++) {*(temp+j) = *(*(mat_A+i)+j);*(*(mat_A+i)+j) = *(*(mat_A+keyRow)+j);*(*(mat_A+keyRow)+j) = *(temp+j);}/*----交换两行-----------------------------*///交换后主元行元素更新, 故要重置keyRow,keyDatakeyRow = i; keyData = *(*(mat_A+i)+i); }/*---------当前主元为0,需要找到新的主元行进行交换--------*//*------开始对当前行进行高斯消元----------*///将主元列中主元以下的所有元素置0for(int k=i+1; k<M; k++) { //i 为主元行行号, 主元以下消元, 故从 i+1 开始double elm = *(*(mat_A+k)+i)/keyData; //主元实际就是对角线元素, 故主元所在列等于行值, 故主元列为 i; elm是用于消元的除式因子/*----本行所有元素进行消元相关变化---*/for(int j=i+1; j<N; j++) {*(*(mat_A+k)+j) -= *(*(mat_A+i)+j)*elm; //本行元素减去主元行元素乘以除式因子elm变为新的本行元素; i 是主元行的行号}*(mat_b+k) -= *(mat_b+i)*elm; //右值列向量矩阵也要发生相应变化 /*----本行所有元素进行消元相关变化---*/}/*------开始对当前行进行高斯消元----------*/}/*----高斯消元游戏结束了----*/}//////////////////////////////////////////////////////////////void cal_mat() { //求解Ax=bresult = (double *)malloc(N*sizeof(double));*(result+N-1) = (*(mat_b+M-1))/(*(*(mat_A+M-1)+N-1));int k=M-2; //标记mat_b的下标for(int i=N-2; i>=0; i--) { //回代求解double sum = 0.0;for(int j=N-1; j>i; j--) sum += *(*(mat_A+i)+j)* (*(result+j));*(result+i) = (*(mat_b+k)-sum)/(*(*(mat_A+i)+i)); k--; }std::cout << "out put the result\n";for(i=0; i<N; i++)std::cout << *(result+i) << " ";std::cout << '\n';}//////////////////////////////////////////////////////////void main() {init_ary();guassi();cal_mat();}
验证:
- 高斯消元法解向量方程Ax=b
- 高斯消元法解方程Ax=b的C源代码实现
- 如何解Ax = b的方程
- J解方程Ax=b
- AX=B型方程思考
- eigen求解方程Ax=b
- 拓展欧几里得解方程ax+by=gcd(a,b)
- 求解方程Ax=b的通用程序
- 高斯列主元消元法解方程Ax=b(A为方阵且为满秩)
- 第九周二任务5:设计一元一次方程类,求形如ax+b=0的方程的解
- 求不定方程初始解{ax+by=c,a,b,c∈Z…
- 9.5设计一元一次方程类,求形如ax+b=0的方程的解
- 利用追赶法来求解方程Ax=b的C++程序
- 求线性同余方程 求Ax = B(mod C)
- 扩展欧几里得求方程 ax+by=gcd(a,b) 的解
- 扩展gcd以及同余方程ax=b(mod M)
- Ax=b
- Ax=b解,向量空间的基、维度(Part IV)
- 什么是sp,怎么运作,他们是怎么发财的
- js数组转json并在后台对其解析
- ArcGIS for iOS 开发系列(8) – 基础篇-空间要素-符号渲染和属性信息
- 智能机倒逼SP模式:中电信改革无线音乐产业
- maintainers
- 高斯消元法解向量方程Ax=b
- 域用户登陆脚本(网络收集)
- 多线程编程指南
- windows7重装后恢复Ubuntu开机启动项,Ubuntu所在的硬盘uuid改变没法进入Ubuntu系统,解决方法
- STL容器元素的删除
- 杂记之C语言之指针(一)
- PLSQL本地不安装客户端远程连接Oracle
- 【专家篇】将3DXNA模型嵌入到Silverlight应用程序
- 相对路径、绝对路径和servlet映射路径