【问题标题】:MATLAB: advance ode45 just one time stepMATLAB:仅推进 ode45 一步
【发布时间】:2012-05-18 17:20:05
【问题描述】:

我在 matlab 中使用ode45() 进行一些动力学工作,使用this procedure 计算洛伦兹系统的最大李雅波诺夫指数。

该过程涉及求解从x0 开始的微分方程组,并将其与非常接近x0 开始的轨迹进行比较。

在每个时间步,在推进时间步之前,需要重新调整第二条轨迹,所以我希望能够拨打ode45()一次 - 这可能吗?

这里提出了替代解决方案的初步尝试,但它不起作用;据我所知,下面得到的矩阵rR应该是相似的:

% Time 
ti = 0; tf = 1; res = 10;
T = linspace(ti, tf, res);

% Solve the system first time
[~,R] = ode45('tbmLorenz',T,x0);

% Alternate trajectory
r = zeros(size(R));

% Temporary cordinates
temp = zeros(3,3);

% Solve for second trajectory
for i = 2:(res-1)
    % Time step
    ts = T((i-1):(i+1));

    % Solve three steps
    [~,temp] = ode45('tbmLorenz',ts,r(i-1,:));

    r_i = temp(2,:)

    % Code to alter r_i goes here

    % Save this
    r(i,:) = r_i;
end

...但他们不是:

r =
    1.0000    3.0000    4.0000
    9.7011   20.6113    7.4741
   29.9265   16.4290   79.0449
   -5.7096  -15.2075   49.2946
  -12.4917  -13.6448   44.7003
  -13.6131  -13.8826   45.0346
  -13.5061  -13.1897   45.4782
  -13.0538  -13.0119   44.5473
  -13.4463  -13.8155   44.4783
         0         0         0
>> R
R =
    1.0000    3.0000    4.0000
    9.7011   20.6139    7.4701
   29.9663   16.5049   79.1628
   -5.7596  -15.2745   49.3982
  -12.4738  -13.5598   44.7800
  -13.5440  -13.8432   44.9084
  -13.5564  -13.3049   45.4568
  -13.1016  -12.9980   44.6882
  -13.3746  -13.7095   44.4364
  -13.7486  -13.6991   45.4092

r 的最后一行为零不是问题。

有什么想法吗?干杯! \T

【问题讨论】:

    标签: matlab differential-equations chaos


    【解决方案1】:

    Ode45 是一种自适应算法,根据定义具有不同的步长。如果你愿意,你可以固定步长,但你不是在使用 ode45,而是在使用其他东西。

    如果你想解决这类问题,我建议你使用固定的时间步长。 This link 有你需要的代码。

    如果您坚持使用 ode45,则必须使用时间插值输入调整模拟文件本身。

    【讨论】:

    • 谢谢,非自适应正是我想要的
    • 奇怪的接受。该链接除了重复Matlab官方文档外,没有任何非自适应方法,甚至没有任何ODE方法。无论您编辑什么,都无法进行 1 步模拟。实现在 c 中,文件不是开源的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多