首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LCP的投影Gauss

LCP的投影Gauss
EN

Stack Overflow用户
提问于 2012-07-30 10:32:33
回答 2查看 7.1K关注 0票数 11

我正在寻找投影Gauss算法的C#实现,用于求解线性互补问题。到目前为止,我已经在C++库中找到了用项目符号编写的,但不幸的是,它是高度优化的(因此很难将其转换为C#)。

相似问题中,有人建议看一看.NET的数值库。它们都只包含求解线性方程组的算法。

编辑:,即使我找到了一个,它似乎还没有完成,所以问题仍然没有解决。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-23 03:32:39

你没有投影就实现了Gauss Seidel。对于投影Gauss Seidel,需要在下限和上限内投影(或夹紧)解决方案:

代码语言:javascript
复制
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;
}

这是个小小的改动。这里有一个要点,展示了如何从弹物理库中提取A矩阵和b向量,并使用投影Gauss:https://gist.github.com/erwincoumans/6666160来求解它。

票数 11
EN

Stack Overflow用户

发布于 2012-08-02 09:53:51

经过一周的搜索,我终于找到了的出版物(俄文,基于Kenny的作品)。描述了投影Gauss算法,并利用沙尔和终止条件对算法进行了扩展.所有这些都是C++中的示例,我在这个基本的C#实现中使用了这些示例:

代码语言:javascript
复制
public static double[] Solve (double[,] matrix, double[] right,
                              double relaxation, int iterations)
{
    // 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]);
        }
    }

    return x;
}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11719704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档