Einzelnen Beitrag anzeigen

zahor

Registriert seit: 27. Jun 2006
Ort: im hintersten Winkel des RAMs
182 Beiträge
 
Delphi 2007 Professional
 
#1

FORTRAN90: Matrizen-System loesen (LAPACK)

  Alt 15. Aug 2008, 15:23
Hi DPler,

tut mir Leid wegem der Textmenge, aber mein Problem ist folgendes:
Und zwar uebersetzte ich gerade ein Script von Matlab nach Fortran.
Von mir aus koennte es ja Matlab bleiben, aber ich programmiere das ja nicht fuer mich,
sondern fuer ein physikalisches Projekt an nem Forschungsinstitut.
Die Matlab-Stelle sieht so aus:
Code:
A=B\M
Dabei sind sowohl A, B als auch Matrizen vom Typ Double Complex (Komplexe Zahlen mit erhoehter Genauigkeit).
Ihre Groesse sei n x n.
Ich hab mir dann gedacht - klar, ist ja logisch, a=b\m heisst soviel wie a=INVERSE(b)*m - so ist der Matlab-Operator \ definiert. also invertiere ich zuerst Matrix B und multipliziere sie dann mit M. Fuer die Multiplikation hat ifort (der verwendete Fortran-compiler) eine eingebaute Funktion. Fuer die Invertierung habe ich folgende LAPACK-Routinen gefunden, und auch versucht, sie zu verwenden.
Code:
! LU-Factorisation of M
call zgetrf(n, n, b, n, ipiv, info)
PRINT *, "Successfully LU-Factorised Matrix 2", info

! Invert it
call zgetri(n, b, n, ipiv, work, lwork, info)
PRINT *, "Successfully inverted Matrix 2!", info

A=MATMUL(b,m)
PRINT *,"Successfully multiplied matrices"
dabei hat IPIV - ein Integer-Array - die Dimension n, und lwork (typ integer) den Wert 1594, was gleichzeitig auch die Dimension von Work ist - das ist uebrigens 2n. info ist ein Ausgabewert (integer), sozusagen der Fehlercode.
nun gibt info aber bei den beiden oberen Werten 28 zurueck.
Die Dokumentation zu den obigen befehlen findet ihr hier fuer zgetrf und hier fuer zgetri. Die Links sind zwar fuer die Variante mit Single Precision, das macht bei den Parametern aber keinen Unterschied.
Fehlercode 28 sagt mir jetzt also, dass meine Matrix ungeeignet ist. Die Frage ist nun - wie aendere ich die Matrix so, dass die Funktion sie annimmt?
Der Matlab-Dokumentation (klick) ist zu entnehmen, dass es dazu die Routinen ZLANGE, ZGESV, ZGECON verwendet. ZGESV mag meine Matrix aber auch nicht und gibt auch 28 als Fehlercode zurueck. mein Problem mit ZLANGE und ZGECON ist allerdings, dass ich nicht weiss, welche der verschiedenen Anwendungsmoeglichkeiten die richtige ist! Oder sind das gar nicht die "richtigen" Funktionen? sollte ich vllt. was ganz anderes probieren? jede hilfe ist willkommen!
Real Programmers always confuse Christmas and Halloween because Oct31 = Dec25. - Andrew Rutherford
  Mit Zitat antworten Zitat