Question

J'ai quelques équations différentielles que je dois résoudre en utilisant les solveurs ODE de Matlab. Bien que l'écart s'équations sont assez simples, ils dépendent beaucoup de « constantes ». Ces constantes ne sont pas universelles, et doivent être fournis par l'appelant.

Un exemple ODE de ce type serait:

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

j, k et l sont des constantes et x est une variable.

La façon dont je suis la résolution de ces jusqu'à présent est d'utiliser une fonction qui prend dans toutes les valeurs initiales et toutes les valeurs des constantes (dont il existe environ 10) comme arguments et appelle une fonction « étape » intérieure qui prend un vecteur de la forme que prévoit Matlab pour ses solveurs ODE. Alors ...

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

Cependant, comme le nombre de variables et la taille du code augmente, cela devient de moins en moins élégant et des résultats dans un désordre sacrément-près illisible de code. Alors, ce que je voudrais faire est de déplacer la fonction étape pour chaque système dans un fichier de son propre sans avoir à a) passer les constantes à la fonction étape dans le vecteur d'entrée ou b) utiliser des variables globales. Y at-il moyen raisonnable de le faire, ou devrais-je sucer juste et écrire le code laid?

Était-ce utile?

La solution

Je suggère la création de fonctions « générateur » spécifiques pour chaque système d'EDO vous voulez résoudre (basé sur la suggestion de Loren pour faire usage de fonctions anonymes ). Voilà ce qu'on pourrait ressembler à votre exemple:

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

Chaque fonction de générateur accepterait un ensemble de paramètres d'entrée et de les utiliser pour créer une fonction anonyme, renvoyant le function poignée en tant que sortie de la fonction de générateur. Voici comment vous pouvez l'utiliser:

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

Autres conseils

Je ne vois pas comment votre code, comme il est écrit, peut fonctionner puisque personne ne demande jamais ou des points à someFunctionStep. Si tel était la première entrée à ode15s?

Dans tous les cas, vous pouvez écrire une fonction someFunctionStep distincte qui prend varargin ou entrées. Et puis créer une fonction anonyme avec les constantes. Passez cela en ode15s.

- Loren

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