高斯消元

不会高斯消元 /kk。

高斯消元,就是通过某种操作消元得到答案。

eg:

{3x+5y+z=20x2y+3z=192x6y+z=6

把它变成增广矩阵形式:

[35120123192616]

怎么把 x 消掉呢?2 式是把 3×=0x11y+8z=37

那么 3 式怎么消呢?用 3×2×=0x28y+z=22

那么现在增广矩阵变成了:

[35120011837028122]

接下来我们让 11 为主元。

经过消元,变成了:

[35120011837002131036]

带回:

{3x+5y+z=200x11y+8z=370x+0y+213z=1036

那就是:

{3x+5y+z=2011y+8z=37213z=1036

解得:

{x=3y=1z=6

好了,我们手动模拟了高斯消元的过程。我们来总结一下:

  • 每次找到主元 xi(通常是系数最大的)。

  • 将未被选择过的行中的该项全部按照系数相应的减去选定的那行的系数(剩下的其他行 xi 系数化为 0)。

  • 倒序求解,每次将常数减去已经求出的所有项的解,此时可以求出当前项的解(将已知解带入求未知解)。

代码很简短:

#include <bits/stdc++.h> using namespace std; const int N = 110; const double eps = 1e-6; int n; double a[N][N]; bool solve() { int r = 0; for (int i = 0; i < n; i++) { int now = r; for (int j = r; j < n; j++) { if (fabs(a[j][i]) > fabs(a[now][i])) { now = j; } } if (fabs(a[now][i]) < eps) { continue; } for (int j = i; j <= n; j++) { swap(a[now][j], a[r][j]); } for (int j = n; j >= i; j--) { a[r][j] /= a[r][i]; } for (int j = r + 1; j < n; j++) { if (fabs(a[j][i]) > eps) { for (int k = n; k >= i; k--) { a[j][k] -= a[r][k] * a[j][i]; } } } r++; } if (r < n) { return 1; } for (int i = n - 1; i >= 0; i--) { for (int j = i + 1; j < n; j++) { a[i][n] -= a[j][n] * a[i][j]; } } return 0; } int main() { cin >> n; for (int i = 0; i < n; i++) { for (int j = 0; j <= n; j++) { cin >> a[i][j]; } } bool t = solve(); if (!t) { for (int i = 0; i < n; i++) { cout << fixed << setprecision(2) << a[i][n] << endl; } } else { cout << "No Solution"; } return 0; }

__EOF__

本文作者ようこそ!
本文链接https://www.cnblogs.com/ydq1101/p/18132635.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ydq1101  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示