• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
村雨sup
自己选的路,跪着也要走完 XD
博客园    首页    新随笔    联系   管理    订阅  订阅
高斯消元法

有点线代的知识:

const double EPS = 1e-8;
typedef vector<double>  vec;
typedef vector<vec>  mat;
//Ax = b
vec gauss_jordan(const mat &A, const vec &b)
{
    int n = A.size();
    mat B(n,vec(n+1)); //定义大小
    for(int i=0;i < n;i++)
        for(int j=0;j < n;j++)
            B[i][j] = A[i][j];
    
    for(int i=0;i < n;i++) B[i][n] = b[i]; //把 b 放在 B 的右边一起运算

    for(int i=0;i < n;i++)                //把正在处理的未知数系数的绝对值最大的式子换到第i行(为什么是第i行)
    {
        int pivot = i;
        for(int j=i;j < n;j++)
            if(abs(B[j][i]) > abs(B[pivot][i]))
                pivot = j;

        swap(B[pivot],B[i]);

        if(abs(B[i][i]) < EPS) return vec();    //这种情况下,无解或者是无穷多解。

        for(int j=i+1;j <= n;j++) B[i][j] = B[i][j]/B[i][i];  //把正在处理的未知数的系数变为1。
        
        for(int j=0;j < n;j++)
        {
            if(i != j)
                for(int k=i+1;k <= n;k++)
                    B[j][k] -= B[j][i]*B[i][k];    //消参
        }
    }
    vec x(n);
    for(int i=0;i < n;i++) x[i] = B[i][n];
    return x;
}

先了解一下,以后拿例题练。

posted on 2018-02-18 16:46  村雨sup  阅读(121)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3