用特征值法求解线性方程组 我目前正在C++中进行流体模拟,算法的一部分是求解稀疏线性方程组。为此,人们建议使用图书馆eGen。我决定用我写的这个简短的程序来测试它: #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"); } #包括 #包括 #包括 int main(){ std::载体三联体; 三联体。推回(本征::三联体(0,0,1)); 三联体。推回(本征::三联体(0,1,-2)); 三联体。推回(本征::三联体(1,0,3)); 三联体。推回(本征::三联体(1,1,-2)); 本征::稀疏矩阵A(2,2); A.setFromTriplets(triplets.begin(),triplets.end()); 本征::矢量xd b(2); b[0]=-2; b[1]=2; 本征::simplicalcholesky-chol(A); 本征::向量xd x=chol.solve(b); std::cout

用特征值法求解线性方程组 我目前正在C++中进行流体模拟,算法的一部分是求解稀疏线性方程组。为此,人们建议使用图书馆eGen。我决定用我写的这个简短的程序来测试它: #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"); } #包括 #包括 #包括 int main(){ std::载体三联体; 三联体。推回(本征::三联体(0,0,1)); 三联体。推回(本征::三联体(0,1,-2)); 三联体。推回(本征::三联体(1,0,3)); 三联体。推回(本征::三联体(1,1,-2)); 本征::稀疏矩阵A(2,2); A.setFromTriplets(triplets.begin(),triplets.end()); 本征::矢量xd b(2); b[0]=-2; b[1]=2; 本征::simplicalcholesky-chol(A); 本征::向量xd x=chol.solve(b); std::cout,c++,linear-algebra,eigen,C++,Linear Algebra,Eigen,SimplicalCholesky适用于对称正定(SPD)矩阵,您组合的矩阵甚至不是对称的。默认情况下,它只读取下三角部分的条目,忽略其他条目,因此解决了: x + 3y = -2 3x -2y = 2 正如您所注意到的,对于非对称平方问题,您需要在迭代解算器的世界中使用基于LU或BICGSTAB的直接解算器。中总结了所有这些。您应该使用能够处理非对称稀疏矩阵的解算器。另一种可能的方法是寻求非原始系统的解[a]x=b,但[A]T*[A]x=[A]T*b,其中[A]T代表[A]转置。后一个系统的

SimplicalCholesky
适用于对称正定(SPD)矩阵,您组合的矩阵甚至不是对称的。默认情况下,它只读取下三角部分的条目,忽略其他条目,因此解决了:

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

正如您所注意到的,对于非对称平方问题,您需要在迭代解算器的世界中使用基于LU或BICGSTAB的直接解算器。

中总结了所有这些。您应该使用能够处理非对称稀疏矩阵的解算器。另一种可能的方法是寻求非原始系统的解[a]x=b,但[A]T*[A]x=[A]T*b,其中[A]T代表[A]转置。后一个系统的矩阵是对称和正定的(只要[A]是非奇异的)。唯一的缺点是,如果原始[A]不是“好的”,那么[A]T[A]可能相当病态从这个意义上讲,这只是一个用于解决此类问题的软件示例:

您已经建立了一个转置matrix@n.m.我想可能是这样,但即使我转置它,我仍然得到了错误的答案:/@n.m.你在说什么?即使我转置系数矩阵,这些答案仍然不起作用。不,对不起,我把数学搞砸了。这不是转置矩阵的解,而是(1,3,3,-2)的解.这是合乎逻辑的,因为单纯形Cholesky只适用于自伴矩阵!它在Eigen中也被弃用。由Eigen的主要开发人员回答!感谢您在Eigen方面的出色工作。