Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-10, 16:49   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 在不使用嵌套函数的情况下如何解决ODE?

我有一些需要使用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 但是,随着变量数量的增加和代码大小的增加,这种样式变得越来越优雅,并导致代码的混乱。因此,我想做的就是将每个系统的step函数移到它自己的文件中,而不必a)将常量传递给输入向量中的step函数或b)使用全局变量。有什么合理的方法可以做到这一点,还是应该把它吸起来并编写丑陋的代码?


回答:
我建议为要解决的每个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]);

更多&回答...
poster 当前离线   回复时引用此帖
回复


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 05:14


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.