Overwriting within an if/else

Hey!
I've this code but I don't quite understand why at the first iteration j = 2 and when i = 60 the for loop at line overwrites the last input of t(:,1) - I already defined t(:,1) before initializing the if loop.
Any help would be appreciated.
clear clc
r=zeros(60,20); t=zeros(60,20); epsilontheta=zeros(60,20); epsilonn=zeros(60,20); epsilonr=zeros(60,20); den=zeros(60,20); der=zeros(60,20); det=zeros(60,20); epsilons=zeros(60,20); sigmas=zeros(60,20); sigman=(-1)*ones(60,20); sigmar=zeros(60,20); k=zeros(60,20); l=zeros(60,20); A=zeros(60,20); F=zeros(60,20);
for i =1:60 r0=110; %mm t0=1; %mm R=1.15; K=530; %N/mm^2 = MPa n=0.268; my=0.2;
for j=1:20
r(1,j)=r0-0.5*(j-1);
r(i,1)=r0-1*(i-1);
end
%j=1
t(1,1)=t0;
t(i,1)=t(1,1);
epsilonn(i,1)=0;
epsilontheta(i,1)=0;
epsilonr(i,1)=0;
det(i,1)=0;
den(i,1)=0;
der(i,1)=0;
epsilons(i,1)=0;
sigmas(i,1)=0;
k(i,1)=0;
l(i,1)=0;
sigmar(i,1)=0;
sigman(i,1)=0;
F(i,1)=0;
end
j=2; i=1; processtop = 0; dt=0.0001; zonestop = 0; processkift = 0;
while processkift == 0 %næste procestrin while processtop == 0 %kraftligevægtskriterie while zonestop == 0 %antal ringelementer if j ~= 1 t(i,j)=t0+dt; %startantagelse af tykkelse, dt ændrer sig t(:,j)=t(i,j);
if i ~=60
r(i+1,j)=sqrt((2*(r(i,j)^2*((t(i,j)+t(i+1,j))*(1/2))-(r(i,1)^2-r(i+1,1)^2)*t(i,1)))/(t(i,j)+t(i+1,j)));
end
epsilonn(i,j)=log(t(i,j)/t0);
epsilontheta(i,j)=log(r(i,j)/r(i,1));
epsilonr(i,j)=-(epsilonn(i,j)+ epsilontheta(i,j));
den(i,j)=epsilonn(i,j)-epsilonn(i,j-1);
det(i,j)=epsilontheta(i,j)-epsilontheta(i,j-1);
der(i,j)=-(den(i,j)+det(i,j));
epsilons(i,j) = sqrt(R+1)*sqrt(R*(der(i,j)-det(i,j))^2+(der(i,j)-R*den(i,j))^2+(det(i,j)-R*den(i,j))^2)/(2*R+1);
sigmas(i,j)=K*(epsilons(i,j))^n;
k(i,j)=(sigmas(i,j)/epsilons(i,j))*((1+R)/(1+2*R))*(2*det(i,j)+den(i,j));
%k(i,j) = sigmatheta(i,j) - sigmar(i,j)
l(i,j)=(sigmas(i,j)/epsilons(i,j))*((1+R)/(1+2*R))*(den(i,j)*(1+R)+det(i,j));
%l(i,j) = sigman(i,j) - sigmar(i,j)
sigmar(1,j)=0;
if i ~=60
if i ~=1
sigmar(i+1,j) = (sigmar(i, j)+(1/2*(k(i+1, j)/r(i+1, j)+k(i, j)/r(i, j))+my*(l(i+1, j)+sigman(i, j))/t(i, j))*(r(i+1, j)-r(i, j)))/(1-my*(r(i+1, j)-r(i, j))/t(i, j));
end
end
end
if j==1 %et loop inden i et loop - kunne nok gøres smartere
sigman(i,1)=0;
else
if i == 1
sigman(1,j)=l(1,j); %ved i=1 er sigmar = 0
else
sigman(i,j)=l(i,j)+sigmar(i,j);
end
end
if j ~=1
if sigman(i,j)>=0
zonestop = 1
else
i = i+1
zonestop = 0;
end
end
end
if zonestop >= 1
Fanvendt = 3,9*10^4 %N
for i=1:i-1 %alle ringelementer frem til radius r(i,j)
A(i,j)=((r(i,j))^2-(r(i+1,j))^2)*pi;
F(i,j)=sqrt((sigman(i,j))^2)*A(i,j); %i stedet for numerisk tegn
end
if sum(F(:,j))-Fanvendt > 0.01*Fanvendt
dt = dt + 0.01;
zonestop = 0; %geninitialiserer zonestop
processtop = 0;
i = 1; %starter forfra ved i = 1
else
processtop = 1;
end
end
end
if processtop >=1
j=j+1;
%restarter alt undt. j
zonestop = 0;
processtop = 0;
i = 1;
dt = 0;
end
if j>20
processkift = 1 %terminerer alt
end
end

2 Kommentare

Walter Roberson
Walter Roberson am 5 Dez. 2011
http://www.mathworks.com/matlabcentral/answers/13205-tutorial-how-to-format-your-question-with-markup
Jan
Jan am 5 Dez. 2011
The command "clear clc" removes the function of variable called "clc" from the memory. Are you sure you want to do this?!

Melden Sie sich an, um zu kommentieren.

Antworten (2)

Jan
Jan am 5 Dez. 2011

0 Stimmen

I suggest to use the debugger to step through your code line by line.
This will most likely not produce the expected result:
Fanvendt = 3,9*10^4 %N
Now Fanvendt is 3 and "9e4" appears in the command window. You need a dot instead of the comma. Calculating 10^4 and the multiplication is much more expensive than using "3.9e4" directly.
Sahdowing the function "det" by a variable with the same name might have unexpected effects.

2 Kommentare

Linda
Linda am 5 Dez. 2011
Arhh of course! But I don't understand what's wrong with the det-function?
Jan
Jan am 5 Dez. 2011
"det" is a builtin function. You *can* shadow it by redefining it as a local variable. But this leads to problems frequently, as you can check in this forum. Example:
max = 1:5;
... Some other code, until you forget, that "max" was used before...
disp(max(rand(1, 100))); % ERROR!

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Software Development finden Sie in Hilfe-Center und File Exchange

Gefragt:

am 3 Dez. 2011

Community Treasure Hunt

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

Start Hunting!

Translated by