Я продолжаю получать сообщение об ошибке, пытаясь реализовать метод средней точки решения ODE - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь реализовать формулы средней точки y[n+1/2] = y[n] + h/2 f (x[n], y[n]) и y[n+1] = y[n] + h *f (x[n] + h/2, y[n + 1/2])

enter image description here

, поэтому решение ODE выполняется методом средней точки.

Моя функция

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
    y(n+0.5,:)= (y(n) + (h * 0.5)*(transpose(feval( f, x(n), y(n)))));
    y(n+1,:) = y(n,:) + h * transpose(feval(f, x(n)+ (h/2), y(n+0.5,:))); %evaluating the function
end

Но я получаю сообщение об ошибке:

**Index in position 1 is invalid. Array indices must be positive integers or logical values.
Error in Midpoint_ODE (line 11)Index in position 1 is invalid. Array indices must be positive integers or logical values.
Error in Midpoint_ODE (line 11)** 

Я проверял это пару раз, и не могу понять, что не так, и если Я пропустил какой-то логический кусок.

1 Ответ

1 голос
/ 12 января 2020

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

  for n = 1 : numSteps
    yhalfstep = (y(n,:) + (h * 0.5)*(transpose(feval( f, x(n), y(n,:)))));
    y(n+1,:) = y(n,:) + h * transpose(feval( x(n)+ (h/2), yhalfstep)); 
  end

Также помните, что в matlab и аналогичных средствах одноиндексный доступ к многомерному массиву возвращает элемент уплощенного массива ( колонка первая). То есть в a=[ 1,2;3,4;5,6] вы получаете от a(3) число 5 в качестве 3-го элемента в первом столбце, в то время как a(3,:) дает 3-ю строку [5,6].

...