1

Accelerate / LAPACKを使用して、非正方形のアンダー/オーバーコンストレイント行列を解くことは可能ですか?次の2つの行列など。変数が制約されている場合、それらは無限ではなく0に等しくなります。

したがって、制約が不足している場合:A、D、およびEは0に等しく、B、C、およびFは-1に等しくなります。

過度に制約された場合、すべての変数は-1に等しくなります。

制約下:

 ____                        ____
| (A) (B) (C) (D) (E) (F)        |
| -1   0   0   1   0   0   |  0  |
|  1   0   0   0  -1   0   |  0  |
|  0  -1   1   0   0   0   |  0  |
|  0   1   0   0   0  -1   |  0  |
|  0   1   0   0   0   0   | -1  |
|____                        ____|

過度の制約:

 ____                        ____
|                                |
| -1   0   0   1   0   0   |  0  |
|  1   0   0   0  -1   0   |  0  |
|  0  -1   1   0   0   0   |  0  |
|  0   1   0   0   0  -1   |  0  |
|  0   1   0   0   0   0   | -1  |
|  0   0   1  -1   0   0   |  0  |
|  1  -1   0   0   0   0   |  0  |
|____                        ____|
4

1 に答える 1

1

はい!

void SolveUnderdeterminedSystem() {

    __CLPK_integer m = 5;
    __CLPK_integer n = 6;
    __CLPK_integer nrhs = 1;
    double A[30] = {
        -1.0,  1.0,  0.0,  0.0,  0.0,
         0.0,  0.0, -1.0,  1.0,  1.0,
         0.0,  0.0,  1.0,  0.0,  0.0,
         1.0,  0.0,  0.0,  0.0,  0.0,
         0.0, -1.0,  0.0,  0.0,  0.0,
         0.0,  0.0,  0.0, -1.0,  0.0
    };
    __CLPK_integer lda = 5;
    double x[6] = { 0.0, 0.0, 0.0, 0.0, -1.0, 0.0 };
    __CLPK_integer ldb = 6;
    /* Need to allocate at least 2*min(m,n) workspace. */
    double work[12];
    __CLPK_integer workSize = 12;
    __CLPK_integer info;

    dgels_("N", &m, &n, &nrhs, A, &lda, x, &ldb, work, &workSize, &info);

    if (info)
        printf("Could not solve system; dgels exited with error %d\n", info);
    else
        printf("Solution is [%f, %f, %f, %f, %f, %f]\n",
               x[0], x[1], x[2], x[3], x[4], x[5]);
}

同じルーチンは、最小二乗の意味で過剰決定系も解きます(結果は残余|| Ax --b ||の最小化になります)。

dgels_行列がフルランク(つまり、rank(A)= min(m、n))であると仮定していることに注意してください。そうでない場合はdgelsd_、QRの代わりにSVD因数分解を使用する別のルーチン()を使用する必要があります。

LAPACKについてたくさん質問されているようです。ドキュメントを読むことはあなたの時間の価値があるでしょう。

于 2010-11-30T22:44:20.660 に答える