2010-11-30 1 views
1

Accelerate/LAPACK을 사용하여 비선형 언더/오버 제한 행렬을 해결할 수 있습니까? 다음 두 행렬과 같이. 임의의 변수가 제약 조건 아래에 있으면 무한 대신 0과 같아야합니다.Accelerate/LAPACK을 사용하여 비 구형 언더/오버 제한 행렬을 해결할 수 있습니까?

제한된 경우 : 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

예! (결과 잔류 || 도끼의 마이저 것 - || B)

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]); 
} 

동일한 루틴은 최소 제곱 의미 오버 결정 시스템을 해결한다.

은 행렬이 전체 랭크 (rank (A) = min (m, n))를 갖는다 고 가정한다. 그렇지 않은 경우 QR 대신 SVD 인수 분해를 사용하는 다른 루틴 (dgelsd_)을 사용해야합니다.

LAPACK에 대해 많은 질문을하는 것 같습니다. the documentation을 읽는 것이 좋습니다.

+0

리뷰에서 대학생의 책을 찾는 시도를했지만 시도 할 수 없었습니다. 죄송합니다. 또한 대답은 – John

+0

@ 존 : 행렬 계산을 많이하려고한다면, 당신은 LAPACK 책의 복사본을 구입할 수 있습니다; 그것은 상당히 싸다. –