Matlab ode45在函数delet(h)中使用了很长的工具和步骤
我对ode45有问题。我已经定义了一个函数,并试图用ode来解决它,但当我运行它时,它需要很长时间。我试图在我的函数中显示“t”输入,结果显示时间步长为10^-8![我没有收到来自ode45的任何错误]Matlab ode45在函数delet(h)中使用了很长的工具和步骤,matlab,Matlab,我对ode45有问题。我已经定义了一个函数,并试图用ode来解决它,但当我运行它时,它需要很长时间。我试图在我的函数中显示“t”输入,结果显示时间步长为10^-8![我没有收到来自ode45的任何错误] 因此,我在函数的末尾放置了一个断点,在我执行一次步骤之后,它将转到sym.m文件并调用函数delet(h) 在步骤之后,它转到 function delete(h) if builtin('numel',h)==1 && inmem('-isloaded','mupadm
因此,我在函数的末尾放置了一个断点,在我执行一次步骤之后,它将转到sym.m文件并调用函数delet(h) 在步骤之后,它转到
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
这就是它太长的原因,因为它在那里循环。
怎么了?!谢谢听起来这对我来说是个“棘手”的问题。我建议使用专为僵硬问题设计的解算器。我还建议尝试在小步距~0.001的情况下使用固定步长解算器,并查看输出结果。如果你正在闯入
sym.m
,听起来你好像有一些符号逻辑在里面。有没有一种方法可以将符号表达式转换为?正如macduff所指出的,您的问题可能很棘手。尝试ode15s
(专为刚性问题设计),看看步长是否仍然降低到不可接受的低值
如果确实如此,那么您的问题可能包含一个初始值的奇点。如果问题的维度小于3,则可以定义一个小的事件
函数来深入了解每个步骤的值,并绘制它们以查看是否确实存在问题
那么,你真的需要符号数学吗?这背后的理念是,它更容易为人类阅读,这使得计算机处理起来很糟糕:)如果你能将它转换成非符号的东西,请这样做——这将显著提高性能
另外,还有一点建议,delete
也是Matlab的内置函数。通常,以Matlab buitins命名函数是一个不好的主意——这很混乱,而且在Matlab决定使用哪个函数时会导致大量开销
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