После оптимизации моего кода, мой ode solver, ode45, занимает много времени. Но сервер только позволяет мне иметь стену 24 часа. Я не могу запросить более длинные стены. Я знаю, как сделать контрольную точку для цикла for
. Но как сделать контрольную точку для ode45
, эффективно?MATLAB: Checkpointing in ode function
ответ
Интервал интеграции можно разделить на части. Например,
[t1,x1] = ode45(f,[0 1],x0); % integrate from 0 to 1
save('data.mat'); % save workspace to file
% now you can turn off your computer
load('data.mat'); % load workspace from file
last = x1(end,:); % obtain the last state (the last row of x1)
[t2,x2] = ode45(f,[1 2],last); % integrate from 1 to 2
t = [t1;t2]; % concatenate results
x = [x1;x2];
эквивалентно
[t,x] = ode45(f,[0 2],x0); % integrate from 0 to 2
Таким образом, вы можете интегрировать по первой части интервала и сохранить результаты, в следующий раз вы можете продолжать интеграцию с последней точки и т.д.
't1 = [0 1]' 't2 = [1 2]'. Есть ли перекрытие в значении 1? Это проблема в ODE? – petersen
Да, это так. Если это проблема, последние две строки должны быть изменены следующим образом: 't = [t1 (1: end-1); t2]; x = [x1 (1: end-1, :); x2] ' – AVK
после' save ('data.mat'); ', я выключу компьютер. Но разве это не при повторном открытии моего компьютера. Я перезапущу программу, я должен начать запускать '[t1, x1] = ode45 (f, [0 1], x0);' снова? Как я могу перейти на 'load ('data.mat');' после того, как я снова открою свой компьютер? – petersen
Вы можете сохранить последнее состояние своей системы, чтобы использовать его в качестве отправной точки для новой интеграции. – AVK
Btw, такое длительное время интеграции является подозрительным. Может быть, ваша проблема жесткая? – AVK
@AVK вы можете рассказать мне, как сохранить последнее состояние системы, чтобы использовать его в качестве отправной точки для новой интеграции. это большие системы с матрицей, поэтому я не могу ее сократить. – petersen