Domanda

sto usando OdePkg in ottava risolvere un sistema di equazioni differenziali rigidi, ad esempio da 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);

memorizza risolutore le variabili dipendenti Y in una matrice rispetto al tempo t (vettore):

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  ...   ...   ...

Voglio adattare i parametri in param, in modo che le variabili risultanti Y meglio si adattano i miei valori di riferimento, per esempio:.

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

Quali Octave / Matlab (altre lingue sono i benvenuti) di routine possono eseguire un multi-parametro (minimi quadrati / spline) fit ? Come è possibile per combinare set di parametri per i diversi valori iniziali Y0 in forma? Sarei felice se potesse fornirmi alcuni suggerimenti e possibilità.

Con i migliori saluti, Simon

È stato utile?

Soluzione

Questo dovrebbe essere relativamente semplice con SciPy. scipy.optimize.leastsq() prende una funzione che deve restituire una matrice di residui per un dato vettore parametro. Sarà minimizzare la somma dei quadrati dei residui. Per gestire più set di dati con diversi valori iniziali, basta eseguire l'ODE volta per ogni insieme di dati, calcolare i residui per ciascuna coppia di dati / run, e quindi concatenare i vettori residuo insieme. Ecco un abbozzo:

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,))

Altri suggerimenti

Vuoi dire che ogni funzione y (t) deve essere montato? In tal caso, un leasing quadrati o spline montaggio per ogni set di Yi in funzione del tempo funzionano bene. non può dire quale sarebbe migliore senza vedere i dati.

Dovrai venire con un'altra variabile indipendente se vuoi dire che si vuole adattare una curva in tutti i valori di Yi per un dato punto di tempo e poi guardare quella curva si evolvono nel corso del tempo.

UPDATE: Minimo raccordo piazza è quello che è - non ho una routine particolare per raccomandare. SciPy ha uno , ne sono sicuro. Mi dispiace che non ho una raccomandazione migliore. Sto solo imparando Python ora.

Non so che cosa si intende per "indicatore di fitness". Minimi quadrati calcola i coefficienti che minimizzano la quadratico medio dell'errore tra la forma e dati in ogni punto.

Solo un modo di combinare diversi set di dati in un unico fit:. Unirle e rieseguire il calcolo

Ho sviluppato una barra degli strumenti completa Matlab per adattarsi a parametri e valori iniziali delle Odi a più insiemi di dati sperimentali. E 'in grado di gestire diversi valori iniziali a seconda di ogni esperimento ed è disponibile presso www.potterswheel.de .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top