Frage

I OdePkg in Octave bin mit einem System von steifem ODEs zu lösen, z.B. von ode5r:

function yprime = myODEs(t,Y,param)
    yprime = [
        - param(1) * Y(1);                      # ODE for Y(1)
        param(1) * Y(1) - param(2) Y(2) * Y(3); # ODE for Y(2)
        param(2) Y(2) * Y(3)                    # ODE for Y(3)
                                                # etc.
];

time_span = [1, 24]         # time span of interest
Y0        = [1.0, 1.1, 1.3] # initial values for dependent variables Y
param     = [7.2, 8.6, 9.5] # parameters, to be optimized

[t, Y] = ode5r(@myODEs, time_span, Y0, ..., param);

Der Solver speichert die abhängigen Variablen Y in einer Matrix mit Bezug auf die Zeit t (Vektor):

t     Y(1)  Y(2)  Y(3)
0.0   1.0   1.1   1.3
0.1   ...   ...   ...
0.5   ...   ...   ...
0.9   ...   ...   ...
...   ...   ...   ...
4.0   ...   ...   ...
...   ...   ...   ...
24.0  ...   ...   ...

Ich mag die Parameter in param passen, so dass die resultierenden Variablen Y besten meine Referenzwerte passen, z.

t         Y(1)  Y(2)  Y(3)
0.5       1.1   N/A   N/A
1.0       1.9   N/A   N/A
4.0       2.3   2.7   2.1
5.0       N/A   2.6   2.2
24.0      0.9   1.5   2.0

Welche Octave / Matlab (andere Sprachen sind willkommen) Routine kann führen Sie einen Multi-Parameter (Least-Square / Spline) fit ? Wie ist es möglich, Parametersätze für verschiedene Anfangswerte kombinieren Y0 im fit? Ich würde mich freuen, wenn Sie mich mit einigen Hinweisen und Möglichkeiten bieten könnte.

Mit freundlichen Grüßen, Simon

War es hilfreich?

Lösung

Dies sollte relativ einfach sein, mit scipy. scipy.optimize.leastsq() nimmt eine Funktion, die ein Array von Residuen für einen gegebenen Parametervektor zurückgeben sollte. Es wird die Summe der Quadrate der Residuen minimieren. Um mehrere Datensätze mit unterschiedlichen Anfangswerten zu umgehen, führen Sie nur die ODE einmal für jeden Datensatz, berechnen die Residuen für jeden Datensatz / run Paar, und dann verketten zusammen die restlichen Vektoren. Hier ist eine grobe Skizze:

import numpy
from scipy import integrate, optimize

# The initial guess.
p0 = numpy.array([7.2, 8.6, 9.5])

# The collected datasets.
# A list of (t, y0, y) tuples.
# The y's are all (len(y0), len(t))-shaped arrays. The output of
# integrate.odeint is also in this format.
datasets = [...]

def odes(y, t, params):
    dydt = [
        -params[0] * y[0],
        params[0]*y[0] - params[1]*y[1]*y[2],
        params[1]*y[1]*y[2],
    ]
    return np.array(dydt)

def residuals(params, datasets):
    res = []
    for t, y0, y in datasets:
        res.append(integrate.odeint(odes, y0, t, args=(params,)) - y)

    # Stack them horizontally and flatten the array into the expected vector.
    # You're on your own for handling missing data. Look into the numpy.ma
    # module.
    all_residuals = numpy.hstack(res).ravel()
    return all_residuals

opt_params, err = optimize.leastsq(residuals, p0, args=(datasets,))

Andere Tipps

Sie meinen, dass jede Funktion y (t) ausgestattet werden muss? In diesem Fall werden ein Leasing-Quadrate oder Spline für jeden Satz von Yi über die Zeit Einpassen gut funktionieren. Kann nicht sagen, die man am besten wäre, Ihre Daten, ohne zu sehen.

Sie werden mit einem anderen unabhängigen Variablen haben zu kommen, wenn Sie meinen, dass Sie eine Kurve über alle Werte von Yi für einen bestimmten Zeitpunkt passen wollen und dann beobachten, dass die Kurve im Laufe der Zeit entwickeln.

UPDATE: kleinste Quadrate ist, was es ist - ich habe nicht eine bestimmte Routine zu empfehlen. SciPy hat ein , ich bin sicher. Es tut mir leid, dass ich nicht eine bessere Empfehlung haben. Ich lerne nur Python jetzt.

Ich weiß nicht, was Sie mit „Fitness-Indikatoren“ bedeuten. Die kleinsten Quadrate berechnet Koeffizienten, die die mittleren quadratischen Fehler der zwischen dem Sitz und den Daten an jedem Punkt minimieren.

Nur eine Möglichkeit, mehrere Datensätze in einen einzigen Sitz zu kombinieren. Kombiniere sie und die Berechnung erneut ausführen

entwickelte ich eine umfassende Matlab Toolbox Parameter passen und Anfangswerte von Oden an mehreren experimentellen Datensätzen. Es kann auf jedem Experiment unterschiedliche Ausgangswerte verarbeiten abhängig und ist verfügbar unter www.potterswheel.de .

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