Как заставить ode45 предпринимать шаги с точностью 0,01 по оси T? - PullRequest
5 голосов
/ 31 марта 2010

Я использую Matlab для решения дифференциального уравнения. Я хочу заставить ode45 предпринимать постоянные шаги, поэтому он всегда увеличивается на 0,01 по оси T при решении уравнения. Как мне это сделать?

ode45 последовательно делает оптимизированные, случайные шаги, и я не могу понять, как заставить его делать последовательные, маленькие шаги 0,01 Вот код:

options= odeset('Reltol',0.001,'Stats','on');

%figure(1);
%clf;
init=[xo yo zo]';
tspan=[to tf];
%tspan = t0:0.01:tf;

[T,Y]=ode45(name,tspan,init,options);

Ответы [ 6 ]

12 голосов
/ 31 марта 2010

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

tspan = to:0.01:tf;  % Obtain solution at specific times
[T, Y] = ode45(name, tspan, init, options);

Что касается точности решений при использовании фиксированных размеров шагов, обратитесь к этой выдержке из приведенной выше ссылки:

Если tspan имеет более двух элементов [t0,t1,t2,...,tf], то решатель возвращает решение, оцененное в заданных точках. Однако решатель не подходит точно к каждой точке, указанной в tspan. Вместо этого решатель использует свои собственные внутренние шаги для вычисления решения, а затем оценивает решение в запрошенных точках в tspan. Решения, полученные в указанных точках, имеют тот же порядок точности, что и решения, рассчитанные на каждом внутреннем этапе.

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

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

5 голосов
/ 31 марта 2010

ode45 всегда использует адаптивный размер шага, документация решает эту проблему и рекомендует вместо этого другие решатели для фиксированного размера шага - см. ode4 (Рунге-Кутта четвертого порядка), что является довольно безопасной ставкой для решения большинства од - по крайней мере в соответствии с числовыми рецептами

4 голосов
/ 27 октября 2011

Это можно сделать, просто нужно использовать еще несколько команд.

NEW:

options= odeset('Reltol',0.001,'Stats','on');

%figure(1);
%clf;
init=[xo yo zo]';
to=some number; 
tf= some number;
nsteps= number of points you want function evaluated on.
tspan = linspace(t0,tf, nsteps);

[T,Y]=ode45(@function,tspan,init,options);

С помощью команды size (переменная) вы можете убедиться, что она заняла требуемое количество очков.

2 голосов
/ 14 марта 2012

Ну, вы не можете гарантировать, что он ТОЛЬКО вычислит эти шаги, но вы можете обеспечить максимальный размер шага (и если вы сделаете это достаточно маленьким, вы можете быть почти уверены, что у вас есть все желаемое время и взять только эти образцы):

options= odeset('MaxStep',1);
[t,s] = ode45(@myode,tspan,[0;0],options);

чтобы узнать больше, вы можете перейти на здесь :

1 голос
/ 04 июля 2014

ODE45 (говорите четыре-пять, а не сорок пять) вычисляет оптимальный размер шага и даже возвращается во времени, если ошибка слишком велика, проверьте Runge-Kutta, если вам интересно. Как пользователь, вы не замечаете этого, поскольку выходные данные ODE будут интерполированы так, чтобы они соответствовали вектору tspan. Так что, если вы установите tspan в 0: 1E-5: 1, и вы хотите интегрировать простой ODE, такой как dydt = -y, ODE45 сделает несколько шагов, но вектор, который вы получите из оды, будет во временных шагах, объявленных в tspan. т.е. 1E-5. Если вы хотите интегрировать жесткое уравнение dydt = 1E2 * (1-y) * y ODE45 сделает большие и очень крошечные шаги, но результат будет таким же, в последующем вы должны использовать ode15s, потому что ODE45 не может работать с жесткими системами .

Надеюсь, это поможет

веселит Marco

1 голос
/ 09 января 2012

Ваш сценарий не указывает размер с фиксированным шагом, он только показывает, что решение будет напечатано на основе предоставленного временного шага. Попробуйте проверить структуру решения ODE, и вы поймете, что на самом деле он использует другой временной шаг.

Лучший способ использовать фиксированный временной интервал - убедиться, что RelTol и AbsTol достаточно велики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...