Задать шаг в решении обычных дифференциальных уравнений (Эйлера, Рунге-Кутта)
13.01.2020
Абсолютный новый пользователь матлаб и хотела попросить помощи в корректировки функций решения обычных дифференциальных уравнений.
Для обучения я использовала примеры книги, где шаг расчитывается автоматически исходя из количества шагов и значений x.
Я пыталась реализовать эти формулы (на самом деле не уверена верен ли код в принципе.. )
function [ x, y ] = Midpoint_ODE ( f, xRange, yInitial, numSteps )
% f = name of file with function
% xrange Interval
% x(1) first meaning of x
% x(2) second meaning of x
x=zeros(numSteps+1,1);
x(1) = xRange(1);
h = ( xRange(2) - xRange(1) ) / numSteps; % calculated step size
y(1,:) = transpose(yInitial);
for n = 1 : numSteps
midstep = y(n) + h * (1/2)*(feval( f, x(n), y(n)));
y(n+1,:) = y(n,:) + h * transpose(feval(f, x(n)+ (h/2), midstep));%evaluating the function
end
Вместо количества шагов, numSteps мне необходимо задать размер шага.
Правильный ли такой вариант?
function [ x, y ] = Midpoint_ODE ( f, xRange, yInitial, h, numsteps )
% f = name of file with function
% xrange Interval
% x(1) first meaning of x
% x(2) second meaning of x
x=zeros(numSteps+1,1);
x(1) = xRange(1);
y(1,:) = transpose(yInitial);
for n = 1 : numSteps
midstep = y(n) + h * (1/2)*(feval( f, x(n), y(n)));
y(n+1,:) = y(n,:) + h * transpose(feval(f, x(n)+ (h/2), midstep));%evaluating the function
end
Вопрос наверное совсем глупый, но можно ли оставить в задаваемых параметрах и размер шага и количество шагов и как это повлияет на производительность функции?
Заранее большое спасибо за любую помощь
Ответы
Добрый день. Разницы (имхо) нет из каких исходных данных у вас вычисляется шаг. Главное шаг должен быть меньше, чем скорость изменения функции. Если у вас в пределах шага есть участки, где производная сильно меняется, то в этом случае решение будет не верное (на этом участке, или начиная с этого участка). И нужно уменьшать шаг.
Производительность - количество операций? Увеличется.
Спасибо огромное за Ваш ответ! В коде есть ошибка которую я не могу найти, решение которое выдает эта функция кардинально отличается от решений методом Эйлера и Рунге-Кутта..
Не пойму. 3-й раз что-то пишу. Почему-то на сайте не публикуется, то-ли глючит, то ли ...
Попытка № 3. Поэтому кратко.
- никогда не пользовал feval, не могу ничего сказать
- почему при расчете целого шага появляется transpose
- что такое midstep - оно массив или значение
- как определена у вас функция f
Спасибо большое за ответ!