zoukankan      html  css  js  c++  java
  • 15.高斯消元解线性方程组

     

     高斯消元可以在O(n ^ 3)的时间复杂度内,求解一个包含n个方程和n个未知数的多元线性方程组

     解有三种情况

     预备知识:线性代数矩阵的初等行变换,转化成最短阶梯形矩阵

    高斯消元就是把一个系数矩阵变换成上三角的形式

     高斯消元涉及到的线代知识不多,秩之类的不涉及

    只用最基础的线代知识

    无解的情况:不完美阶梯形时,某一行出现了左边没有未知数,右边非零的情况。0 = ?这种情况,无解

     无穷多解的情况:不完美阶梯形时,出现很多0 = 0的方程,无穷多组解

     唯一解的情况:完美的上三角阶梯形矩阵,第一行n个未知数,第二行n - 1个,第n行1个未知数

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int N = 110;
     4 const double eps = 1e-6; //判断是否是0
     5 int n;
     6 double a[N][N]; //用double存
     7 int gauss() {
     8     int c, r;
     9     //c表示枚举的每一列
    10     //r表示行
    11     for (c = 0, r = 0; c < n; c++) {
    12         int t = r; //t表示当前这一列绝对值最大的那一行
    13         for (int i = r; i < n; i++) { //找到当前这一列,绝对值最大的那一行
    14             if (fabs(a[i][c]) > fabs(a[t][c])) {
    15                 t = i;
    16             }
    17         }
    18         if (fabs(a[t][c]) < eps) { //如果当前这一列是0了
    19             continue;
    20         }
    21         for (int i = c; i <= n; i++) { //换到最上面
    22             swap(a[t][i], a[r][i]);
    23         }
    24         for (int i = n; i >= c; i--) { //变成1,倒着来
    25             a[r][i] /= a[r][c];
    26         }
    27         for (int i = r + 1; i < n; i++) { //把下面的都变为0
    28             if (fabs(a[i][c]) > eps) { //已经是0就不操作
    29                 for (int j = n; j >= c; j--) {
    30                     a[i][j] -= a[r][j] * a[i][c];
    31                 }
    32             }
    33         }
    34         r++;
    35     }
    36     //已经变好了
    37     if (r < n) { //如果不到n个方程,不是唯一解
    38         for (int i = r; i < n; i++) {
    39             if (fabs(a[i][n]) > eps) { //如果出现了0 = ?的情况
    40                 return 2; //无解
    41             }
    42         }
    43         return 1; //无穷多解
    44     }
    45     for (int i = n - 1; i >= 0; i--) { //最后一步,倒着把答案推出来
    46         for (int j = i + 1; j < n; j++) {
    47             a[i][n] -= a[j][n] * a[i][j];
    48         }
    49     }
    50     return 0; //唯一解
    51 }
    52 int main() {
    53     cin >> n;
    54     for (int i = 0; i < n; i++) {
    55         for (int j = 0; j < n + 1; j++) {
    56             cin >> a[i][j];
    57         }
    58     }
    59     int t = gauss();
    60     if (t == 0) { //唯一解
    61         for (int i = 0; i < n; i++) {
    62             cout << fixed << setprecision(2) << a[i][n] << endl;
    63         }
    64     } else if (t == 1) { //无穷多解
    65         cout << "Infinite group solutions" << endl;
    66     } else { //无解
    67         cout << "No solution" << endl;
    68     }
    69     return 0;
    70 }
  • 相关阅读:
    Ajax Bootstrap JSP .jsp JS .js DOM 概念
    CSS相关
    linux下python的tab自动补全功能:readline模块和ipython的安装
    python小技巧
    python中的值传递和引用传递(可变对象与不可变对象)也就是赋值的原理-python全部是引用传递
    Sql server 编写99乘法表
    消息对话框 MessageBoxButtons
    union与union all的用法给区别
    主要的窗体控件的概述
    窗体的常用方法和事件
  • 原文地址:https://www.cnblogs.com/fx1998/p/13453676.html
Copyright © 2011-2022 走看看