Index exceeds the number of array elements (1)

조회 수: 1 (최근 30일)
Nicholas Gillam
Nicholas Gillam 2019년 2월 20일
댓글: Star Strider 2019년 2월 20일
I'm getting the error as stated in the title, however I cannot determine where it comes from. Can anyone help me locate it and try and help me fix it?
% SPECIFY BOUNDARY VALUES AND NECESSARY PARAMETERS
A=1;B=1;
V1 = 0; V2 = 10; V3 = 20; V4 = -10;
NX = 20; %4 12 20
NY = NX;
H = A/NX;
for I = 1:NX-1
V(I+1, 1) = V1;
V(I+1, NY+1) = V3;
end
for J = 1:NY-1
V(1, J+1) = V4;
V(NX+1, J+1) = V2;
end
V(1,1) = (V1 + V4)/2.0;
V(NX+1, 1) = (V1 + V2)/2.0;
V(1, NY+1) = (V3 + V4)/2.0;
V(NX+1, NY+1) = (V2 + V3)/2.0;
%optimum
T = cos(pi/NX) + cos(pi/NY);
W = (8- sqrt(64-16*T^2))/(T^2);
disp(['SOR Factor Omega = ', num2str(W)])
W4 = W/4;
%iteration begin
NCOUNT = 0;
loop = 1;
while loop == 1;
RMIN = 0;
for I = 1:NX-1
X = H*I;
for J = 1:NY-1
Y = H*J;
G = -36.0*pi*X*(Y-1.0);
R = W4*(V(I+1, J+1) + V(I, J+1) + V(I+1, J+2) + V(I+1, J) -4.0*V(I+1, J+1) - G*H*H);
RMIN = RMIN + abs(R);
V(I+1, J+1) = V(I+1, J+1) + R;
end
end
RMIN = RMIN(NX*NY);
if(RMIN >= 0.0001)
NCOUNT = NCOUNT +1;
if(NCOUNT >100)
loop = 0;
disp('Solution non convergent in 100 iterations')
end
else
loop = 0;
disp(['Solution convergent in ',num2str(NCOUNT),'iterations'])
disp(['h = ', num2str(H)])
end
end
Vnum = V;
%original pts through i
abc = zeros(1,9);
a_tic = 1;
vec = [0:h:1];
for ii= .25:.25:.75
for jj = .25:.25:.75
xind = find(vec==ii);
yinf = find(vec==kk);
%disp([xind, yind])
abc(a_tic) = Vnum(xind, yind);
a_tic = a_tic +1;
end
end
%Output approxiamte results
for I = 1:NX-1
X = H*I;
for J = 1:NY-1
Y = H*J
SUM = 0;
for M = 1:10 %only need first 10 terms in series
FM = M;
for N = 1:10
FN = N;
FACTOR1 = (FM*pi/A)^2 + (FN*pi/B)^2;
FACTOR2 = ((-1)^(M+N))*144*A*B/(pi*FM*FN);
FACTOR3 = 1 - (1- (-1)^N/B);
FACTOR = FACTOR2 * FACTOR3 / FACTOR1;
SUM = SUM + FACTOR*sin(FM*pi*X/A)*sin(FN*pi*Y/B);
end
end
VH = SUM;
V = V';
E = gradient(V);
E = -E;
[Ex,Ey] =gradient(V);
Ex = -Ex;
Ey = -Ey;
x_range = (1:Nx)-mpx;
y_range = (1:Ny)-mpy;
figure(1)
contour_range_V = -130:1:130;
contour(x_range,y_range,V,contour_range_V,'linewidth',3);
axis([min(x_range) max(x_range) min(y_range) max(y_range)]);
colorbar('location','eastoutside','fontsize',14);
xlabel('x ','fontsize',14);
ylabel('y ','fontsize',14);
title('Electric Potential distribution, V in volts','fontsize',14);
h1=gca;
set(h1,'fontsize',14);
fh1 = figure(1);
set(fh1, 'color', 'white')
xlim([0 0.1])
ylim([0 0.05])
figure(2)
contour(x_range,y_range,E,'linewidth',0.5);
hold on;
quiver(x_range,y_range,Ex,Ey,4);
axis([-10 10 -10 10]);
title('Electric field Lines, E (x,y) in V/m','fontsize',14);
colorbar('location','eastoutside','fontsize',14);
xlabel('x-axis in meters','fontsize',14);
ylabel('y-axis in meters','fontsize',14);
h2=gca;
set(h2,'fontsize',14);
fh2 = figure(2);
set(fh2, 'color', 'white')
xlim([0 0.1])
ylim([0 0.05])

답변 (2개)

Star Strider
Star Strider 2019년 2월 20일
편집: Star Strider 2019년 2월 20일
This line is throwing the error:
RMIN = RMIN(NX*NY);
Since ‘RMIN’ is a scalar, it seems that you might be missing a multiplication (or other) operator, for example:
RMIN = RMIN*(NX*NY);
or some such.
EDIT —
There are also some end calls missing from the code you posted.
  댓글 수: 6
Nicholas Gillam
Nicholas Gillam 2019년 2월 20일
My bad, should've posted updated code.
% SPECIFY BOUNDARY VALUES AND NECESSARY PARAMETERS
A=1;B=1;
V1 = 0; V2 = 10; V3 = 20; V4 = -10;
NX = 20; %4 12 20
NY = NX;
H = A/NX;
for I = 1:NX-1
V(I+1, 1) = V1;
V(I+1, NY+1) = V3;
end
for J = 1:NY-1
V(1, J+1) = V4;
V(NX+1, J+1) = V2;
end
V(1,1) = (V1 + V4)/2.0;
V(NX+1, 1) = (V1 + V2)/2.0;
V(1, NY+1) = (V3 + V4)/2.0;
V(NX+1, NY+1) = (V2 + V3)/2.0;
%optimum
T = cos(pi/NX) + cos(pi/NY);
W = (8- sqrt(64-16*T^2))/(T^2);
disp(['SOR Factor Omega = ', num2str(W)])
W4 = W/4;
%iteration begin
NCOUNT = 0;
loop = 1;
while loop == 1;
RMIN = 0;
for I = 1:NX-1
X = H*I;
for J = 1:NY-1
Y = H*J;
G = -36.0*pi*X*(Y-1.0);
R = W4*(V(I+1, J+1) + V(I, J+1) + V(I+1, J+2) + V(I+1, J) -4.0*V(I+1, J+1) - G*H*H);
RMIN = RMIN + abs(R);
V(I+1, J+1) = V(I+1, J+1) + R;
end
end
RMIN = RMIN/(NX*NY);
if(RMIN >= 0.0001)
NCOUNT = NCOUNT +1;
if(NCOUNT >100)
loop = 0;
disp('Solution non convergent in 100 iterations')
end
else
loop = 0;
disp(['Solution convergent in ',num2str(NCOUNT),'iterations'])
disp(['h = ', num2str(H)])
end
end
Vnum = V;
%original pts through i
abc = zeros(1,9);
a_tic = 1;
vec = [0:H:1];
for ii= .25:.25:.75
for jj = .25:.25:.75
xind = find(vec==ii);
yind = find(vec==jj);
%disp([xind, yind])
abc(a_tic) = Vnum(xind, yind);
a_tic = a_tic +1;
end
end
%Output approxiamte results
for I = 1:NX-1
X = H*I;
for J = 1:NY-1
Y = H*J
SUM = 0;
for M = 1:10 %only need first 10 terms in series
FM = M;
for N = 1:10
FN = N;
FACTOR1 = (FM*pi/A)^2 + (FN*pi/B)^2;
FACTOR2 = ((-1)^(M+N))*144*A*B/(pi*FM*FN);
FACTOR3 = 1 - (1- (-1)^N/B);
FACTOR = FACTOR2 * FACTOR3 / FACTOR1;
SUM = SUM + FACTOR*sin(FM*pi*X/A)*sin(FN*pi*Y/B);
end
end
end
end
VH = SUM;
V = V';
E = gradient(V);
E = -E;
[Ex,Ey] =gradient(V);
Ex = -Ex;
Ey = -Ey;
x_range = (1:NX)-V;
y_range = (1:NY)-V;
figure(1)
contour_range_V = -130:1:130;
contour(x_range,y_range,V,contour_range_V,'linewidth',3);
axis([min(x_range) max(x_range) min(y_range) max(y_range)]);
colorbar('location','eastoutside','fontsize',14);
xlabel('x ','fontsize',14);
ylabel('y ','fontsize',14);
title('Electric Potential distribution, V in volts','fontsize',14);
h1=gca;
set(h1,'fontsize',14);
fh1 = figure(1);
set(fh1, 'color', 'white')
xlim([0 0.1])
ylim([0 0.05])
figure(2)
contour(x_range,y_range,E,'linewidth',0.5);
hold on;
quiver(x_range,y_range,Ex,Ey,4);
axis([-10 10 -10 10]);
title('Electric field Lines, E (x,y) in V/m','fontsize',14);
colorbar('location','eastoutside','fontsize',14);
xlabel('x-axis in meters','fontsize',14);
ylabel('y-axis in meters','fontsize',14);
h2=gca;
set(h2,'fontsize',14);
fh2 = figure(2);
set(fh2, 'color', 'white')
xlim([0 0.1])
ylim([0 0.05])
Star Strider
Star Strider 2019년 2월 20일
Indeed they must.
Note that:
x_range = (1:NX)-V;
creates ‘(1:NX)’ as a (1 x 20) vector, and ‘V’ is a (21 x 21) matrix. If they both had one dimension in common, you could probably use the bsxfun function to do the subtraction. As it is, they are completely incompatible.

댓글을 달려면 로그인하십시오.


James Tursa
James Tursa 2019년 2월 20일
편집: James Tursa 2019년 2월 20일
Type the following at the command line:
dbstop if error
Then run your code. When the error occurs, the code will pause at that line with all variables intact. Examine them to see what the size issues are, then backtrack in your code to figure out why they are not the sizes you expected.

카테고리

Help CenterFile Exchange에서 Matched Filter and Ambiguity Function에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by