МАТЛАБ:продвинуться вперед ode45 всего на один шаг

StackOverflow https://stackoverflow.com//questions/10657040

Вопрос

я использую ode45() в Matlab для некоторой работы по динамике, используя эта процедура вычислить наибольший показатель Ляпонова системы Лоренца.

Процесс включает в себя решение системы дифференциальных уравнений, начиная с x0, и сравнивая это с траекторией, начинающейся очень близко к x0.

На каждом временном шаге вторую траекторию необходимо перенастроить, прежде чем переходить на следующий временной шаг, поэтому я хотел бы иметь возможность вызывать ode45() только раз - Это возможно?

Здесь представлена ​​стартовая попытка альтернативного решения, но она не работает;насколько я понимаю, матрицы r и R полученные ниже должны быть аналогичны:

% 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 равен нулю, это не проблема.

Есть идеи?Ваше здоровье!\Т

Это было полезно?

Решение

Ode45 — это адаптивный алгоритм с изменяющимся размером шага по определению.Вы можете исправить размер шага, если хотите, но тогда вы используете не ode45, а что-то другое.

Если вы хотите решить задачу такого типа, я предлагаю вам использовать фиксированный временной шаг. Эта ссылка есть код для того, что вам нужно.

Если вы настаиваете на использовании ode45, вам необходимо настроить сам файл моделирования с помощью интерполированных по времени входных данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top