Pregunta

Tengo algunas ecuaciones diferenciales que tengo que resolver utilizando solucionadores de ODE de MATLAB. Mientras que el de ecuaciones diferenciales en sí son bastante simples, que dependen de una gran cantidad de "constantes". Estas constantes no son universales, y deben ser suministrados por la persona que llama.

Un ejemplo de ODE de este tipo sería:

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

donde j, k y l son constantes y x es una variable.

La forma he estado resolver estos hasta ahora es utilizar una función que toma en todos los valores iniciales y todos los valores de las constantes (de los cuales existen alrededor de 10) como argumentos y entonces llama a una función interna "paso" que tiene un vector de la forma que MATLAB espera por su solucionadores ODE. Así que ...

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

Sin embargo, como el número de variables y que aumenta el tamaño del código, esto se convierte en cada vez menos elegante y resultados en un lío maldito-cerca de no lectura de código. Por lo tanto, lo que me gustaría hacer es mover la función de paso para cada sistema en un fichero de su propio sin tener que a) estén las constantes de la función de paso en el vector de entrada o b) utilizar variables globales. ¿Hay alguna forma razonable de hacer esto, o me entiendan y escribir el código feo?

¿Fue útil?

Solución

Yo sugeriría la creación de funciones "generador" específicos para cada sistema de ecuaciones diferenciales ordinarias que desea resolver (basado en sugerencia de Loren para hacer uso de funciones anónimas). Esto es lo que se podría parecerse por su ejemplo:

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

Cada función de generador aceptaría un conjunto de parámetros de entrada y utilizarlos para crear una función anónima, devolviendo el función manejar como una salida de la función de generador. He aquí cómo usted puede utilizar es el siguiente:

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

Otros consejos

No veo cómo su código, como está escrito, puede funcionar ya que nadie llama o puntos de someFunctionStep. En caso de que sea la primera entrada a ode15s?

En cualquier caso, se puede escribir una función someFunctionStep independiente que lleva varargin o entradas. Y a continuación, crear una función anónima con las constantes. Pase que en ode15s.

- Loren

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