parámetros de ajuste de las odas mientras que utilizando octava / solucionador de MATLAB ODE

StackOverflow https://stackoverflow.com/questions/1164198

  •  18-09-2019
  •  | 
  •  

Pregunta

Estoy utilizando OdePkg en Octave para resolver un sistema de ecuaciones diferenciales ordinarias rígidas, por ejemplo, por 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);

Las tiendas solucionador de las variables dependientes Y en una matriz con respecto al tiempo t (vector):

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

Quiero ajustar los parámetros de parámetro, por lo que las variables resultantes Y mejor se adapten a mis valores de referencia, por ejemplo:.

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

¿Qué Octave / Matlab (otros idiomas son bienvenidos) rutina puede realizar una multiparamétrico (mínimos cuadrados / spline) ajuste ? ¿Cómo es posible combinar conjuntos de parámetros para diferentes valores iniciales Y0 en el ajuste? Me alegraría si pudiera ofrecerle algunos consejos y posibilidades.

Saludos cordiales, Simon

¿Fue útil?

Solución

Esto debería ser relativamente sencillo con scipy. scipy.optimize.leastsq() toma una función que debe devolver una matriz de residuos para un vector de parámetro dado. Se reducirá al mínimo la suma de los cuadrados de los residuos. Para manejar múltiples conjuntos de datos con diferentes valores iniciales, sólo ejecuta la ODE una vez para cada conjunto de datos, calcular los residuales para cada conjunto de datos / pair correr, y luego concatenar los vectores residuales juntos. Aquí es un esbozo:

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

Otros consejos

¿Quiere decir que cada función y (t) necesita ser instalado? En ese caso, unas plazas de arrendamiento o se ajusta a cada conjunto de Yi en función del tiempo spline funcionará bien. No se puede saber cuál sería el mejor sin ver sus datos.

Vas a tener que venir con otra variable independiente si usted quiere decir que desea ajustar una curva a través de todos los valores de Yi para un momento determinado y luego ver que la curva de evolucionar con el tiempo.

ACTUALIZACIÓN: Por lo menos apropiado cuadrado es lo que es - no tengo una rutina especial para recomendar. SciPy tiene un , estoy seguro. Siento que no tengo una mejor recomendación. Yo sólo estoy aprendiendo Python ahora.

No sé qué quiere decir con "indicador de adaptación". Mínimos Cuadrados Calcula montaje coeficientes que reducen al mínimo el cuadrado medio del error entre el ajuste y los datos en cada punto.

Sólo una manera de combinar varios conjuntos de datos en una sola forma:. Fusionarlos y volver a ejecutar el cálculo

he desarrollado una amplia caja de herramientas Matlab para adaptarse a los parámetros y valores iniciales de odas a múltiples conjuntos de datos experimentales. Puede manejar diferentes valores iniciales en función de cada experimento y está disponible en www.potterswheel.de .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top