variable una script programacion otra matematicas llamar funciones funcion evaluar ejemplo dentro como basicas matlab function nested ode

una - llamar variable de otra funcion matlab



¿Cómo puedo resolver un ODE sin usar funciones anidadas? (2)

No veo cómo su código, tal como está escrito, puede funcionar, ya que nadie llama o apunta a algúnFunctionStep. ¿Debería ser esa la primera entrada a ode15s?

En cualquier caso, puede escribir una función separada de alguna función que tome varargin o entradas. Y luego crea una función anónima con las constantes. Pase eso a ode15s.

--Loren

Tengo algunas ecuaciones diferenciales que necesito resolver usando los solucionadores de ODE de MATLAB. Si bien las ecuaciones diferenciales en sí mismas son bastante simples, dependen de muchas "constantes". Estas constantes no son universales y deben ser suministradas por la persona que llama.

Un ejemplo de EDO de este tipo sería:

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

Donde j, k y l son constantes yx es una variable.

La forma en que he estado resolviendo esto hasta ahora es usar una función que toma todos los valores iniciales y todos los valores de las constantes (de los cuales hay alrededor de 10) como argumentos y luego llama a una función interna de "paso" que toma una vector de la forma que MATLAB espera para sus solucionadores de ODE. Asi 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, a medida que aumenta el número de variables y el tamaño del código, se vuelve cada vez menos elegante y da como resultado un lío de código prácticamente ilegible. Entonces, lo que me gustaría hacer es mover la función de paso para cada sistema a un archivo propio sin tener que a) pasar las constantes a la función de paso en el vector de entrada ob) usar variables globales. ¿Hay alguna forma razonable de hacerlo, o debería simplemente aspirar y escribir el código feo?


Sugeriría crear funciones específicas de "generador" para cada sistema de ODE que desee resolver (según la sugerencia de Loren de utilizar funciones anónimas ). Esto es lo que podría parecer para 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 del generador aceptaría un conjunto de parámetros de entrada y los usaría para crear una función anónima, devolviendo el identificador de función como un resultado de la función del generador. A continuación, le indicamos cómo puede usarlo:

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