c++ - 特征稀疏求解器错误结果
问题描述
我正在尝试使用 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
解决方案
推荐阅读
- c# - 如何快速将文件重写为字节数组C#
- tsql - 如何从此查询或 CTE 中查看?
- java - 使用 parseObject 实现 RecyclerView 但出现空白屏幕
- python - 如何在 Python 中确定扑克牌中的顺子(序列)
- c# - Unity / 克隆的敌人不能按预期工作 / C#
- java - Android Room - 错误:无法弄清楚如何将此字段保存到数据库中
- apache - Apache 未向 PHP 报告 HTTPS 服务器变量
- ffmpeg - ffmpeg 覆盖图像,淡入淡出
- java - Lambda 表达式和静态或实例字段
- java - ReentrantLock.tryLock() 是如何工作的,从源代码看来它不使用同步块或函数