Можно ли решить неквадратичную матрицу с заниженным / пониженным ограничением, используя Accelerate / LAPACK? - PullRequest
1 голос
/ 01 декабря 2010

Можно ли решить неквадратичную матрицу с заниженным / пониженным ограничением, используя Accelerate / LAPACK?Например, следующие две матрицы.Если какие-либо переменные ограничены, они должны равняться 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  |
|____                        ____|

1 Ответ

1 голос
/ 01 декабря 2010

Да!

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_ предполагает, что матрица имеет полный ранг (то есть, ранг (A) = min (m, n)). Если это не так, вам нужно будет использовать другую процедуру (dgelsd_), которая использует факторизацию SVD вместо QR.

Вы, кажется, задаете много вопросов о LAPACK. Стоит потратить время на прочтение документации .

...