WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Fortran-Bibliothek in Matlab einbinden

 

needHelp

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.10.2011, 08:06     Titel: Fortran-Bibliothek in Matlab einbinden
  Antworten mit Zitat      
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: ---
     Beitrag Verfasst am: 19.10.2011, 09:25     Titel:
  Antworten mit Zitat      
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

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 19.10.2011, 09:58     Titel:
  Antworten mit Zitat      
Die "Zwischenfunktion" dürfte ein MEX File sein. Da gibt es in der Doku auch Beispiele zu FORTRAN MEX Files.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
needHelp

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.10.2011, 10:23     Titel:
  Antworten mit Zitat      
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

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 19.10.2011, 10:48     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 19.10.2011, 17:04     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
needHelp

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.10.2011, 08:21     Titel:
  Antworten mit Zitat      
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

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.10.2011, 08:36     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
needHelp

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.10.2011, 08:48     Titel:
  Antworten mit Zitat      
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: ---
     Beitrag Verfasst am: 21.10.2011, 08:50     Titel:
  Antworten mit Zitat      
ach ja, bevor ichs vergesse, ich nutze die Matlab Version 2007!
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.10.2011, 09:20     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
needHelp

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.10.2011, 09:42     Titel:
  Antworten mit Zitat      
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

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 21.10.2011, 12:49     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
needHelp

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.10.2011, 13:53     Titel:
  Antworten mit Zitat      
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: ---
     Beitrag Verfasst am: 24.10.2011, 07:35     Titel:
  Antworten mit Zitat      
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

test1.m
 Beschreibung:
Haupt-File

Download
 Dateiname:  test1.m
 Dateigröße:  1.33 KB
 Heruntergeladen:  587 mal
test2.m
 Beschreibung:
Berechnung mithilfe der Besselfunktionen

Download
 Dateiname:  test2.m
 Dateigröße:  3.97 KB
 Heruntergeladen:  549 mal
abesy.m
 Beschreibung:
Ableitung Bessel-Funktion

Download
 Dateiname:  abesy.m
 Dateigröße:  681 Bytes
 Heruntergeladen:  567 mal
abesj.m
 Beschreibung:
Ableitung Besselfunktion

Download
 Dateiname:  abesj.m
 Dateigröße:  681 Bytes
 Heruntergeladen:  684 mal
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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 | goMatlab RSS Button 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.