代码之家  ›  专栏  ›  技术社区  ›  paper man

利用本征解线性方程组

  •  2
  • paper man  · 技术社区  · 7 年前

    我目前正在研究C++中的流体模拟,算法的一部分是求解稀疏线性方程组。人们建议为此使用Eigen图书馆。我决定用我写的这个简短的程序来测试它:

    #include <Eigen/SparseCholesky>
    
    #include <vector>
    #include <iostream>
    
    int main() {
        std::vector<Eigen::Triplet<double>> triplets;
        triplets.push_back(Eigen::Triplet<double>(0, 0, 1));
        triplets.push_back(Eigen::Triplet<double>(0, 1, -2));
        triplets.push_back(Eigen::Triplet<double>(1, 0, 3));
        triplets.push_back(Eigen::Triplet<double>(1, 1, -2));
    
        Eigen::SparseMatrix<double> A(2, 2);
        A.setFromTriplets(triplets.begin(), triplets.end());
    
        Eigen::VectorXd b(2);
        b[0] = -2;
        b[1] = 2;
    
        Eigen::SimplicialCholesky<Eigen::SparseMatrix<double>> chol(A);
        Eigen::VectorXd x = chol.solve(b);
    
        std::cout << x[0] << ' ' << x[1] << std::endl;
    
        system("pause");
    }
    

    它给出了这两个方程:

    X-2Y=- 2

    3X-2Y=2

    正确的解决方案是:

    x=2

    Y=2

    但问题是,当程序运行时,它输出: 0.181818-0.727273

    这是完全错误的!我已经调试了几个小时了,但这是一个非常短的程序,我完全按照Eigen网站上的教程操作。有人知道是什么导致了这个问题吗?

    另外,我知道我使用的类是用于稀疏矩阵的,但是这些类和普通矩阵类之间的唯一区别是元素的存储方式。

    2 回复  |  直到 7 年前
        1
  •  4
  •   ggael    7 年前

    SimplicialCholesky

    x + 3y = -2
    3x -2y = 2
    

    BICGSTAB doc