解线性方程组.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
解线性方程组

//线性方程组列主元高斯消元法求解 #include stdafx.h #includememory #if _DEBUG #includeiostream //测试时使用 #endif using namespace std; //绝对值函数 __inline double _abs(double v) { return v 0 ? -v : v; } #if _DEBUG void test(int n, const double *pd) { int i, j, k = 0; for (i = 0; i n; i++) { for (j = 0; j = n; j++) { cout pd[k] ; k++; } cout endl; } } #endif //线性方程组列主元高斯消元法 //n 方程元数;pCoef 系数,必须以行主序方式存放的二维数组; //pOut 长度为 n 的一维数组(调用者负责维护),用于输出数据 //返回值:0 成功,-1 无解,1 申请内存失败, 2 不定解。 int GaussJordanElimination(int n, const double *pCoef, double *pOut) { double *pcf; int rows = n, columns = n + 1; pcf = new double[rows * columns]; if (pcf == nullptr) return 1; //巧妇难为无米之炊,内存都申请不到,还能干嘛! memcpy(pcf, pCoef, (rows * columns) * sizeof(double)); //据说这个运行效率很高 int r, c, i; //循环变量 int a, b; double x, y; //开始消元,将 pcf 方阵区处理成到直角三角形(直角在右上角)矩阵 for (r = 0; r rows - 1; r++) { //选取主元 a = r; x = _abs(pcf[r * columns + r]); for (i = r + 1; i rows; i++) { //查找主元在哪行 if (x _abs(pcf[i * columns + r])) a = i; } if (a r) { //主元不是当前行(r),比较麻烦,需要将第 a 行与第 r 行兑换 //第 r 列前面的就不要对换了,因为这些项已经被消元,变成 0 了 for (c = r; c columns; c++) { x = pcf[r * columns + c]; pcf[r * columns + c] = pcf[a * columns + c]; pcf[a * columns + c] = x; } } //开始消元 a = r * columns; //记住将主元的行地址偏移量,以提高程序运行效率 x = -pcf[a + r]; //要多次使用,记下她,以提高程序运行效率 if (x == 0) //主元居然为 0,纯粹是想坑爹,岂能上当! continue; //继续后面的消元,以便最终判断是无解还是任意解 for (i = r + 1; i rows; i++) { //正在消元 b = i * columns;//记住将要消元的行地址偏移量,以提高程序运行效率 y = pcf[b + r]; //要多次使用,记下她,以提高程序运行效率 if (y != 0) { //y == 0,本行不需要消元 y /= x; //要多次使用,记下她,以提高程序运行效率 pcf[b + r] = 0; //肯定为 0,不用计算。 for (c = r + 1; c columns; c++) pcf[b + c] += pcf[a + c] * y; } } }//至此,pcf 方阵区已经处理成到直角三角形(直角在右上角)矩阵 //回代,将 pcf 方阵区处理成主对角线为 1,其他为 0 的矩阵 int columns_1 = c = columns - 1; //多次用到,提高效率 for (r = rows - 1; r = 1; r--) { b = r * columns; if (pcf[b + r] == 0) { //经过前面的消元,除主元外,其他元应该都为 0 if (pcf[b + columns

文档评论(0)

9885fp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档