1

我对 ode45 有疑问。我已经定义了一个函数并试图通过 ode 解决它,但是当我运行它时,它需要很长时间。我试图在我的函数中显示“t”输入,它显示时间步长是 10^-8 ![我没有从 ode45 得到任何错误]
所以我在函数的末尾放了一个断点,在我 Step 一次之后,它转到 sym.m 文件并调用 Function delet(h)

function dxr=Dynfun(t,x)
...
dxr=[A;B]

在 Step 之后它转到

function delete(h)
    if builtin('numel',h)==1 && inmem('-isloaded','mupadmex') && builtin('numel',h.s)==1 && ~isa(h.s,'maplesym')
        mupadmex(h.s,1);
    end
    end

这就是它太长的原因,因为它在那里循环。有什么问题?!谢谢

4

2 回答 2

0

听起来对我来说这是一个“僵硬”的问题。我建议使用专为解决棘手问题而设计的求解器。我还建议尝试以小步长 ~ 0.001 的固定步长求解器,看看输出是什么样子的。如果你正在闯入sym.m,听起来你在那里有一些象征性的逻辑。有没有办法可以将符号表达式转换为matlab 脚本

于 2012-09-17T18:41:28.680 回答
0

正如 macduff 所指出的,您的问题可能很棘手。尝试ode15s(专为解决棘手问题而设计)并查看步长是否仍会减小到无法接受的低值。

如果确实如此,那么您的问题可能包含您给它的初始值的奇点。如果您的问题的维度小于 3,您可以定义一个小event函数来深入了解每一步的值,并绘制它们以查看是否确实存在问题。

那么——你真的需要符号数学吗?其背后的哲学是人类更容易阅读,这使得计算机处理起来很糟糕:)如果你可以将它转换成非符号的东西,请这样做——这将显着提高性能。

另外,多提一句,delete也是Matlab内置函数。在 Matlab buitins 之后命名您的函数通常是一个坏主意——这会造成混淆,并且在 Matlab 决定使用哪个函数时会导致大量开销。

于 2012-09-18T04:44:16.213 回答