|
|
lsqcurvefit einer Funktion im Integranden |
|
jac |

Forum-Newbie
|
 |
Beiträge: 7
|
 |
|
 |
Anmeldedatum: 24.06.14
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 24.06.2014, 11:13
Titel: lsqcurvefit einer Funktion im Integranden
|
 |
|
 |
|
Hallo Leute,
meine Frage ist etwas speziell, aber vielleicht kann mir jemand den entscheidenden Tip geben oder hat eine Idee. Ich habe folgendes Problem:
Ich möchte eine Funktion definieren, innerhalb derer eine (Gauss-Kronrod-)Integration stattfindet, also:
Die Funktion myTest ist in einem m-File gespeichert und wird also von x=xmin bix x=xmax integriert. Beispiel für die Funktion:
Die Funktion myFunction hängt dann nur noch vom Parameter a ab. Soweit, so gut, das funktioniert auch alles.
Jetzt habe ich aber das Problem, dass die Funktion myFunction mithilfe der Routine lsqcurvefit an einen Daten-Vektor A angepasst werden soll. Um dies tun zu können, muss die myFunction also auswertbar sein indem ihr als Variable a ein Vektor A übergeben wird, also Beispiel:
Dies ist jedoch leider nicht Möglich, da Matlab dann versucht den Vektor A in der Routine quadgk einzusetzen und es dort dann zu einem Dimensionsproblem kommt. Es soll quasi komponentenweise für jeden Wert in A integriert werden und als Ausgabe ein Vektor stehen. Normalerweise würde ich einfach eine Schleife basteln und mir den Vektor selbst befüllen, aber für den Fit mit lsqcurvefit brauche ich eben eine Funktion die Vektorwertig auswertbar ist.
Ich hoffe ich habe das Problem verständlich gemacht ^^
Hat jemand eine Idee?
|
|
|
|
|
jac |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 7
|
 |
|
 |
Anmeldedatum: 24.06.14
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 24.06.2014, 17:27
Titel:
|
 |
|
 |
|
Hallo nochmal,
da ich mittlerweile eine Möglichkeit zur Lösung gefunden habe, möchte ich diese hier noch kurz reinstellen und den Thread dann als beantwortet deklarieren.
Es ist eigentlich ganz einfach, indem ich mir den Vektor doch manuell mit einer Schleife bastel, dieses aber einfach in einer extra Funktion stattfindet. Ich weiß nicht ob dass die eleganteste Lösung ist, sicher gibt es noch andere Möglichkeiten, aber aktuell reicht es für meine Bedürfnisse auch. (sollte jemand eine elegantere Variante kennen, immer her damit :> )
Man erstellt also eine neue Funktion in etwa so:
Es wird also, wie von lsqcurvefit erwünscht, eine Funktion der Form F(x,xdata) erstellt (bzw. in diesem Fall statt x eben pars, um Verwirrung mit der Integrationsvariablen in quadgk zu vermeiden), in der x (bzw. pars) die zu fittenden Parameter sind und xdata der Datenvektor. Innerhalb der Funktion wird der "Antwort-Vektor" (für lsqcurvefit als Zeilen-Vektor) dann einfach per Schleife step by step erstellt, um das Dimensions-Problem in quadgk zu umgehen.
Keine große Sache eigentlich... aber manchmal hängt man halt auch mal an kleineren Dingen
Der Vollständigkeit halber hier den restlichen Code, um das Beispiel in Verbindung mit obiger Funktion zum Laufen zu bringen (jeden Code-Block als m-File speichern).
Funktion myTest.m:
main.m ("simuliert" Daten entsprechend der Testfunktion und fittet anschließend an diese generierten Daten):
Mangels Abweichungen von der idealen Kurvenform stürzt hier lsqcurvefit allerdings mit einem exitflag 2 oder 3 zusammen. Dazu einfach beliebige Fehler mitsimulieren.
greets
|
|
|
|
|
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 - 2025
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.
|
|