Frage

Ich habe einige Differentialgleichungen, die ich mit den ODE -Löser von Matlab lösen muss. Während die Differentialgleichungen selbst ziemlich einfach sind, hängen sie von vielen "Konstanten" ab. Diese Konstanten sind nicht universell und müssen vom Anrufer geliefert werden.

Ein Beispiel Ode dieser Art wäre:

dx/dt = -j * (k + x) ./ (l + x)

Wobei J, k und l Konstanten sind und x eine Variable ist.

Die Art und Weise, wie ich diese bisher gelöst habe, besteht darin, eine Funktion zu verwenden, die alle anfänglichen Werte und Werte der Konstanten (von denen es ungefähr 10 gibt) als Argumente und dann eine innere "Schritt" -Funktion aufruft, die eine nimmt Vektor der Form, die MATLAB für seine ODE -Löser erwartet. So...

function [outputVector] = someFunction(x, y, j, k, l, m, n, o)
    function [output] = someFunctionStep(t, inputVector)
        x = inputVector(1);
        y = inputVector(2);
        dx = -j .* (k + x) ./ (l + x);
        dy = -m .* (n + y) ./ (o + y);
        output = [dx;dy]
    end
    outputVector = ode15s(@someFunctionStep, [0, endTime], [x,y]);
end

Mit zunehmender Anzahl von Variablen und der Codegröße wird dies jedoch immer weniger elegant und führt zu einem verdammten unlesbaren Code-Chaos. Ich möchte also die Schrittfunktion für jedes System in eine eigene Datei verschieben, ohne die Konstanten an die Schrittfunktion im Eingabebericht übergeben zu müssen oder b) globale Variablen verwenden zu können. Gibt es eine vernünftige Möglichkeit, dies zu tun, oder sollte ich es einfach aufsaugen und den hässlichen Code schreiben?

War es hilfreich?

Lösung

Ich würde empfehlen, bestimmte "Generator" -Funktionen für jedes ODES -System zu erstellen, das Sie lösen möchten (basierend auf Lorens Vorschlag Gebrauch machen von Anonyme Funktionen). So könnte man für Ihr Beispiel aussehen:

function odeFcn = makeODE(j,k,l,m,n,o)
  odeFcn = @(t,y) [-j*(k+y(1))/(l+y(1)); -m*(n+y(2))/(o+y(2))];
end

Jede Generatorfunktion akzeptiert eine Reihe von Eingabeparametern und erstellt sie, um eine anonyme Funktion zu erstellen, wobei die zurückgegeben wird Funktionsgriff als Ausgabe aus der Generatorfunktion. So können Sie es dann verwenden:

outputVector = ode15s(makeODE(a,b,c,d,e,f), [0,endTime], [x,y]);

Andere Tipps

Ich sehe nicht, wie Ihr Code, wie geschrieben, funktionieren kann, da niemand jemals auf einen Teilwerk aufruft oder zeigt. Sollte das die erste Eingabe in ODE15s sein?

In jedem Fall können Sie eine separate Einfunktionssteuerfunktion schreiben, die Varargin oder Eingänge annimmt. Und erstellen Sie dann eine anonyme Funktion mit den Konstanten. Geben Sie das in ODE15s weiter.

-LOREN

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top