3

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

这种类型的示例 ODE 将是:

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

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

到目前为止,我解决这些问题的方法是使用一个函数,该函数将所有初始值和所有常量值(大约有 10 个)作为参数,然后调用一个内部“step”函数,该函数采用MATLAB 对其 ODE 求解器所期望的形式的向量。所以...

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) 使用全局变量。有什么合理的方法可以做到这一点,还是我应该把它吸起来并写出丑陋的代码?

4

2 回答 2

4

我看不出你写的代码是如何工作的,因为没有人调用或指向 someFunctionStep。这应该是 ode15s 的第一个输入吗?

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

——洛伦

于 2009-10-15T13:57:50.987 回答
3

我建议为您要解决的每个 ODE 系统创建特定的“生成器”函数(基于Loren 的使用匿名函数的建议)。以下是您的示例可能的样子:

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

每个生成器函数将接受一组输入参数并使用它们创建一个匿名函数,将函数句柄作为生成器函数的输出返回。以下是您如何使用它:

outputVector = ode15s(makeODE(a,b,c,d,e,f), [0,endTime], [x,y]);
于 2009-10-16T01:03:53.503 回答