Optimierungsproblem / Levenberg-Marquardt-Algorithmus



  • Hallo allerseits!

    Problem #1: Ich benötige einen möglichst "stabilen" Optimierungsalgorithmus nach der Methode der kleinsten Quadrate als Teil einer Mess-Software, die ich gerade schreibe.
    Problem #2: Problem #1 übersteigt meine Fähigkeiten in C/C++ nach allen Regeln der (Programmier-)Kunst.

    Also bin ich wohl auf fremden Quellcode angewiesen. Meine Wahl fiel hierbei auf levmar, eine Implementation des sehr verbreiteten Levenberg-Marquardt-Algorithmus'.

    Problem #3: Ich krieg das Ding nicht zum Laufen, weil...
    Problem #4: ...wohl irgendwelche Verrenkungen mit einem Makefile angestellt werden müssen (???ich will doch nur den Code verwenden???) und ...
    Problem #5: ...ich keinerlei Ahnung von Makefiles jedweder Art habe.

    MinGW32-make vermeldet beim Verarbeiten von "makefile.vc" aus dem Paket:

    *** No rule to make target `lm.c', needed by `lm.obj'. Stop.

    nmake von Visual Studio 2008 Espresso meldet schlicht:

    NMAKE : fatal error U1073: "lm.c" konnte nicht erstellt werden
    Stop.

    MSDN sagt hierzu, dass ich mich vertippt haben muss. 🤡

    Wenn ich nach einer Konvertierung der prähistorischen Demo-VC-Projektdatei versuche zu kompilieren kriege ich folgendes entgegnet:

    1>------ Erstellen gestartet: Projekt: lmdemo, Konfiguration: Debug Win32 ------
    1>Kompilieren...
    1>cl : Befehlszeile warning D9035 : Die Option "Wp64" ist veraltet und wird in einer der nächsten Versionen entfernt.
    1>lmdemo.c
    1>LAPACK not available, some test problems cannot be used
    1>Verknüpfen...
    1>LINK : fatal error LNK1181: Eingabedatei "levmar.lib" kann nicht geöffnet werden.
    1>Das Buildprotokoll wurde unter "file://***\Debug\BuildLog.htm" gespeichert.
    1>lmdemo - 1 Fehler, 1 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

    Jetzt sitz ich hier vor einem Scherbenhaufen und fange gleich an zu heulen. Sieht jemand einen schnellen Ausweg aus dem Schlamassel (außer es einfach sein zu lassen)? 😕
    Danke im Voraus!



  • Hallo,

    habe mir das angesehen. Du hättest eigentlich "nur" alles richtig lesen müssen, denn ich konnte alles kompilieren, unter Nutzung des Makefiles, und unter Beachtung von:

    levmar provides the following two options regarding the solution of the linear systems formed by the augmented normal equations:

    If you have LAPACK (or an equivalent vendor library such as Sun's performance library, IBM's ESSL, Intel's MKL, SGI's SCSL, NAG, ...), the included LAPACK-based solvers can be used. This is the default option. The employed solver is based on the LU decomposition. Additionally, for experimenting with other approaches, linear solvers based on the Cholesky and QR decompositions have been supplied.

    If LAPACK is unavailable, a LAPACK-free, LU-based linear systems solver can be used by undefining HAVE_LAPACK in levmar.h.
    Use of LAPACK or an equivalent vendor library is strongly recommended; if none is installed at your site I suggest getting CLAPACK, the f2c'ed version of LAPACK. MSWin users have the additional option of downloading precompiled LAPACK/BLAS libraries from here. You might also consider combining CLAPACK with ATLAS, (the automatically tuned BLAS implementation) or GotoBLAS (K. Goto's high-performance BLAS). On the other hand, LAPACK's use is not mandatory for compiling the unconstrained routines and the second option makes levmar totally self-contained. The linear equation constrained routines, however, cannot be compiled without LAPACK.

    Also (da ich nicht auch noch ein LAPACK hier haben wollte, und du es vielleicht auch nicht installiert hast):

    in levmar.h die Zeile:

    #undef HAVE_LAPACK
    

    entkommentiert, wie oben beschrieben

    Dann README.txt lesen, dort steht:

    1. If you don't have LAPACK or decide not to use it, undefine HAVE_LAPACK in levmar.h
      and a LAPACK-free, LU-based linear systems solver will by used. Also, the line
      setting the variable LAPACKLIBS in the Makefile should be commented out.

    Der erste Teil ist erledigt, beim zweiten wird die in Makefile.vc enthaltene Zeile:

    LAPACKLIBS=clapack.lib blas.lib libF77.lib libI77.lib
    

    wie verlangt, auskommentiert:

    # LAPACKLIBS=clapack.lib blas.lib libF77.lib libI77.lib
    

    Jetzt ein:

    nmake /f Makefile.vc
    

    und die Dateien levmar.lib und lmdemo.exe werden erstellt, man erhält nur Meldungen, dass LAPACK für gewisse Funktionen sinnvoll/nötig wäre.

    MfG,

    Probe-Nutzer



  • Das ist also kein Optimierungsproblem sondern von Anfang an ein build/make-Problem gewesen und hat mit C++ garnichts zut un. Warum dann nicht gleich ins richtige Forum?



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Probe-Nutzer schrieb:

    Hallo,

    habe mir das angesehen. Du hättest eigentlich "nur" alles richtig lesen müssen, denn ich konnte alles kompilieren, ...

    Ok, erstmal danke für die Anstrengungen. Ich habe jetzt nach ewigem Rumprobieren mal das tar.gz-Archiv neu entpackt, weil ich wahrscheinlich schon zu viel wahllos aus- und einkommentiert hatte. Mit den obigen Änderungen klappt es jetzt mit "nmake /f makefile.vc", allerdings kann ich die Dateien noch nicht wirklich weiterverwenden. Es entstehen folgende Dateien:

    Axb.obj
    levmar.lib
    lm.obj
    lmbc.obj
    lmblec.obj
    lmbleic.obj
    lmdemo.exe
    lmdemo.exe.manifest
    lmdemo.obj
    lmlec.obj
    misc.obj

    Scheinbar kann ich die LIB aber nicht mit MinGW verwenden, weil einerseits irgend eine "Manifest-Dependency" bemängelt wird, und andererseits für jede Funktion aus Levmar ein "[Linker Error] undefined reference to ..." entsteht.

    MSVC++ 2008 Express sträubt sich etwas mit dem Demo-Skript, weil das in C und nicht in C++ geschrieben wurde. Außerdem hab ich es noch nie geschafft ein einfaches mit dem Microsoft-Compiler erstelltes Hello-World-Programm auf einem anderen Rechner "out of the box" zum Laufen zu kriegen. 👎

    Hat jemand vielleicht noch eine Idee, wo ich auf dem Holzweg bin? Gibts vielleicht einen anderen, empfehlenswerten, schnellen, frei verfügbaren Optimierungsalgorithmus in C++?

    MfG



  • Heureka.

    Die Datei "Makefile" aus dem Paket funktioniert mit MinGW zusammen. Aber:

    1. im Kommentar der Datei steht gleich am Anfang, dass das nur für Unix/Linux Systeme gedacht ist und man unter Windows die "Makefile.vc" verwenden soll - Bullsh!t
    2. ich bin tausende Male an der Syntax von mingw32-make gescheitert, denn...

    mingw32-make /f makefile
    

    Klappt nicht.

    mingw32-make -f makefile
    

    Klappt.

    Hab ich erst bemerkt, als ich in der Hilfe alternative Schreibweisen gefunden und probiert habe. :p

    -f FILE, --file=FILE, --makefile=FILE Read FILE as a makefile

    Auf jeden Fall habe ich jetzt meine liblevmar.a (sogar mit LAPACK). 😃 Das sind die Momente im Leben eines Autodidakten, an denen man ohne 2 Tage stures Trial-and-Error-Prinzip nicht weiterkommt. 🙄

    Cheers



  • schön, dass du weiter gekommen bist

    pHySiX_RuLeZ schrieb:

    Hat jemand vielleicht noch eine Idee, wo ich auf dem Holzweg bin? Gibts vielleicht einen anderen, empfehlenswerten, schnellen, frei verfügbaren Optimierungsalgorithmus in C++?

    Da mache ich doch glatt mal Werbung 😉

    http://shark-project.sourceforge.net/ReClaM/index.html


Anmelden zum Antworten