2015-11-01 116 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]