Невозможно выполнить назначение, потому что размер левой стороны 1 на 2, а размер правой стороны 2 на 2 - PullRequest
0 голосов
/ 16 апреля 2020

enter image description here

код пытается реализовать метод Эйлера и улучшить метод Эйлера до дифференциальных уравнений второго порядка, но есть ошибка размерности с массивом значений ys, в котором хранятся значения y и dy

f=@(x,y) [y(2); (2/x)*y(2)-(2/x^2)*y(1)];     % function through a function handle
x0 = 1; y0 = [4,9]; xf=2;                          % IC

    % Improve and Euler's Method
    [xs,ys] = ode45(f,[x0,xf],y0);
    [xsi1,ysi1] = Ieuler(f,[x0,xf],y0,0.1);
    [xse1,yse1] = euler(f,[x0,xf],y0,0.1);
    [xsi2,ysi2] = Ieuler(f,[x0,xf],y0,0.5);
    [xse2,yse2] = euler(f,[x0,xf],y0,0.5);

    % plotting all solutions
    plot(xsi1,ysi1(:,1),'-b','LineWidth',1.5); hold on;
    plot(xse1,yse1(:,1),'-r','LineWidth',1.5); hold on;
    plot(xsi2,ysi2(:,1),'-g','LineWidth',1.5); hold on;
    plot(xse2,yse2(:,1),'-k','LineWidth',1.5); hold on;
    plot(xs,ys(:,1),'-b','LineWidth',1.5); hold on;
    axis([0 xf -0.1 4]); xlabel('x');ylabel('y')

Во второй части кода построена функция для реализации метода Эйлера

%Funcition calls
% function: Euler's Method implementation
function [xs,ys] = euler(f,xv,y0,h)
  x0 = xv(1); X = xv(2);
  N = (X-x0)/h;
  xs = zeros(N+1,1); ys = zeros(N+1,length(y0));
  x = x0; y = y0;
  xs(1) = x; ys(1,:) = y';
  for i = 1:N
      s1 = f(x,y);                  %evalute direction field at current point
      y= y+s1*h;                    %find new y
      x = x+h;
      xs(i+1) = x; ys(i+1,:) = y';  %store y(1), y(2) in a row array
  end
end
% function: Improved Euler's Method implementation
function [xs,ys] = Ieuler(f,xv,y0,h)
  x0 = xv(1); X = xv(2);
  N = (X-x0)/h;
  xs = zeros(N+1,1); ys = zeros(N+1,length(y0));
  x = x0; y = y0;
  xs(1) = x; ys(1,:) = y';
  for i = 1:N
      s1 = f(x,y);                  %evaluate direction field at current point
      yE= y+s1*h;                   %find euler value yE
      s2 = f(x+h,yE);               %evalute direction field at euler point
      y = y + h*((s1+s2)/2);        *%find new y*
      x = x+h;
      xs(i+1) = x; ys(i+1,:) = y';  *%store y(1), y(2) in a row array* 
  end
end
Unable to perform assignment because the size of the left side is 1-by-2 and the
size of the right side is 2-by-2.

Error in Untitled>Ieuler (line 63)
      xs(i) = x; ys(i,:) = y';

Error in Untitled (line 20) 
    [xsi1,ysi1] = Ieuler(f,[x0,xf],y0,0.1);

1 Ответ

1 голос
/ 17 апреля 2020
  1. прекратить запись нескольких строк логики c (оканчивающихся на ;) в одной текстовой строке. Даже не ясно, какая команда вызывает ошибку, поскольку в этой строке их две! (Кстати, именно это ys(i+1,:) = y';)
  2. лишить ваш код. Вы должны предоставить минимальный воспроизводимый пример (это не художественный конкурс ... и поскольку ошибка возникает в Ieuler, в остальном нет необходимости).
  3. ваша ошибка : что ваш дескриптор функции ´f´ возвращает вектор, но y - это массив => вы получите матрицу, которую вы хотите присвоить массиву ys(i+1,:) = y' (по какой-либо причине вы переносите это ). решение: позвольте f вернуть массив: f=@(x,y) [y(2), (2/x)*y(2)-(2/x^2)*y(1)]; (обратите внимание на запятую) или транспонировать его возвращаемое значение s1 = f(x,y).'; (рекомендуется использовать .' для несложных преобразований - для ясность.

Совет: Посмотрите, как отлаживать в MATLAB. Вы, вероятно, могли бы отследить это, установив точку останова непосредственно перед строкой, где происходит ошибка (или даже активируйте Пауза при ошибках ) и проверьте размеры.

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