Index exceeds the number of array elements (1)

1 次查看(过去 30 天)
Can anyone please help me to resolve my issue. I have been trying to resolve it since two days. It's not easy for me as I am new to MATLAB.
close all; clear all; clc;
%initializing x,y,t
h=0.01; %step size
t=0:h:300;
x1 = zeros(1,numel(t)); y1 = x1; x2 = x1; y2 = x1;
x1(1)=1;
y1(1)=1;
x2(1)=2;
y2(1)=2;
%value of constants
a=0.1;
b=0.3;
omega=4;
Cnp=0.2;
G=1;
%ode
p=@(x1,y1,x2,y2) (a-x1^2-y1^2)*x1-omega*y1+G*Cnp*(x2-x1);
q=@(x1,y1,x2,y2) (a-x1^2-y1^2)*y1+omega*x1+G*Cnp*(y2-y1);
%loop
for i=1:(length(t)-1)
k1=p(x1(i),y1(i),x2(i),y2(i));
l1=q(x1(i),y1(i),x2(i),y2(i));
k2=p((x1(i)+(h/2)*k1),(y1(i)+(h/2)*l1),(x2(i)+(h/2)*k1),(y2(i)+(h/2)*l1));
l2=q((x1(i)+(h/2)*k1),(y1(i)+(h/2)*l1),(x2(i)+(h/2)*k1),(y2(i)+(h/2)*l1));
k3=p((x1(i)+(h/2)*k2),(y1(i)+(h/2)*l2),(x2(i)+(h/2)*k2),(y2(i)+(h/2)*l2));
l3=q((x1(i)+(h/2)*k2),(y1(i)+(h/2)*l2),(x2(i)+(h/2)*k2),(y2(i)+(h/2)*l2));
k4=p((x1(i)+k3*h),(y1(i)+l3*h),(x2(i)+k3*h),(y2(i)+l3*h));
l4=q((x1(i)+k3*h),(y1(i)+l3*h),(x2(i)+k3*h),(y2(i)+l3*h));
x1(i+1) = x1(i) + h*(k1+2*k2+2*k3+k4)/6;
y1(i+1) = y1(i) + h*(l1+2*l2+2*l3+l4)/6;
x2(i+1) = x2(i) + h*(k1+2*k2+2*k3+k4)/6;
y2(i+1) = y2(i) + h*(l1+2*l2+2*l3+l4)/6;
end
%draw
plot(t,x1,'r',t,x2,'y')
xlabel('t','fontsize',14,'fontweight','bold')
ylabel('x1 & x2','fontsize',14,'fontweight','bold')
set(gca,'Color','k')
legend('x1','x2','TextColor','w')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x1=x1(101:300);
y1=y1(101:300);
x2=x2(101:300);
y2=y2(101:300);
X1dot=(x1(2:101)-x1(1:100))/h;
X2dot=(x2(2:101)-x2(1:100))/h;
Y1dot=(y1(2:101)-y1(1:100))/h;
Y2dot=(y2(2:101)-y2(1:100))/h;
hold on
M=zeros([100,10]);
for i=1:100
for j=1:32
if j==1
M(i,j)=1;
elseif j==2
M(i,j)=x1(i);
elseif j==3
M(i,j)=x2((i));
elseif j==4
M(i,j)=y1((i));
elseif j==5
M(i,j)=y2((i));
elseif j==6
M(i,j)=x1(i)*x2(i);
elseif j==7
M(i,j)=y1((i))*y2((i));
elseif j==8
M(i,j)=x1((i))*y1((i));
elseif j==9
M(i,j)=x1((i))*y2((i));
elseif j==10
M(i,j)=x2((i))*y1((i));
elseif j==11
M(i,j)=x2((i))*y2((i));
elseif j==12
M(i,j)=x1(i)*x2(i)*y1(i);
elseif j==13
M(i,j)=x1(i)*x2(i)*y2(i);
elseif j==14
M(i,j)=x1(i)*y1(i)*y2(i);
elseif j==15
M(i,j)=x2(i)*y1(i)*y2(i);
elseif j==16
M(i,j)=x1(i)*x2(i)*y1(i)*y2(i);
elseif j==17
M(i,j)=x1(i)^2;
elseif j==18
M(i,j)=x2(i)^2;
elseif j==19
M(i,j)=y1(i)^2;
elseif j==20
M(i,j)=y2(i)^2;
elseif j==21
M(i,j)=x1(i)^2*x2(i);
elseif j==22
M(i,j)=x1(i)^2*y1(i);
elseif j==23
M(i,j)=x1(i)^2*y2(i);
elseif j==24
M(i,j)=x2(i)^2*x1(i);
elseif j==25
M(i,j)=x2(i)^2*y1(i);
elseif j==26
M(i,j)=x2(i)^2*y2(i);
elseif j==27
M(i,j)=y1(i)^2*x1(i);
elseif j==28
M(i,j)=y1(i)^2*x2(i);
elseif j==29
M(i,j)=y1(i)^2*y2(i);
elseif j==30
M(i,j)=y2(i)^2*x1(i);
elseif j==31
M(i,j)=y2(i)^2*x2(i);
else
M(i,j)=y2(i)^2*y1(i);
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Reconstructed Signal %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x1_rec(1)=x1(1);
y1_rec(1)=y1(1);
x2_rec(1)=x2(1);
y2_rec(1)=y2(1);
%value of constants
%a1=x1
a1=0.0305;
a2=0.0000;
a3=0.0000;
a4=-3.2154;
a5=0.0000;
a6=0.0000;
a7=0.0000;
a8=0.0000;
a9=0.0000;
a10=-0.5857;
a11=0.0000;
a12=0.0000;
a13=0.0000;
a14=0.0000;
a15=0.0000;
a16=0.0000;
a17=0.0000;
a18=0.0000;
a19=0.0000;
a20= 0.2412;
a21=0.0000;
a22=0.0000;
a23=0.0000;
a24=0.0000;
a25=0.0000;
a26=0.0000;
a27=0.0000;
a28=0.0000;
a29=0.0000;
a30=0.0000;
a31=0.0000;
a32=0.0000;
%c=x2
c1=0.0305;
c2=0.0000;
c3=0.0000;
c4=-3.2154;
c5=0.0000;
c6=0.0000;
c7=0.0000;
c8=0.0000;
c9=0.0000;
c10=-0.5857;
c11=0.0000;
c12=0.0000;
c13=0.0000;
c14=0.0000;
c15=0.0000;
c16=0.0000;
c17=0.0000;
c18=0.0000;
c19=0.0000;
c20=0.2412;
c21=0.0000;
c22=0.0000;
c23=0.0000;
c24=0.0000;
c25=0.0000;
c26=0.0000;
c27=0.0000;
c28=0.0000;
c29=0.0000;
c30=0.0000;
c31=0.0000;
c32=0.0000;
h=0.01; %step size
t=0:h:200;
%ode
p=@(x1_rec,y1_rec,x2_rec,y2_rec) a1+a2*x1_rec+a3*x2_rec+a4*y1_rec+a5*y2_rec+a6*x1_rec*x2_rec+a7*y1_rec*y2_rec+a8*x1_rec*y1_rec+a9*x1_rec*y2_rec+a10*x2_rec*y1_rec+a11*x2_rec*y2_rec+a12*x1_rec*x2_rec*y1_rec+a13*x1_rec*x2_rec*y2_rec+a14*x1_rec*y1_rec*y2_rec+a15*x2_rec*y1_rec*y2_rec+a16*x1_rec*x2_rec*y1_rec*y2_rec+a17*x1_rec^2+a18*x2_rec^2+a19*y1_rec^2+a20*y2_rec^2+a21*x1_rec^2*x2_rec+a22*x1_rec^2*y1_rec+a23*x1_rec^2*y2_rec+a24*x2_rec^2*x1_rec+a25*x2_rec^2*y1_rec+a26*x2_rec^2*y2_rec+a27*y1_rec^2*x1_rec+a28*y1_rec^2*x2_rec+a29*y1_rec^2*y2_rec+a30*y2_rec^2*x1_rec+a31*y2_rec^2*x2_rec+a32*y2_rec^2*y1_rec;
q=@(x1_rec,y1_rec,x2_rec,y2_rec) c1+c2*x1_rec+c3*x2_rec+c4*y1_rec+c5*y2_rec+c6*x1_rec*x2_rec+c7*y1_rec*y2_rec+c8*x1_rec*y1_rec+c9*x1_rec*y2_rec+c10*x2_rec*y1_rec+c11*x2_rec*y2_rec+c12*x1_rec*x2_rec*y1_rec+c13*x1_rec*x2_rec*y2_rec+c14*x1_rec*y1_rec*y2_rec+c15*x2_rec*y1_rec*y2_rec+c16*x1_rec*x2_rec*y1_rec*y2_rec+c17*x1_rec^2+c18*x2_rec^2+c19*y1_rec^2+c20*y2_rec^2+c21*x1_rec^2*x2_rec+c22*x1_rec^2*y1_rec+c23*x1_rec^2*y2_rec+c24*x2_rec^2*x1_rec+c25*x2_rec^2*y1_rec+c26*x2_rec^2*y2_rec+c27*y1_rec^2*x1_rec+c28*y1_rec^2*x2_rec+c29*y1_rec^2*y2_rec+c30*y2_rec^2*x1_rec+c31*y2_rec^2*x2_rec+c32*y2_rec^2*y1_rec;
%loop
for i=1:(length(t)-1)
k1=p(x1_rec(i),y1_rec(i),x2_rec(i),y2_rec(i));
l1=q(x1_rec(i),y1_rec(i),x2_rec(i),y2_rec(i));
k2=p((x1_rec(i)+(h/2)*k1),(y1_rec(i)+(h/2)*l1),(x2_rec(i)+(h/2)*k1),(y2_rec(i)+(h/2)*l1));
l2=q((x1_rec(i)+(h/2)*k1),(y1_rec(i)+(h/2)*l1),(x2_rec(i)+(h/2)*k1),(y2_rec(i)+(h/2)*l1));
k3=p((x1_rec(i)+(h/2)*k2),(y1_rec(i)+(h/2)*l2),(x2_rec(i)+(h/2)*k2),(y2_rec(i)+(h/2)*l2));
l3=q((x1_rec(i)+(h/2)*k2),(y1_rec(i)+(h/2)*l2),(x2_rec(i)+(h/2)*k2),(y2_rec(i)+(h/2)*l2));
k4=p((x1_rec(i)+k3*h),(y1_rec(i)+l3*h),(x2_rec(i)+k3*h),(y2_rec(i)+l3*h));
l4=q((x1_rec(i)+k3*h),(y1_rec(i)+l3*h),(x2_rec(i)+k3*h),(y2_rec(i)+l3*h));
x1_rec(i+1) = x1_rec(i) + h*(k1+2*k2+2*k3+k4)/6;
x2_rec(i+1) = x2_rec(i) + h*(k1+2*k2+2*k3+k4)/6;
end
plot(x1_rec(1:length(x1)),'r','LineWidth',2)
plot(x2_rec(1:length(x2)),'b','LineWidth',2)
%%%%%Error%%%%
Index exceeds the number of array elements (1).
Error in coup_withoutcvx (line 208)
k1=p(x1_rec(i),y1_rec(i),x2_rec(i),y2_rec(i));

采纳的回答

Walter Roberson
Walter Roberson 2020-11-26
You increase the size of x1_rec and x2_rec in the loop, but you do not increase the size of y2_rec, so when i becomes 2 then
k1=p(x1_rec(i),y1_rec(i),x2_rec(i),y2_rec(i));
is going to require y2_rec(2) which does not exist.
  4 个评论
Walter Roberson
Walter Roberson 2020-11-26
x2_rec(i+1) = x2_rec(i) + h*(k1+2*k2+2*k3+k4)/6;
y1_rec(i+1) = rand;
y2_rec(i+1) = rand;
... since I have no idea what the formulas should be.
Your code looks like it might be a Runge-Kutta method. If so you should probably study the material on Runge-Kutta.

请先登录,再进行评论。

更多回答(1 个)

Geoff Hayes
Geoff Hayes 2020-11-26
The error is here
k1=p(x1_rec(i),y1_rec(i),x2_rec(i),y2_rec(i));
l1=q(x1_rec(i),y1_rec(i),x2_rec(i),y2_rec(i));
where the y1_rec and the y2_rec are 1x1 scalars yet you are treating them as if they are arrays. Since i is the for loop "step" variable, then on the second iteration of this loop you will get the "index exceeds number of array elements". You either need to treat them as scalars or update the y1_rec and y2_rec arrays on each iteration of the loop like you do for the x1_rec and x2_rec.

类别

Help CenterFile Exchange 中查找有关 Matrix Indexing 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by