clc
Efe = 211e9; % Youngs modulus for iron [GPa]
Eal = 69e9; % Youngs modulus for Aluminium [GPa]
Esteel = 200e9; % Youngs modulus for steel [GPa]
D = 53 % Outer diameter [mm]
dFe = 36 % Inner diameter [mm]
dguess = 36
disp('Second moment of area for Iron cylinder: ')
IFe = pi*(D.^4-dFe.^4)/64
I = pi*(D.^4-dguess.^4)/64
disp('Stiffness for Iron: ')
Stiffness_Fe = Efe/IFe
disp('Stiffness for Aluminium: ')
Stiffness_Al = Eal/I
d=D;
while Stiffness_Fe>Stiffness_Al
d=d-1
I = pi*(D.^4-d.^4)/64;
Stiffness_Al=Stiffness_Fe
if d<0;
disp('Gone negative, step out')
break;
end
end
d
我希望for循环版本能够正常工作,但似乎我无法正确使用此循环中的Stiffness_Al变量....我可以在电子表格上完成此操作并过滤匹配'k'的值,但它是通常使用matlab更有趣(除非我在讨论这个基本的东西时!)
答案 0 :(得分:3)
你的循环逻辑很不稳定;
while Stiffness_Fe>Stiffness_Al
d=d-1
I = pi*(D.^4-d.^4)/64;
Stiffness_Al=Stiffness_Fe
if d<0;
disp('Gone negative, step out')
break;
end
end
循环将按照书面形式继续,直到Stiffness_Fe
超过Stiffness_Al
。当您的代码第一次遇到循环时,此语句为true。您将三个语句设为Stiffness_Al
等于Stiffness_Fe
。你的循环中的任何其他地方都没有修改这些值,所以在第一次迭代结束时,当再次计算表达式Stiffness_Fe>Stiffness_Al
时,它将为false,并且控制将传递给循环之后的语句。
以这样的方式编写while
循环确实非常奇怪:(a)它总是运行一次而(b)它从不运行两次。就循环而言,它并不是一个循环。
inside_diameters = 12:52
。stiffnesses = Eal/(pi*(D.^4-inside_diameters.^4)/64)
stiffnesses
中超过铁管刚度的最小值。如果您想覆盖更广泛的管厚度,可以尝试12:0.1:52。除非你想要或需要更精确的数字,否则Matlab会在你点击返回键的时候产生你想要的数字。
是的,当您找到所需的值时,逐步增加厚度并从循环中断开可能会更优雅,但我建议您担心如何使代码正常工作,如果你有时间和倾向,把它弄清楚。