How can I fix the error of NaN?

조회 수: 64 (최근 30일)
Muhammad Abdulrasool
Muhammad Abdulrasool 2015년 11월 25일
댓글: Muhammad Abdulrasool 2015년 11월 26일
Hello, I want to select a range of elements in matrix p0(i,j), i started from (at-9) to (at+9) and j started from 1 to n, (n=20) and the value of at is known. then do calculation for p0, but when i run it, it gives this error: "Attempted to access p0(NaN,2); index must be a positive integer or logical. Error in static (line 27) p0(i,j)=pin;" Please, I need to fix this error. thanks in advace.
clear all;clc;
m=360; n=20; d=240; l=240;error=1e-4;RF=0.95;erin=0;
error_alt=1*pi/180;
deltheta=2*pi/m; delz=1/n;
pin=1;
s=(d*d)/(l*l);
R=1/deltheta^2;
cor=(deltheta^2/delz^2)*s;
p0=zeros(m+1,n+1);
p=zeros(m+1,n+1);
p1=zeros(m+1,n+1);
h=zeros(m+1);theta=zeros(m+1);
ees=0.5; iter=1000;
for i=1:m+1
theta(i)=(i-1)*deltheta;
h(i)=1+ees*cos(theta(i));
end
sum(1)=0;
alt1=atan(sqrt(1.0-ees^2)/ees);
alt1=m+1-(alt1*180/pi);
at=round(alt1);
disp(at)
for k=1:iter
sumij=0;
for j=2:n
for i=(at-9):(at+9);
p0(i,j)=pin;
end
end
for j=2:n
p0(m+1,j)=p0(1,j);
end
for j=2:n
for i=1:m
if (i==1)
h1=1+ees*cos(theta(i)+0.5*deltheta);
h2=1+ees*cos(theta(i)-0.5*deltheta);
conh=h1-h2;
const=2*(1+cor)*R*h(i)^3;
A=3*h(i)^2*R*conh/const;
C=h(i)^3*R/const;
E=h(i)^3*R*cor/const;
G=-3*sqrt(R)*conh/const;
p(i,j)=(C+A/2)*p0(i+1,j)+(C-A/2)*p0(m,j)+E*(p0(i,j+1)+p0(i,j-1))+G;
else
conh=(h(i+1)-h(i-1))/2;
const=2*(1+cor)*R*h(i)^3;
A=3*h(i)^2*R*conh/const;
C=h(i)^3*R/const;
E=h(i)^3*R*cor/const;
G=-3*sqrt(R)*conh/const;
p(i,j)=(C+A/2)*p0(i+1,j)+(C-A/2)*p0(i-1,j)+E*(p0(i,j+1)+p0(i,j-1))+G;
end
if p(i,j)<0
p(i,j)=0.0;
sumij=sumij+p(i,j);
else
end
end
end
for j=2:n
p(m+1,j)=p(1,j);
end
for j=2:n
for i=(at-9):(at+9)
p(i,j)=p0(i,j);
end
end
sum(k+1)=sumij;
percentage=abs(sum(k+1)-sum(k))/abs(sum(k+1));
if percentage < 0.0001
for j=1:n
for i=1:m
p1(i,j)=p(i,j);
if p1(i,j) < 0
p1(i,j)=0;
end
end
end
else
for j=2:n
for i=1:m
p0(i,j)=RF*p(i,j)+(1-RF)*p0(i,j);
end
end
end
wr=0;
for j=1:n+1
wi=0.0;
for i=1:m
wi=wi+p1(i,j)*cos(theta(i))*deltheta;
end
wr=wr+wi*delz;
end
wt=0.0;
for j=1:n+1
wi=0.0;
for i=1:m
wi=wi+p1(i,j)*sin(theta(i))*deltheta;
end
wt=wt+wi*delz;
end
w=sqrt(wr^2+wt^2);
alt=atan(wt/wr);
alt=m+1+(alt*180/pi);
erin=abs(alt-alt1)/abs(alt);
if erin<error_alt
kjk=fprintf(1,'%4i\r\n',alt);
break
else
alt1=0.5*alt+(1-0.5)*alt1;
at=round(alt1);
end
end
y=k;
figure(1)
surf(p1)
figure(2)
plot(p)

채택된 답변

Thorsten
Thorsten 2015년 11월 25일
The code breaks when you want to compute
alt=atan(wt/wr);
with wr = 0, resulting in alt = NaN.
Instead, use
alt = atan2(wt, wr);
  댓글 수: 4
Thorsten
Thorsten 2015년 11월 26일
Muhammad, you have
percentage=abs(sum(k+1)-sum(k))/abs(sum(k+1));
and when the denominator abs(sum(k+1)) == 0, percentage is NaN. I don't know what you want to compute here, so you have to fix this yourself. And note that sum is a function in Matlab, so please do not use sum as the name of a variable. Use thesum or mysum or S or whatever pleases you.
Muhammad Abdulrasool
Muhammad Abdulrasool 2015년 11월 26일
OK Thorsten, I'll change that, and I want in this step to compute the error between step and the next step (in order to reach the convergence criterion).

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

추가 답변 (0개)

카테고리

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