我的ode45有问题。我已经定义了一个函数并尝试通过ode解决它,但是当我运行它时,它需要很长时间。我试图在我的函数中显示“t”输入,它显示时间步长为10 ^ -8! [我没有从ode45得到任何错误]
所以我在我的函数结束时放了一个断点,在我执行一次之后,它转到sym.m文件并调用Function delet(h)
function dxr=Dynfun(t,x)
...
dxr=[A;B]
步骤后进入
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 :(得分:0)
听起来这对我来说是一个“僵硬”的问题。我建议使用专为僵硬问题设计的求解器。我还建议尝试一个小步长~0.001的固定步长求解器,看看输出是什么样的。如果你突破sym.m
,听起来就像你在那里有一些象征性的逻辑。有没有办法可以将符号表达式转换为matlab script?
答案 1 :(得分:0)
正如macduff所指出的,你的问题可能很僵硬。尝试ode15s
(专为僵硬问题而设计)并查看步长是否仍然降低到不可接受的低值。
如果情况确实如此,那么您的问题可能包含您给出的初始值的奇点。如果您的问题的维度低于3,您可以定义一个小的event
函数来深入了解每一步的值,并绘制它们以确定是否确实存在问题。
那么 - 你真的需要象征性的数学吗?这背后的哲学是它更容易为人类阅读,这使得处理计算机变得非常糟糕:)如果你可以把它变成非象征性的东西,请这样做 - 这将显着提高性能。
另外,更多的建议,delete
也是Matlab内置函数。在Matlab buitins之后命名你的函数通常是一个坏主意 - 它令人困惑,并且可能导致大量开销,而Matlab决定使用哪一个。