我需要使用MATLAB的ODE求解器来解决一些微分方程。虽然微分方程本身很简单,但它们依赖于很多“常数”。这些常量不是通用的,需要由调用者提供。
此类ODE的示例如下:
dx/dt = -j * (k + x) ./ (l + x)
其中j,k和l是常数,x是变量。
到目前为止我解决这些问题的方法是使用一个函数,它接受所有初始值和常量的所有值(其中大约有10个)作为参数,然后调用内部“步”函数它采用了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
然而,随着变量的数量和代码大小的增加,这变得越来越不优雅,并导致几乎无法读取的代码混乱。所以,我想要做的是将每个系统的step函数移动到它自己的文件中,而不必a)将常量传递给输入向量中的step函数或b)使用全局变量。有没有合理的方法可以做到这一点,或者我应该把它搞砸并编写丑陋的代码?
答案 0 :(得分:4)
我没有看到你的代码如何编写,因为没有人调用或指向someFunctionStep。这应该是ode15s的第一个输入吗?
在任何情况下,您都可以编写一个单独的someFunctionStep函数来接受varargin或输入。然后使用常量创建一个匿名函数。把它传递给ode15s。
- 洛伦
答案 1 :(得分:3)
我建议为您要解决的每个ODE系统创建特定的“生成器”函数(基于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]);