why does it give this result???

조회 수: 4 (최근 30일)
Rebecca D'Onofrio
Rebecca D'Onofrio 2021년 9월 11일
답변: Tanmay Das 2021년 9월 13일
the code works well up to the moment I introduce the while loop. It says: "Warning: Matrix is singular, close to singular or badly scaled. Results may be inaccurate.
RCOND = NaN.
> In progettofinale (line 84)"
then, it always gives as a result BFinale=0 and consequently RAGGIO=inf
why??
nmax=100;
COEFFICIENTI=zeros(26,26);
BUCKLING=zeros(1,nmax);
K=zeros(1,nmax);
FLUSSI=zeros(26,nmax);
FLUSSIN=zeros(26,nmax);
B1=6E-5;
FLUSSO0=zeros(26,1);
for ii=1:26
FLUSSO0(ii)=1/F(ii);
end
for ii=1:26
for jj=1:26
for ii=jj
COEFFICIENTI(ii,jj)=D(ii).*B1+REMOVAL(ii);
end
end
end
for ii=2:26
COEFFICIENTI(ii,(ii-1))=-ELREM(ii);
end
for ii=1:26
for jj=1:26
COEFFICIENTI(ii,jj)=COEFFICIENTI(ii,jj)-INELASTIC(ii,jj);
end
end
FLUSSI(:,1)=COEFFICIENTI\X;
K1=F'.*FLUSSI(:,1);
FLUSSIN(:,1)=FLUSSI(:,1)\K1;
if K1>1
B2=B1+(0.5*B1);
else if K1<1
B2=B1-(0.5*B1);
end
end
for ii=1:26
for jj=1:26
for ii=jj
COEFFICIENTI(ii,jj)=D(ii).*B2+REMOVAL(ii);
end
end
end
FLUSSI(:,2)=COEFFICIENTI\X;
K2=F'.*FLUSSI(:,2);
FLUSSIN(:,2)=FLUSSI(:,2)\K2;
%dalla 3 iterazione in poi si può utilizzare l'interpolazione lineare, servendosi dei
%due precedenti valori di B per calcolare quello successivo:
n=3;
while abs(K2-1)>10^-5 & n<nmax
BUCKLING(n)=BUCKLING(n-1)+(BUCKLING(n-2)-BUCKLING(n-1))*(1-K(n-1))\(K(n-2)-K(n-1));
for ff=1:26
for ll=1:26
for ff=ll
COEFFICIENTI(ff,ll)=D(ff).*BUCKLING(n)+REMOVAL(ff);
end
end
end
FLUSSI(:,n)=COEFFICIENTI\X;
Kn=F'.*FLUSSI(:,n);
FLUSSIN(:,n)=FLUSSI(:,n)\Kn;
errorenuovo=abs(Kn-1);
iterazioni=n;
n=iterazioni+1;
end
BFinale=BUCKLING(n)
RAGGIO=pi/(sqrt(BFinale))

답변 (1개)

Tanmay Das
Tanmay Das 2021년 9월 13일
Hi,
In the while loop part of the code, mldivide(\) operator is used which has the same precedence as that of matrix multiplication(*). So, (BUCKLING(n-2)-BUCKLING(n-1))*(1-K(n-1)) becomes 0. Also the value of (K(n-2)-K(n-1)) is 0. Hence, it is of the form 0 \ 0 which is returning NaN. That is why there is a warning that "Matrix is singular, close to singular or badly scaled. Results may be inaccurate". If you change the line to:
BUCKLING(n)=BUCKLING(n-1)+(BUCKLING(n-2)-BUCKLING(n-1))*((1-K(n-1))\(K(n-2)-K(n-1)));
then this particular warning issue may get resolved. But still you will get BFinale=0 and RAGGIO=inf as the form of (BUCKLING(n-2)-BUCKLING(n-1))*((1-K(n-1))\(K(n-2)-K(n-1))) is still 1 \ 0 which will always return zero and the value of BUCKLING(n) will never increase for any value of n. Hence, it is recommended to check the code as well as the names of variables once again.

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by