Overwriting within an if/else
Afficher commentaires plus anciens
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 commentaires
Walter Roberson
le 5 Déc 2011
http://www.mathworks.com/matlabcentral/answers/13205-tutorial-how-to-format-your-question-with-markup
Jan
le 5 Déc 2011
The command "clear clc" removes the function of variable called "clc" from the memory. Are you sure you want to do this?!
Réponses (2)
Walter Roberson
le 3 Déc 2011
0 votes
Jan
le 5 Déc 2011
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 commentaires
Linda
le 5 Déc 2011
Jan
le 5 Déc 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!
Catégories
En savoir plus sur Software Development dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!