|
|
Fortran-Bibliothek in Matlab einbinden |
|
needHelp |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 19.10.2011, 08:06
Titel: Fortran-Bibliothek in Matlab einbinden
|
|
Hallo,
ich hab mal eine Frage: ist es möglich eine Fortran Bibliothek in Matlab einzubinden, um die Funktionen zu nutzen. Mit den Matlab-eigenen Funktionen komm ich leider nicht weiter.
Vielen Dank im Vorraus
NeedHelp
|
|
|
|
|
needHelp |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 19.10.2011, 09:25
Titel:
|
|
Hallo,
ich habe inzwischen Herausgefunden, dass das ganze möglich ist, nur komm ich leider nicht weiter, so weit reicht mein Verständnis von Matlab nicht aus.
Irgendwie muss ja eine Zwischen-Funktion schreiben, damit Matlab mit dem Fortran-Code rechnen kann, nur wie das geht entzieht sich leider meiner Kentniss und mit den gefundenen Beispielen komm ich auch nicht viel weiter. Hat jemand schon mal so etwas gemacht?
Viele Grüße
needHelp
|
|
|
Andreas Goser |
Forum-Meister
|
|
Beiträge: 3.654
|
|
|
|
Anmeldedatum: 04.12.08
|
|
|
|
Wohnort: Ismaning
|
|
|
|
Version: 1.0
|
|
|
|
|
|
Verfasst am: 19.10.2011, 09:58
Titel:
|
|
Die "Zwischenfunktion" dürfte ein MEX File sein. Da gibt es in der Doku auch Beispiele zu FORTRAN MEX Files.
Andreas
|
|
|
needHelp |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 19.10.2011, 10:23
Titel:
|
|
Vielen Dank für die Antwort, dass mit den MEX-File ist mir schon klar. Weißt du ob es da irgenwo eine verständliche Erklärung gibt, wie so etwas programmiert werden muss. Anhand der Beispiele bin ich bis jetzt leider nicht weitergekommen.
Vielen Dank
NeedHelp
|
|
|
Andreas Goser |
Forum-Meister
|
|
Beiträge: 3.654
|
|
|
|
Anmeldedatum: 04.12.08
|
|
|
|
Wohnort: Ismaning
|
|
|
|
Version: 1.0
|
|
|
|
|
|
Verfasst am: 19.10.2011, 10:48
Titel:
|
|
Ich selber kann / weiss das nicht, aber dafür gibt es ja den MathWorks Technischen Support.
Meiner Erfahrung nach werden 95%+ der MEX Files in C geschrieben und die paar FORTRAN Nutzer kommen überwiegend aus der Luft- und Raumfahrtindustrie. Daher kann es sein, das in der gomatlab Community nicht viel Know-How dazu existiert.
Andreas
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 19.10.2011, 17:04
Titel:
|
|
|
|
|
Hallo needHelp,
James Tursa hat im CSSM-Forum und in der FEX (http://www.mathworks.com/matlabcentral/fileexchange/) viel über Fortran-mex-Files geschrieben. Google findet einiges dazu.
Für Standard-Aufgaben findet man aber auch in goMatlab genügend Knowhow - neben den Luft- und Raumfahrt-Technikern arbeiten auch die Numeriker immer noch mit FORTRAN...
Man kann eine Fortran-Bibliothek auf zwei Arten aufrufen:
1. Als DLL, wenn man sie z.B. wie LAPACK als eigenständige Library implementiert. Per LOADLIBRARY und CALLLIB kann man direkt aus Matlab darauf zugreifen.
2. Über die mexFunction Gateway-Funktion, die in den Beispielen eigentlich recht schlüssig zu verstehen ist. Ich finde 22 F-Files in <matlabroot>\extern\examples\, die Einblicke in die verschiedenen mx*- und mex*-Funktionen bieten.
In der mexFunction wird eigentlich nur wenig gemacht:
a) Die Anzahl und der Type der Inputs wird getestet.
b) Die Matlab-Variablen haben den Type mxArray. Von ihnen werden die Zeiger auf die Nutzdaten mit mxGetPr (für DOUBLEs) oder mxGetData (für alle nicht-DOUBLEs) extrahiert.
c) Diese Arrays können dann an die FORTRAN-Funktionen weitergegeben werden und dort wie üblich verwendet werden. Man muss nur beachten, dass man nicht in die Inputs schreiben darf, sondern erst eine Kopie erzeugen muss.
d) Danach wird wieder in die mexFunction zurückgesprungen und die Outputs werden wieder in mxArray's gepackt, damit MATLAB sie versteht. Siehe "mxCreateNumericArray".
Zusätzlich kann man die verschiedenen mx* und mex*-Funktionen verwenden, aber für das Einbinden einer bereits bestehenden FORTRAN-Bibliothek ist das überflüssig.
Wenn Du eine konkrete Frage stellst, kannst Du hier bestimmt ein paar Tipps bekommen. Das Posten des vorhandenen Codes ist dabei immer eine gute Idee.
Gruß, Jan
|
|
|
needHelp |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 21.10.2011, 08:21
Titel:
|
|
Hallo,
vielen Dank für die Information, ich brauche von der Fortran-Bibliothek Slatec die Befehle ZBESJ und ZBESY. Hier werden die Besselfunktionen anders als in Matlab berechnet, dadurch erhalte ich hoffentlich endlich die richtigen Werte.
Hat das Jemand schon mal gemacht?
Viele Grüße
NeedHelp
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 21.10.2011, 08:36
Titel:
|
|
Hallo,
mit anderen Worten: du meinst, dass MATLAB die Bessel-Funktionen nicht korrekt berechnet? Kannst du das näher ausführen?
Interessanterweise ist in der Doku von besselj und ähnlichen beschrieben, dass (zumindest in 2011b) zur Berechnung ohnehin Fortran-MEX files, allerdings wohl aus einer anderen Quelle, verwendet werden.
Grüße,
Harald
|
|
|
needHelp |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 21.10.2011, 08:48
Titel:
|
|
Hallo,
ich versuche momentan Graphen zu berechnen, bei denen ich die Besselfunktionen und deren Ableitungen nehmen. Bei großen Eingabewerten scheinen die Besselfunktionen instabil zu werden. Ich habe jetzt von jemanden den Tipp bekommen, es doch mal mit den Bessel-Funktionen aus Fortran zu probieren, da die Besselfunktionen dort auf einen andere Art und Weise gelöst werden und somit stabiler sein sollen. Genaueres zu den Hintergründen kann ich allerdings nicht sagen, so genau kenn ich mich auch nicht damit aus.
needHelp
|
|
|
needHelp |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 21.10.2011, 08:50
Titel:
|
|
ach ja, bevor ichs vergesse, ich nutze die Matlab Version 2007!
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 21.10.2011, 09:20
Titel:
|
|
Hallo,
kannst du da Test-Code zur Verfügung stellen? Am besten auch sagen, wo die Ergebnisse von den Erwartungen abweichen. Dann würde ich mir das mal genauer ansehen.
2007b habe ich hier gar nicht, aber ich könnte das mal auf 2008a und 2011b laufen lassen und sehen, ob es Unterschiede gibt.
Grüße,
Harald
|
|
|
needHelp |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 21.10.2011, 09:42
Titel:
|
|
Hallo,
danke für dein Angebot, ich werde es sobald ich wieder zugriff auf meine Daten habe zusammenschreiben und dir auch das passende Stück quellcode zukommen lassen.
Kann aber noch ein paar Stunden dauern
Vielen Dank schon mal
needHelp
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 21.10.2011, 12:49
Titel:
|
|
Hallo needHelp,
Du benötigst neben ZBESJ und ZBESY auch noch D1MACH, I1MACH, ZABS, ZBINU, ZBESH, ZACON, ZBKNU, ZBUNK, ZUOIK, ZMLT, ZS1S2, ...
Das wird also eher kompliziert werden die ganzen Abhängigkeiten in die Bibliothek einzufügen. Sinnvoll wäre es dann wohl, die gesamte SLATEC-Bibliothek direkt in FORTRAN als dynamic link library zu erstellen und per LOADLIBRARY von Matlab aus aufzurufen.
Glücklicherweise hat auch jemand anderes schonmal daran gearbeitet:
http://difdop.polytechnique.fr/wiki....._to_Bessel_Functions_in_C
Hilft Dir das weiter?
Gruß, Jan
|
|
|
needHelp |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 21.10.2011, 13:53
Titel:
|
|
Hallo,
danke für den Tip, werds am Montag auf der Arbeit mal ausprobieren.
Viele Grüße
NeedHelp
|
|
|
needHelp |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 24.10.2011, 07:35
Titel:
|
|
|
|
|
Hallo,
so nun mein etwas gekürzter Quellcode. Mit deinem Tip, Jan bin ich leider nicht viel weiter gekommen. Ich weiß dass es so gehen muss, habe aber Probleme bei der Umsetzung in Matlab da ich in diesem Bereich einfach nicht fit genug bin.
Zum Verwenden der Funktionen: test1 ruft test2 auf, welche wiederum abesj und abesy aufruft (diese zwei Funktionen berechnen die Ableitung der Besselfunktionen mithilfe von Rekursion)
Mein Problem ist, dass durch die Instabilität die von test1 ausgegebene Graphik ab einem bestimmten Wert (kurz nach 10^2) linear wird und nicht weiterhin steigt. Der Fehler liegt vermutlich bei den Bessel-Funtionen, die Formeln sind alle mehrfach geprüft und sollten stimmen.
Um die passende Graphik zu erhalten, habe ich die Übergabeparameter für test1 fest vorgegeben.
Vielen Dank schon mal im Voraus.
needHelp
Beschreibung: |
|
Download |
Dateiname: |
test1.m |
Dateigröße: |
1.33 KB |
Heruntergeladen: |
587 mal |
Beschreibung: |
Berechnung mithilfe der Besselfunktionen |
|
Download |
Dateiname: |
test2.m |
Dateigröße: |
3.97 KB |
Heruntergeladen: |
549 mal |
Beschreibung: |
Ableitung Bessel-Funktion |
|
Download |
Dateiname: |
abesy.m |
Dateigröße: |
681 Bytes |
Heruntergeladen: |
567 mal |
Beschreibung: |
|
Download |
Dateiname: |
abesj.m |
Dateigröße: |
681 Bytes |
Heruntergeladen: |
684 mal |
|
|
|
|
Gehe zu Seite 1, 2 Weiter
|
Einstellungen und Berechtigungen
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2024
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.
|
|