作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在寻找用于求解 linear complementarity problem 的投影高斯-赛德尔算法的 C# 实现.到目前为止,我在 Bullet 中找到了用 C++ 编写的那个。库,但不幸的是它经过了高度优化(因此很难将其转换为 C#)。
在similar问题一建议看一下numerical libraries for .NET .它们都只包含解决 systems of linear equations 的算法.
编辑:即使我找到了一个,它似乎并不完整,所以问题仍然悬而未决。
最佳答案
您在没有投影的情况下实现了高斯赛德尔。对于投影高斯赛德尔,您需要将解投影(或钳制)在下限和上限内:
public static double[] Solve (double[,] matrix, double[] right,
double relaxation, int iterations,
double[] lo, double[] hi)
{
// Validation omitted
var x = right;
double delta;
// Gauss-Seidel with Successive OverRelaxation Solver
for (int k = 0; k < iterations; ++k) {
for (int i = 0; i < right.Length; ++i) {
delta = 0.0f;
for (int j = 0; j < i; ++j)
delta += matrix [i, j] * x [j];
for (int j = i + 1; j < right.Length; ++j)
delta += matrix [i, j] * x [j];
delta = (right [i] - delta) / matrix [i, i];
x [i] += relaxation * (delta - x [i]);
// Project the solution within the lower and higher limits
if (x[i]<lo[i])
x[i]=lo[i];
if (x[i]>hi[i])
x[i]=hi[i];
}
}
return x;
}
这是一个小的修改。这是一个要点,展示了如何从 Bullet Physics Library 中提取 A 矩阵和 b 向量并使用投影高斯赛德尔解决它:https://gist.github.com/erwincoumans/6666160
关于c# - LCP 的投影高斯-赛德尔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11719704/
我是一名优秀的程序员,十分优秀!