Да!
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. Стоит потратить время на прочтение документации .