Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 无法执行分配,因为左侧的大小为1×2,右侧的大小为2×2_Matlab - Fatal编程技术网

Matlab 无法执行分配,因为左侧的大小为1×2,右侧的大小为2×2

Matlab 无法执行分配,因为左侧的大小为1×2,右侧的大小为2×2,matlab,Matlab,代码试图实现Euler方法并将Euler方法改进为二阶微分方程,但存储y和dy值的ys值数组存在维数错误 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,[x

代码试图实现Euler方法并将Euler方法改进为二阶微分方程,但存储y和dy值的ys值数组存在维数错误

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')
代码的第二部分是实现Euler方法的构造函数

%Function 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);                  %evaluate 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
  • 停止在一个文本中写入多个逻辑行(以
    结尾) 线路。甚至不清楚是哪个命令导致了错误,因为 这一行有两个!(顺便说一句,这是
    ys(i+1,:)=y';
  • 去掉你的代码。你应该提供一个最小的可重复的例子 (这不是一场艺术竞赛……由于错误发生在
    Ieuler
    中,因此不需要进行其他比赛)
  • 您的错误是:您的函数句柄“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中调试。您可能已经通过在发生错误的行之前放置一个断点(甚至激活暂停错误)并检查尺寸来跟踪此问题

    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);