gpt4 book ai didi

c++ - Eigen 稀疏求解器错误结果

转载 作者:行者123 更新时间:2023-12-01 14:38:50 25 4
gpt4 key购买 nike

我正在尝试使用C++中的Eigen库解决稀疏线性系统 Ax = B 的问题,但是以下琐碎的示例似乎给出了错误的解决方案:

#include <Eigen/SparseCholesky>
#include <Eigen/Dense>
#include <Eigen/Sparse>
#include <iostream>
#include <vector>

using namespace std;
using namespace Eigen;

int main(){

SimplicialLDLT<SparseMatrix<double>> solver;
SparseMatrix<double> A(9,9);
typedef Triplet<double> T;
vector<T> triplet;
VectorXd B(9);

for(int i=0; i<4; i++){
triplet.push_back(T(i,i,1));
triplet.push_back(T(i+5,i+5,1));
}

triplet.push_back(T(4,1,-1));
triplet.push_back(T(4,3,-1));
triplet.push_back(T(4,5,-1));
triplet.push_back(T(4,7,-1));
triplet.push_back(T(4,4,4));

A.setFromTriplets(triplet.begin(),triplet.end());
B << 0,0,0,0,0.387049,0,0,0,0;

solver.compute(A);
VectorXd x = solver.solve(B);

cout << "A\n" << A << "\n";
cout << "B\n" << B << "\n";
cout << "x\n" << x << "\n";

return 0;
}
我没有看到任何错误,算法返回“0”表示“成功”,但是我得到的解决方案是
x = 0 0.193524 0 0.193524 0.193524 0 0 0 0
这显然不是该系统的解决方案,正确的是
x = 0 0 0 0 0.0967621 0 0 0 0

最佳答案

Here's documentation用于SimplicialLDLT求解器:

This class provides a LDL^T Cholesky factorizations without square root of sparse matrices that are selfadjoint and positive definite.


当矩阵在元素中存储实数时,自伴==对称。您的矩阵显然不对称。同样,并非每个对称矩阵都是正定的 see examples
简而言之,您选择的求解器仅适用于非常狭窄的一类矩阵。正如您已经发现的, SparseLU求解器可用于您的输入数据。 ConjugateGradient求解器也不起作用,它不需要矩阵为正定,但 it does要求矩阵为自伴。

关于c++ - Eigen 稀疏求解器错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63583888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com