Matlab 无法执行分配,因为左侧的大小为1×2,右侧的大小为2×2
代码试图实现Euler方法并将Euler方法改进为二阶微分方程,但存储y和dy值的ys值数组存在维数错误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
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
中,因此不需要进行其他比赛)y
是一个数组=>您将得到一个矩阵,您希望将其分配给数组ys(i+1,:)=y'
(无论出于何种原因,您正在转置它)解决方案:让f
返回一个数组:f=@(x,y)[y(2)、(2/x)*y(2)-(2/x^2)*y(1)]
(注意逗号)或将其返回值转置为s1=f(x,y)。”
(为了清晰起见,最好将“
用于非复杂的换位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);