【问题标题】:incremental conjugate gradient algorithm增量共轭梯度算法
【发布时间】:2012-08-15 03:44:00
【问题描述】:

我编写了这段代码,应该可以实现这里描述的内容:

Conjugate Gradient from wikipedia

但经过一些迭代后,变量denomAlpha 变为零,所以我在alpha 上得到了一个 NAN。那么我的算法有什么问题呢?

import Jama.Matrix;

public class ConjugateGrad {

    private static final int MAX_IT = 20;
    private static final int MAX_SIZE = 50;

    public static void main(String[] args)  {
        Matrix A = Matrix.random(MAX_SIZE, MAX_SIZE);
        Matrix b = Matrix.random(MAX_SIZE, 1);

        double[][] d = new double[MAX_SIZE][1];
        for(int ii=0;ii<MAX_SIZE;ii++) {
            d[ii][0] =0;
        }

        Matrix x = Matrix.constructWithCopy(d);
        Matrix r = b.minus(A.times(x));
        Matrix p = r;
        Matrix rTrasp_r = r.transpose().times(p);

        for (int i = 0; i < MAX_IT; i++) {
            Matrix denomAlpha = p.transpose().times(A.times(p));
            double numeratorAlpha = rTrasp_r.getArray()[0][0];
            double Alpha = numeratorAlpha / denomAlpha.getArray()[0][0];
            x = x.plus(p.times(Alpha)); 
            r = r.minus(A.times(p));  
            Matrix rNew = r.transpose().times(r); 
            if (Math.sqrt(rNew.getArray()[0][0]) <1.0e-6) {
                break;
            }
            double Beta = rNew.getArray()[0][0] / rTrasp_r.getArray()[0][0];
            p = r.plus(p.times(Beta));
            rTrasp_r = rNew;           
        }
    }
}

与这些参数相同:

double[][] matrixA = {{4,1},{1,3}};
Matrix A = Matrix.constructWithCopy(matrixA);    
double[][] vectorb = {{1},{2}};
Matrix b = Matrix.constructWithCopy(vectorb);
double[][] d = {{2},{1}};
Matrix x = Matrix.constructWithCopy(d);

在算法的第一步,一切都很好 但在第二步不是...

r: -8.0, -3.0
Alpha: 0.22054380664652568
Beta:   12.67123287671233
x:  0.2356495468277946, 0.33836858006042303, 

第二步:

Alpha: 0.0337280177221555
Beta:  159.11259655226627
x:  -2.2726985108925097, -0.47156587291133856, 

好的,我发现了一个错误:

r = r.minus(A.times(p).times(Alpha));  

现在可以了:

r: -8.0, -3.0, 
Alpha: 0.22054380664652568
rNew: 0.6403099643121183, 
Beta: 0.008771369374138607
p:  -0.3511377223647101, 0.7229306048685207, 
x:  0.2356495468277946, 0.33836858006042303, 

【问题讨论】:

  • 此代码在矩阵为半正定矩阵时工作...例如 A trasp time A 或 A time A trasp

标签: java algorithm optimization


【解决方案1】:

对不起,黑客的答案,但是......使用维基百科文章中的数字示例参数并在每一步将矩阵输出到终端可能会发现差异。

【讨论】:

  • 我会对结果发表评论
  • 太好了,期待。
  • r为:-8.0,-3.0,阿尔法:0.22054380664652568贝塔:12.67123287671233 x是:0.2356495468277946,0.33836858006042303,阿尔法:0.0337280177221555贝塔:159.11259655226627 x是:-2.2726985108925097,-0.47156587291133856,跨度>
  • 我编辑了这个问题,因为对于 cmets,你们都无法理解
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
相关资源
最近更新 更多