Как исправить ошибку «Индекс превышает количество элементов массива (1)»? - PullRequest
0 голосов
/ 24 октября 2019

Я довольно новичок в Matlab и пытаюсь создать функцию Matlab, которая применяет модифицированный метод Эйлера для аппроксимации решений определенного дифференциального уравнения. Когда я вызываю функцию в командном окне, я получаю следующую ошибку:

Index exceeds the number of array elements (1).
Error in modified_euler2 (line 10)
y(i+1)=y(i)+0.5*(k1(i)+k2(i));

Я вызываю функцию так же, как показано ниже: modified_euler2(60,1000,9.8,0.1125,1.125,25)

Полный код функции приведен ниже:

function output = modified_euler2(T,n,g,C,K,L)
f = @(v,y) (g - C*abs(v)*v -max(0, K*(y - L))); 
 h = T / n; 
t = 0:h:T;        
y = zeros(1,n+1); 
v = zeros(1,n+1);
k1 = zeros(1,n+1); 
k2 = zeros(1,n+1);
 for i = 1:n+1
  y(i+1)=y(i)+0.5*(k1(i)+k2(i));
  k1 = h*f(v(i),y(i));
  k2=h*f(v(i)+h,y(i)+k1(i));

 end
 output = t,y,v,h
 figure
 plot(y)
end

Любой совет о том, как исправить эту ошибку, был бы очень признателен.

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Ваша основная ошибка заключается в том, что вы присваиваете значение с плавающей запятой для k1,k2 вместо k1(i),k2(i). На следующем шаге, где вы получаете доступ к элементам массива с индексом i=2, измененные k являются все еще числами, которые, по-видимому, Matlab интерпретирует как массив длины 1. Вы можете проверить это, напечатав i в начале цикла в качестве отладочного вывода.

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

Тогда еще одна проблема заключается в том, что вы относитесь к y как к времени. Однако у вас есть уравнение второго порядка, с v=y' и v'=y''. Вы можете рассматривать ее как векторную систему первого порядка или вам нужно k значения для v и y.

y = zeros(1,n+1); 
v = zeros(1,n+1);
for i = 1:n
  k1y = h*v(i);
  k1v = h*f(v(i),y(i));
  k2y = h*(v(i)+k1v)
  k2v = h*f(v(i)+k1v,y(i)+k1y);
  y(i+1)=y(i)+0.5*(k1y+k2y);
  v(i+1)=v(i)+0.5*(k1v+k2v);
end
0 голосов
/ 24 октября 2019

«Индекс превышает количество элементов массива» означает, что вы индексируете массив с некоторым количеством n элементов, но запрашиваете m -й элемент, где m>n. Так что, если у вас был вектор

x = [2 4 6]

, то x(1)=2, но вы не можете, например, x(6), потому что x имеет только 3 элемента.

В вашемВ этом случае Matlab точно сообщает вам, где произошла ошибка, в строке

y(i+1)=y(i)+0.5*(k1(i)+k2(i))

Здесь вы выполняете несколько операций индексирования (y(i+1), y(i), k1(i) и k2(i)),и один (или несколько) вызывают ошибку. Проблема в том, что переменная, которую вы пытаетесь проиндексировать, имеет только один элемент (Matlab говорит вам об этом), но вы запрашиваете i -й (или i+1 -ый) элемент, что невозможно сделать, если только i=1.

Таким образом, вам необходимо определить, какая из операций индексирования пытается получить доступ к элементу, который не существует.

...