2010-11-30 55 views
1

Est-il possible de résoudre un non carré sous/sur la matrice en utilisant contrainte Accélérer/LAPACK? Tels que les deux matrices suivantes. Si des variables sont sous-contraintes, elles doivent être égales à 0 au lieu d'être infinies. Donc, dans le cas sous-contraint: A, D & E serait égal à 0, tandis que B, C & F égal à -1.Est-il possible de résoudre une matrice sous-jacente/surchargée non carrée en utilisant Accelerate/LAPACK?

Dans le cas contraint, toutes les variables seraient égales à -1.

Sous Constrained:

____      ____ 
| (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 | 
|____      ____| 

Plus Constrained:

____      ____ 
|        | 
| -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 | 
|____      ____| 

Répondre

1

Oui!

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

La même routine sera également résoudre surdéterminé systèmes dans le sens des moindres carrés (le résultat sera un minimiseur du résidu || Ax - b ||).

Notez que dgels_ suppose que la matrice a un rang entier (c'est-à-dire, rang (A) = min (m, n)). Si ce n'est pas le cas, vous devrez utiliser une routine différente (dgelsd_) qui utilise une factorisation SVD au lieu de QR.

Vous semblez poser beaucoup de questions sur LAPACK. Il vaudrait la peine de lire the documentation.

+0

J'ai essayé de trouver mon livre dif-eq de l'université pour un examen mais je ne pouvais pas, donc je suis en train de me rappeler comment faire tout cela comme je vais. Pardon. En outre thx pour la réponse – John

+0

@John: Si vous allez faire beaucoup de calculs de la matrice, vous pourriez chose à acheter une copie du livre LAPACK; c'est assez bon marché. –