代码之家  ›  专栏  ›  技术社区  ›  Chinmay Kanchi

如何在不使用嵌套函数的情况下求解ODE?

  •  3
  • Chinmay Kanchi  · 技术社区  · 15 年前

    我有一些微分方程需要用MATLAB的ODE解算器来解。虽然微分方程本身相当简单,但它们依赖于许多“常数”。这些常量不是通用的,需要调用方提供。

    此类ODE的一个示例是:

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

    其中j、k和l是常数,x是变量。

    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
    

    然而,随着变量数量和代码大小的增加,这变得越来越不优雅,并导致几乎无法读取的代码混乱。所以,我想做的是将每个系统的阶跃函数移动到它自己的文件中,而不必a)将常数传递给输入向量中的阶跃函数,或者b)使用全局变量。有没有什么合理的方法可以做到这一点,或者我应该接受它并编写丑陋的代码?

    2 回复  |  直到 15 年前
        1
  •  4
  •   Loren    15 年前

    在任何情况下,您都可以编写一个单独的someFunctionStep函数,该函数接受varargin或输入。然后用常量创建一个匿名函数。把它传给Odes。

    --罗兰

        2
  •  3
  •   Community Rick James    7 年前

    Loren's suggestion anonymous functions ).以下是您的示例的外观:

    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
    

    每个生成器函数将接受一组输入参数,并使用它们创建一个匿名函数,返回 function handle 作为发电机功能的输出。下面是如何使用它:

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