0

早上好!所以我再次陷入困境......我正在尝试确定使用不同材料的圆柱体的最佳壁厚。我有一个电流管(铁),我知道这个的刚度('k')。我正在尝试使用 matlab 迭代不同的“d”(内部直径)值,并在刚度值 k 与铁管的 ki 相同(或相似)时停止(如果它确实收敛) !)我试过while和for循环,但有些不对劲!任何建议表示赞赏,干杯

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 (除非我遇到这样的基本问题!)

4

1 回答 1

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。当您的代码第一次遇到循环时,此语句是正确的。你设置的三个语句Stiffness_Al等于Stiffness_Fe。循环中的其他任何地方都没有修改这些值,因此在第一次迭代结束时,当Stiffness_Fe>Stiffness_Al再次评估表达式时,它将为假,并且控制将传递给循环之后的语句。

while以这样一种方式编写循环确实很奇怪:(a)它总是运行一次,(b)它从不运行两次。就循环而言,它不是一个循环。

我推测您要做的是计算一系列内径不同的铝管的刚度,并找到与您的铁管具有相同刚度的内径最小的铝管。我想我会:

  1. 创建一个内径矢量,从某个最小值到比外径小 1mm,例如inside_diameters = 12:52
  2. 为该向量的每个元素计算管的刚度,例如stiffnesses = Eal/(pi*(D.^4-inside_diameters.^4)/64)
  3. stiffnesses找出超过铁管刚度的最小值。

如果您想覆盖更广泛的管厚度,您可以尝试 12:0.1:52。除非您想要或需要更精确的数字,否则 Matlab 将在您按下回车键的时间内生成您想要的数字。

是的,当你找到你正在寻找的值时,逐步增加厚度并从循环中中断可能会更优雅,但我建议你担心让你的代码工作,如果你有时间和倾向,把它擦亮。

于 2013-02-18T14:23:07.543 回答