2015-11-01 136 views
0

我试图在一个500乘500的方框中模拟一个球及其x和y位置在一定时间内的碰撞。每当我尝试运行于不同的时间步长的脚本(h),我不断收到错误:下标分配尺寸不匹配错误

Subscripted assignment dimension mismatch.

global h 
h_vector=[0.1 0.01 0.001]; 
t=0:h:500; 

for j=1:length(h_vector) 
h=h_vector(j); 
[xout2,yout2]=walls_euler_method2e; 
xout3(j,:)=xout2; 
yout3(j,:)=yout2; 
end 
xout3; 
yout3; 

function [xout2,yout2]=walls_euler_method2e 
global h 
f1=5;%dx/dt 
f2=-3;%dy/dt 
x(1)=0; 
y(1)=0; 
t=0:h:500; 
r=5;%radius of ball 
hit_vertical_wall_left_first=0; 
hit_horizontal_wall_down_first=0; 
vertical_wall_left=250; 
vertical_wall_right=-250; 
horizontal_wall_up=250; 
horizontal_wall_down=-250; 
for i=2:length(t) 
x(i)=x(i-1)+h.*f1; 
y(i)=y(i-1)+h.*f2; 
if x(i)==vertical_wall_left-r 
    f1=-f1; 
hit_vertical_wall_left_first=1; 
elseif x(1)==vertical_wall_right+r&&hit_vertical_wall_left_first==1; 
    f1=-f1; 
else 
    fl=f1; 

if y(i)==horizontal_wall_down+r 
    f2=-f2; 
    hit_horizontal_wall_down_first=1; 

elseif y(i)==horizontal_wall_up-r&&hit_horizontal_wall_down_first==1; 
     f2=-f2; 
else 
    f2=f2; 
end 
end 
end 

xout2=x; 
yout2=y; 
+0

你在哪一行得到错误?这意味着您正在尝试为不同数量的存储空间分配多个元素,即您的左手侧与右手侧不相等。 – Adriaan

+0

错误发生在:xout3(J,:)= xout2 – scoobydoo9000

+0

我认为阵列'xout2'比xout3'的'列的宽度更短或更长。通过执行size(xout2)'和enlarger来检查这个问题,或者相应地缩短你的数组。 – Adriaan

回答

1

简单的解决方法:使用电池阵列:

xout3{j} = xout2; 
yout3{j} = yout2; 

您在步骤定义th,并且由于h变得更小,所以t的长度增加,因此也就是你的xout2。单元格阵列允许使用不同大小的矩阵,并且用花括号代替圆角。

请注意,它是bad practise to use i or j as a variable。也可以尝试和使用global变量避免,最好是你的变量传递给实际的功能,看到修改后的代码:

function [xout2,yout2]=walls_euler_method2e(h) 
f1=5;%dx/dt 
f2=-3;%dy/dt 
x(1)=0; 
y(1)=0; 
t=0:h:500; 
r=5;%radius of ball 
hit_vertical_wall_left_first=0; 
hit_horizontal_wall_down_first=0; 
vertical_wall_left=250; 
vertical_wall_right=-250; 
horizontal_wall_up=250; 
horizontal_wall_down=-250; 
for ii=2:length(t) 
    x(ii)=x(ii-1)+h.*f1; 
    y(ii)=y(ii-1)+h.*f2; 
    if x(i)==vertical_wall_left-r 
     f1=-f1; 
     hit_vertical_wall_left_first=1; 
    elseif x(1)==vertical_wall_right+r&&hit_vertical_wall_left_first==1; 
     f1=-f1; 
    else 
     fl=f1; 

     if y(i)==horizontal_wall_down+r 
      f2=-f2; 
      hit_horizontal_wall_down_first=1; 

     elseif y(ii)==horizontal_wall_up-r&&hit_horizontal_wall_down_first==1; 
      f2=-f2; 
     else 
      f2=f2; 
     end 
    end 
end 

xout2=x; 
yout2=y; 
end 

脚本:

h_vector=[0.1 0.01 0.001]; 
for jj=1:length(h_vector) 
    t = 0:h_vector(jj):500; 
    [xout2,yout2]=walls_euler_method2e(h_vector(jj)); 
    xout3{jj}=xout2; 
    yout3{jj}=yout2; 
end 

结果:

xout3 = 
    [1x5001 double] [1x50001 double] [1x500001 double] 
yout3 = 
    [1x5001 double] [1x50001 double] [1x500001 double]