最近我发现在某些特定情况下,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
关于读取csv文件和解决系统的完整数据和代码上传到:
https://github.com/cpc-tyym/SparseLU-eg
因为效率,我真的更喜欢sparselu求解器,但是这个错误让我选择了pardiso求解器,它比sparselu求解器慢3倍。那么任何人都可以找出 sparselu 求解器是否在某个地方出错,或者我在求解方程时是否犯了任何错误?