# Change step size in MATLAB for ODE45

36 次查看（过去 30 天）
Sergio Manzetti 2018-3-9

Hi, is it possible to avoid this:
Warning: Failure at t=-3.000000e+00. Unable to meet integration tolerances without reducing the step size below the smallest value
allowed (7.105427e-15) at time t.
> In ode45 (line 308)
In S_plot (line 6)
I would need to go far lower, type 10^-104
##### 2 个评论显示 1更早的评论隐藏 1更早的评论
Sergio Manzetti 2018-3-9

The ODE I try to solve is this:
syms h x
fun = @(x,y)[y(2);y(3);(y(1)*(2.56E-20-x^2))/1.1728E-102];
y0 = [1 0 1]; %y, y', y''
xspan = [-3 3];
[X,Y] = ode45(fun,xspan,y0);
plot(X,Y(:,1)),,% X,Y(:,2),X,Y(:,3),X,Y(:,1).* (2 + X .^ 2));
by far lower I mean the warning message:
Warning: Failure at t=-3.000000e+00. Unable to meet integration tolerances without reducing the step size below the smallest value
allowed (7.105427e-15) at time t.
> In ode45 (line 308)
In S_plot (line 6)
"allowed (7.105427e-15) at time t. "
It must most likely go beyond that limit.

### 采纳的回答

Jan 2018-3-9
If the step size controller of ODE45 reaches 7e-15, the integration will take many years of processing time: Remember, that a day has less than 1e5 seconds only and even if ODE45 would get 1 million iterations per second, the number of steps is still huge.
Such a tiny step size is a secure indicator of either a discontinuity, a pole or a stiff equation. Reducing the step size is not a valid option, because this increases the run time (see above) and the accumulated rounding errors due to the massive number of steps. You have to examine the function mathematically instead. Maybe a stiff solver is better or avoiding the pole.
##### 4 个评论显示 3更早的评论隐藏 3更早的评论
Steven Lord 2018-3-9
The warning message talks about t rather than time or x because of the way the help text and documentation describes the input. From the documentation for ode45:
"[t,y] = ode45(odefun,tspan,y0), where tspan = [t0 tf], integrates the system of differential equations y'=f(t,y) from t0 to tf with initial conditions y0."
and
"The function dydt = odefun(t,y), for a scalar t and a column vector y, must return a column vector dydt of data type single or double that corresponds to f(t,y)."
While it may be possible in a lot of cases to actually figure out the name the function the user passed into ode45 internally uses for its first input argument, there are also cases where it wouldn't be possible. One example where it wouldn't be possible is if the function accepts varargin. The error message can't be always in sync with the code the user wrote and passed into ode45, but it can be in sync with the terminology used in the help text and documentation.

### 类别

Help CenterFile Exchange 中查找有关 Ordinary Differential Equations 的更多信息

### Community Treasure Hunt

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

Start Hunting!

Translated by