How to get the exact step size used by ode45?

조회 수: 70 (최근 30일)
伟
2024년 10월 23일 8:14
댓글: 2024년 10월 24일 1:23
Hi, everyone,
I am trying to solve GNLSE which has the following form:
,
,
.
It is a PDE describing pulse evolving along an optical fiber.
I can make a transformation so that it can be turned into an ODE, and the transformation is:
.
where h is the step size.
The resulting ODE is:
,
.
Now I want to solve the transformed equation using ode45.The RHS equation can be obtained numerically as long as the step size h is known. So how can I get the exact current step size used by ode45?

채택된 답변

Torsten
Torsten 2024년 10월 23일 8:25
이동: Torsten 2024년 10월 23일 8:25
If the stepsize is part of the ODE equation, you cannot use ODE45 to solve. You have to write your own integrator.
  댓글 수: 1
伟
2024년 10월 24일 1:21
Thank you, Torsten. I will write my own integrator then.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Rahul
Rahul 2024년 10월 23일 11:10
Hi @伟,
I understand that you’re trying to solve a GLNSE PDE and making a variable transformation involving the current step size of the solver function, and you need the current step size adopted by the ode45 function at that time step.
In MATLAB, when using the ode45 function to solve ordinary differential equations (ODEs), the solver adapts the step size dynamically based on the error estimates of the solution. Unfortunately, there is no direct option to get the current step size at each iteration using just the ode45 function.
However, you can use an output function to access the step size and other solver details at each time step. You can set up an output function to capture the current step size at every iteration:
function dydt = odefun(t, y)
dydt = -2 * y + t; % Example ODE
end
% Define an output function to capture the step sizes
function status = outputFcn(t, y, flag)
persistent last_t
status = 0; % Status is used to stop integration if necessary (0 = continue)
if strcmp(flag, 'init') % Initialization
last_t = t; % Store the initial time
elseif isempty(flag) % During the integration process
step_size = t(end) - last_t(end); % Compute the step size
fprintf('Current step size: %f\n', step_size);
last_t = t; % Update the last time
elseif strcmp(flag, 'done') % Finalization
% Clear persistent variable
clear last_t
end
end
% Set options for ode45 with the output function
options = odeset('OutputFcn', @outputFcn);
% Call ode45 with the options
[t, y] = ode45(@odefun, [0 5], 1, options);
  • Output Function (outputFcn): This function is called by ode45 after every time step, to capture and display the step size at each iteration.
  • Step Size Calculation: The current step size is calculated by taking the difference between the current time (t(end)) and the previous time (last_t(end)).
For more information regarding usage of ‘ode45’ function to solve PDE(s), refer to the following documentation link:
Best
  댓글 수: 2
Torsten
Torsten 2024년 10월 23일 15:39
When the OutputFcn function is called, the step has finished. Thus it's too late to adjust the ODE function.
伟
2024년 10월 24일 1:23
Thank you, Rahul. I guess that there is no perfect solution just using ode45. I will write my own integrator.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Ordinary Differential Equations에 대해 자세히 알아보기

태그

제품


릴리스

R2024b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by