如何解决Eigen中SparseLU的计算错误C++
最近我发现在某些情况下,SparseLU 求解器会得到错误的答案。
我在附件中举了一个例子,其中“A.csv”是方程Ax=b的系数矩阵,“b.csv”是方程的右边部分。
代码如下:
// solve the linear system: Ax = b
Eigen::VectorXd sparselu_x,pardisolu_x;
SparseLU<spmat> solver_splu;
PardisoLU<spmat> solver_pdslu;
// SparseLU results
solver_splu.compute(A);
sparselu_x = solver_splu.solve(b);
// PardisoLU results
solver_pdslu.compute(A);
pardisolu_x = solver_pdslu.solve(b);
// print some of the difference
cout << "sparselu results - pardisolu results (last 5 items):\n\n" << (sparselu_x - pardisolu_x).tail(5) << endl;
cout << "\n\n\n\nA*x - b (sparselu results,last 5 items):\n\n" << (A * sparselu_x - b).tail(5) << endl;
cout << "\n\n\n\nA*x - b (pardisolu results,last 5 items):\n\n" << (A * pardisolu_x - b).tail(5) << endl;
和输出:
sparselu results - pardisolu results (last 5 items):
6.25516e-10
6.36814e-08
-1.45986e-05
-0.0170633
-0.437249
A*x - b (sparselu results,last 5 items):
0
1.81899e-12
-1.81899e-12
18.0459
621.588
A*x - b (pardisolu results,last 5 items):
1.81899e-12
0
0
0
0
https://github.com/cpc-tyym/SparseLU-eg
因为效率,我真的更喜欢sparselu求解器,但是这个错误让我选择了pardiso求解器,它比sparselu求解器慢3倍。那么谁能找出 sparselu 求解器是否在某个地方出错了,或者我在求解方程时是否犯了任何错误?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。