• Регистрация
kindredvik
kindredvik 0.00
н/д

Задать шаг в решении обычных дифференциальных уравнений (Эйлера, Рунге-Кутта)

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

 

Вопрос наверное совсем глупый, но можно ли оставить в задаваемых параметрах и размер шага  и количество шагов и как это повлияет на производительность функции? 

Заранее большое спасибо за любую помощь 

Теги

    13.01.2020

    Комментарии

    • aBoomest
      aBoomest+942.89
      13.01.2020 13:21

      Добрый день. Разницы (имхо) нет из каких исходных данных у вас вычисляется шаг. Главное шаг должен быть меньше, чем скорость изменения функции. Если у вас в пределах шага есть участки, где производная сильно меняется, то в этом случае решение будет не верное (на этом участке, или начиная с этого участка). И нужно уменьшать шаг.

      Производительность - количество операций? Увеличется.

      • kindredvik
        kindredvik0.00
        13.01.2020 19:20

        Спасибо огромное за Ваш ответ! В коде есть ошибка которую я не могу найти, решение которое выдает эта функция кардинально отличается от решений методом Эйлера и Рунге-Кутта.. 

        • aBoomest
          aBoomest+942.89
          15.01.2020 17:46

          Не пойму. 3-й раз что-то пишу. Почему-то на сайте не публикуется, то-ли глючит, то ли ...

          Попытка № 3. Поэтому кратко.

          -  никогда не пользовал feval, не могу  ничего сказать
          -  почему при расчете целого шага появляется transpose
          -  что такое midstep - оно массив или значение
          -  как определена у вас функция f

          • kindredvik
            kindredvik0.00
            16.01.2020 18:35

            Спасибо большое за ответ!