# Index in position 2 exceeds array bounds

9 views (last 30 days)
Hadi Ahmed on 16 Mar 2020
Answered: Guillaume on 16 Mar 2020
Have a function to model a quarter-car suspension system and am attempting to solve values at differnet stiffnesses adjusting values to use different functions and compare their pros/cons. I keep getting the error that the 'Index in position 2 exceeds array bounds.'
Arms -> Root mean square of acceleration
Vh=30*0.44704;B=2200;K2=10440;K1=5410;t=[0, 20];M=345;m=20;
%0.44704 is conversion from mph to m/s
opts=odeset('MaxStep',0.1);
[T,X]=ode23s(@(t,x)p5fun(t,x,Vh,B,K1,K2),[0 20],[0,0,0,0],opts);
y=X(:,1);z=X(:,2);vy=X(:,3);vz=X(:,4); %Asssigning the columns in X to corresponding values
figure(1)
subplot(2,2,1);plot(T,y)
subplot(2,2,2);plot(T,z)
subplot(2,2,3);plot(T,vy)
subplot(2,2,4);plot(T,vz)
dotvy=(K2/M)*(z-y)+(B/M)*(vz-vy); %Equation for vertical acceleration
figure(2)
plot(T,dotvy);
ymax=max(abs(y)); %Finding the maximum value for displacement
Arms=sqrt((1/20)*trapz(T,dotvy.^2)); %Equation to describe the root mean square of acceleration
fprintf('The max vertical displacement is %g metres. \n',ymax)
fprintf('The root mean square of acceleration is %g m/s^2.\n',Arms)
Vht=[10:5:80]*0.44704; %Range of velocity values
for k=1:length(Vht)
[T1,X1]=ode23s(@(t,x)p5fun(t,x,Vht(k),B,K1,K2),[0 20],[0,0,0,0],opts); %Solve the equation for the kth values of Vht
[ymax1(k),Arms1(k)]=p5_3fun(Vh,B,K1,K2);
end
figure(3);plot(Vht,ymax1)
figure(4);plot(Vht,Arms1)
B1o=[1000:200:4000];
K2o=(5000:1000:15000);
for p=1:length(K2o)
[T1,X1]=ode23s(@(t,x)p5fun(t,x,Vh,B,K1,K2o(p)),[0 20],[0,0,0,0],opts);
[ymax2(p),Arms2(p)]=p5_3fun(Vh,B,K1,K2o(p));
end
figure(5); plot(K2o,ymax2)
figure(6);plot(K2o,Arms2)
for q=1:length(B1o)
[T1,X1]=ode23s(@(t,x)p5fun(t,x,Vh,B,K1,K2),[0 20],[0,0,0,0],opts);
[ymax3(q),Arms3(q)]=p5_3fun(Vh,B1o(q),K1,K2);
end
figure(7);plot(B1o,ymax3)
figure(8);plot(B1o,Arms3)
B1o=[1000:200:4000];
K2o=(5000:1000:15000);
for p=1:lgenth(K2o)
for q=1:length(B1o)
[T1,X1]=ode23s(@(t,x)p5fun(t,x,Vh,B1o(q),K1,K2(p),[0 20],[0,0,0,0],opts));
[ymax4(q,p),Arms4(q,p)]=p5_3fun(Vh,B1o(q),K1,K2o(p));
end
end
figure(9);mesh(K2o,B1o,ymax4)
figure(10);mesh(K2o,B1o,Arms4)
if (L>2) && (L<=2.5)
u=-0.2*(L-2); %The decreasing gradient for the car in the chuck hole
elseif (L>2.5) && (L<=3.5)
u=-0.1; %Height for car in chuck hole
elseif (L>3.5) && (L<=4)
u=0.2*(L+4); %Increasing gradient of car leaving chuck hole
elseif (L>4) && (L<=100)
u=0;
elseif (L>100) && (L<=104)
u=-0.15*sin((pi/4)*L-(28*pi)); %At the bump, this function describes the cars change in height
else
u=0; %If the value of L falls out of any restrictions as stated above
end
end
function dotx=p5fun(t,x,Vh,B,K1,K2)
dotx=[x(3);x(4);
(K2/M)*(x(2)-x(1))+(B/M)*(x(4)-x(3));
(K1/m)*(u-x(2))-(K2/m)*(x(2)-x(1))-(B/m)*(x(4)-x(3))];
end
function [ymax,Arms]=p5_3fun(Vht,B,K1,K2)
global X1 T1
M=345;
dotvy1=(K2/M).*(X1(:,2)-X1(:,1))+(B/M).*(X1(:,4)-X1(:,3));
ymax=max(abs(X1(:,1)));
Arms=sqrt((1/20)*trapz(T1,dotvy1.^2));
end
The error is shown below. It feels like something really simple but I can't figure it out. I understand I have a fucntion for ymax and Arms, and also a section dedicated to calculating these values. I was asked to do both.
Index in position 2 exceeds array bounds.
Error in the_last_one_pls>p5_3fun (line 82)
dotvy1=(K2/M).*(X1(:,2)-X1(:,1))+(B/M).*(X1(:,4)-X1(:,3));
Error in the_last_one_pls (line 23)
[ymax1(k),Arms1(k)]=p5_3fun(Vh,B,K1,K2);
Tried to fix it by declaring p5_3fun as below, but this presents the error that I am out of memory.
function [ymax,Arms]=p5_3fun(Vht,B,K1,K2)
%global X1 T1
M=345;
options =odeset('MaxStep',0.1);
[T1,X1]=ode23s(@(t,x)p5_3fun(Vht,B,K1,K2),[0 20],[0,0,0,0],options);
dotvy1=(K2/M).*(X1(:,2)-X1(:,1))+(B/M).*(X1(:,4)-X1(:,3));
ymax=max(abs(X1(:,1)));
Arms=sqrt((1/20)*trapz(T1,dotvy1.^2));
end

Guillaume on 16 Mar 2020
The error message is clear, you're using an index greater than the size of the 2nd dimension of an array. The only indexed array in your expression is X1 and your index goes up to 4, so clearly X1 has less than four columns.
Unfortunately, your X1 is global. We strongly advise against using global variables, they're the source of many problems such as this one. It's unclear where X1 is created, nowhere in the code you show so possibly it's never created and hence X1 is empty which would explain the error.
Your fix change the function into a never-ending recursive function, which tries to solve an ode with itself as the ode, so yes it's not going to end well. I'm a bit unclear why you tried that. Your original p5_3fun doesn't involve ODEs at all.
I've not really tried to understand what the rest of your code is doing, just looking at it, you could just replace the original p5_3fun by:
function [ymax,Arms]=p5_3fun(Vht,B,K1,K2, T1, X1) %just add T1 and X1 as inputs
M=345;
dotvy1=(K2/M).*(X1(:,2)-X1(:,1))+(B/M).*(X1(:,4)-X1(:,3));
ymax=max(abs(X1(:,1)));
Arms=sqrt((1/20)*trapz(T1,dotvy1.^2));
end
and add T1 and X1 to the input list every time you call p5_3fun, eg.:
for p=1:length(K2o)
[T1,X1]=ode23s(@(t,x)p5fun(t,x,Vh,B,K1,K2o(p)),[0 20],[0,0,0,0],opts);
[ymax2(p),Arms2(p)]=p5_3fun(Vh,B,K1,K2o(p), T1, X1); %now with T1 and X1 as inputs
end