paramètres d'ajustement tout en utilisant des équations différentielles octave / Matlab solveur ODE

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

  •  18-09-2019
  •  | 
  •  

Question

J'utilise OdePkg Octave pour résoudre un système d'équations rigides, par exemple par 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);

Le solveur stocke les variables dépendantes Y dans une matrice en fonction du temps 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  ...   ...   ...

Je veux adapter les paramètres param, de sorte que les variables résultantes Y correspondent le mieux à mes valeurs de référence, par exemple:.

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

Quelle routine Octave / Matlab (d'autres langues sont les bienvenus) peuvent effectuer un multi-paramètres (moins carrée / spline) en forme ? Comment est-il possible de Conjuguer les paramètres pour les valeurs initiales différentes Y0 dans l'ajustement? Je serais heureux si vous pouviez me donner quelques conseils et possibilités.

Cordialement, Simon

Était-ce utile?

La solution

Cela devrait être relativement simple avec scipy. scipy.optimize.leastsq() prend une fonction qui doit retourner un tableau de résidus pour un vecteur de paramètre donné. Il minimise la somme des carrés des résidus. Pour gérer plusieurs ensembles de données avec des valeurs initiales différentes, vous exécutez simplement l'ODE une fois pour chaque ensemble de données, calculer les résidus pour chaque jeu de données / paire exécuter, puis concaténer les vecteurs résiduels ensemble. Voici une esquisse:

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

Autres conseils

Voulez-vous dire que chaque fonction y (t) doit être équipé? Dans ce cas, un des carrés de location ou d'un raccord cannelé pour chaque jeu de Yi en fonction du temps fonctionnera très bien. Ne peut pas dire que l'on serait mieux sans voir vos données.

Vous devrez trouver une autre variable indépendante si vous voulez dire que vous voulez ajuster une courbe à travers toutes les valeurs de Yi pour un point de temps donné, puis de regarder cette courbe évoluer au fil du temps.

MISE À JOUR: ajustement des moindres carrés est ce qu'il est - je n'ai pas une routine particulière à recommander. SciPy a un , je suis sûr. Je suis désolé que je n'ai pas une meilleure recommandation. Je n'apprendre Python maintenant.

Je ne sais pas ce que vous entendez par « indicateur de remise en forme ». d'ajustement des moindres carrés des coefficients qui minimisent les calcule le carré moyen de l'erreur entre la forme et les données à chaque point.

Juste une façon de combiner plusieurs ensembles de données en une seule forme:. Les fusionner et relancer le calcul

I développé une boîte à outils complète Matlab pour adapter les paramètres et les valeurs initiales des odes à des ensembles de données expérimentales multiples. Il peut gérer différentes valeurs initiales en fonction de chaque expérience et est disponible à www.potterswheel.de .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top