Ich habe eine Funktion in MATLAB, die eine andere Funktion als Argument übernimmt. Ich möchte irgendwie eine stückweise Inline-Funktion definieren, die übergeben werden kann. Ist das in MATLAB irgendwie möglich?
Bearbeiten: Die Funktion, die ich darstellen möchte, ist:
%Vor%Sie haben wirklich eine stückweise Funktion mit drei Bruchpunkten definiert, d. h. bei [0, 0,5, 1]. Sie haben den Wert der Funktion jedoch nicht außerhalb der Pausen definiert. (Übrigens habe ich hier den Begriff "Pause" verwendet, weil wir wirklich eine einfache Form von Spline definieren, einen stückweise konstanten Spline. Ich hätte vielleicht auch den Begriff "knot" verwenden können, ein anderes gebräuchliches Wort in der Welt der Splines. )
Wenn Sie absolut wissen, dass Sie die Funktion außerhalb von [0,1] nie auswerten werden, dann gibt es kein Problem. Definieren Sie also einfach eine stückweise Funktion mit EINEM Unterbrechungspunkt bei x = 0,5. Die einfache Möglichkeit, eine stückweise konstante Funktion wie Ihre zu definieren, besteht darin, einen logischen Operator zu verwenden. Daher gibt der Test (x & gt; 0,5) eine Konstante zurück, entweder 0 oder 1. Durch Skalieren und Übersetzen dieses Ergebnisses ist es einfach, eine Funktion zu erzeugen, die das tut, was Sie wünschen.
%Vor%Eine Inline-Funktion macht eine ähnliche Sache, aber Inline-Funktionen sind sehr langsam im Vergleich zu einer anonymen Funktion. Ich würde dringend die Verwendung des anonymen Formulars empfehlen. Versuchen Sie als Test:
%Vor%Ja, die Inline-Funktion benötigte viel mehr Zeit für die Ausführung als das anonyme Formular.
Ein Problem mit der einfachen stückweise konstanten Form, die ich hier benutzt habe, ist es schwierig zu erweitern, wenn Sie mehr Breakpoints haben. Angenommen, Sie möchten eine Funktion definieren, die drei verschiedene Werte annimmt, abhängig davon, in welchem Intervall der Punkt liegt? Während dies auch mit kreativer Verwendung von Tests getan werden kann, die sorgfältig verschoben und skaliert werden, kann es unangenehm werden. Zum Beispiel, wie könnte man die stückweise Funktion definieren, die
zurückgibt %Vor%Eine Lösung ist die Verwendung einer Heaviside Funktion. Definieren Sie zuerst eine Basiseinheit Heaviside-Funktion.
%Vor%Unsere stückweise Funktion wird jetzt von H (x) abgeleitet.
%Vor%Siehe, dass es drei Stücke zu P (x) gibt. Der erste Term ist, was für x unter dem ersten Breakpoint passiert. Dann fügen wir ein Stück hinzu, das über Null wirkt. Schließlich fügt das dritte Stück einen weiteren Versatz in oben x == 1 hinzu. Es ist leicht genug geplottet.
%Vor%Von diesem Anfang an werden einfachere Splines erzeugt. Se, dass ich dieses Konstrukt wieder einen Spline genannt habe. Wirklich, hier könnten wir führen. In der Tat, das ist, wo dies führt. Ein Spline ist eine stückweise Funktion, die sorgfältig an einer Liste von Knoten oder Knickpunkten zusammengehalten wird. Insbesondere bei Splines gibt es oft festgelegte Kontinuitätsreihenfolgen, so wird beispielsweise ein kubischer Spline in den Pausen zweimal differenzierbar (C2). Es gibt auch stückweise kubische Funktionen, die nur C1-Funktionen sind. Mein Punkt in all dem ist, dass ich einen einfachen Anfangspunkt beschrieben habe, um jede stückweise Funktion zu bilden. Es funktioniert ziemlich gut für Polynomsplines, obwohl es ein kleines bisschen Mathematik erforderlich sein kann, um die Koeffizienten dieser Funktionen zu wählen.
Eine andere Möglichkeit, diese Funktion zu erstellen, ist ein explizites stückweises Polynom. In MATLAB haben wir die wenig bekannte Funktion mkpp. Probieren Sie es aus ...
%Vor%Hattest du die Spline-Toolbox, dann wird fnplt das direkt für dich plotten. Angenommen, Sie haben diese TB nicht, tun Sie dies:
%Vor%Wenn wir uns den Aufruf von mkpp ansehen, ist das doch ziemlich einfach. Das erste Argument ist die Liste der Breakpoints in der Kurve (als ROW-Vektor). Das zweite Argument ist ein COLUMN-Vektor mit den stückweise konstanten Werten, die die Kurve in diesen beiden definierten Abständen zwischen den Pausen annehmen wird.
Vor einigen Jahren habe ich eine andere Option veröffentlicht: piecewise_eval . Es kann vom MATLAB Central-Dateiaustausch heruntergeladen werden. Dies ist eine Funktion, die es einem Benutzer ermöglicht, eine stückweise Funktion rein als eine Liste von Unterbrechungspunkten zusammen mit funktionalen Teilen zwischen diesen Unterbrechungen zu spezifizieren. Für eine Funktion mit einem einzigen Bruch bei x = 0,5 würden wir dies tun:
%Vor%Sehen Sie, dass das dritte Argument den in jedem Segment verwendeten Wert angibt, obwohl diese Teile keine rein konstanten Funktionen sein müssen. Wenn Sie möchten, dass die Funktion vielleicht ein NaN außerhalb des interessierenden Intervalls zurückgibt, ist dies ebenfalls problemlos möglich.
%Vor%Mein Punkt bei dieser ziemlich langen Exkursion ist zu verstehen, was eine stückweise Funktion ist, und mehrere Möglichkeiten, um eine in MATLAB zu erstellen.
Leider hat MATLAB keinen ternären Operator, der solche Dinge leichter machen würde, aber um gnovices Ansatz etwas zu erweitern, könnten Sie eine anonyme Funktion wie folgt erstellen:
%Vor%Im Allgemeinen sind anonyme Funktionen leistungsfähiger als Inline-Funktionsobjekte und ermöglichen das Erstellen von Schließungen usw.
Wenn Sie wirklich eine Inline-Funktion erstellen möchten (im Gegensatz zu einem anonymen Funktion ), dann wäre das folgende wahrscheinlich der einfachste Weg:
%Vor%Wie jedoch in den anderen Antworten ausgeführt, werden anonyme Funktionen häufiger verwendet und sind effizienter:
%Vor%Ich musste dieses Problem nur lösen, und ich denke, am einfachsten ist es, anonyme Funktionen zu verwenden. Angenommen, Sie haben eine stückweise Funktion:
%Vor%Ich würde zuerst logische Masken für jede stückweise Region definieren:
%Vor%Dann würde ich sie alle zusammensetzen:
%Vor%