注解

此笔记本可在此处下载: Optimization_practical_work.ipynb

实际工作:优化桥梁结构

本教程旨在使用 truss 包裹。 * In order to use it, download the file ``truss.py`` and put it into your current work directory.

%load_ext autoreload
%autoreload 2
The autoreload extension is already loaded. To reload it, use:
  %reload_ext autoreload
import numpy as np
import matplotlib.pyplot as plt
import copy, os
from scipy import optimize
import truss
%matplotlib nbagg

建造桥梁结构

在本课程中,我们将使用桁架对桥梁结构进行建模,并使用各种标准对其进行优化。基本结构介绍如下。它是由钢筋制成的,并承受一个垂直力 \(G\) .这座桥是对称的,所以只有左半边是模型。

E       = 210.e9   # Young Modulus [Pa]
rho     = 7800.    # Density       [kg/m**3]
A       = 5.e-2    # Cross section [m**2]
sigmay  = 400.e6   # Yield Stress  [Pa]

# Model definition
model = truss.Model() # Model definition

# NODES
nA = model.add_node((0.,0.), label = "A")
nC = model.add_node((3.,0.), label = "C")
nD = model.add_node((3.,3.), label = "D")
nE = model.add_node((6.,0.), label = "E")
nF = model.add_node((6.,3.), label = "F")
nG = model.add_node((9.,0.), label = "G")
nH = model.add_node((9.,3.), label = "H")

# BOUNDARY CONDITIONS
nA.block[1] = True
nG.block[0] = True
nH.block[0] = True

# BARS
AC = model.add_bar(nA, nC, modulus = E, density = rho, section = A, yield_stress = sigmay)
CD = model.add_bar(nC, nD, modulus = E, density = rho, section = A, yield_stress = sigmay)
AD = model.add_bar(nA, nD, modulus = E, density = rho, section = A, yield_stress = sigmay)
CE = model.add_bar(nC, nE, modulus = E, density = rho, section = A, yield_stress = sigmay)
DF = model.add_bar(nD, nF, modulus = E, density = rho, section = A, yield_stress = sigmay)
DE = model.add_bar(nD, nE, modulus = E, density = rho, section = A, yield_stress = sigmay)
EF = model.add_bar(nE, nF, modulus = E, density = rho, section = A, yield_stress = sigmay)
EG = model.add_bar(nE, nG, modulus = E, density = rho, section = A, yield_stress = sigmay)
FH = model.add_bar(nF, nH, modulus = E, density = rho, section = A, yield_stress = sigmay)
FG = model.add_bar(nF, nG, modulus = E, density = rho, section = A, yield_stress = sigmay)
GH = model.add_bar(nG, nH, modulus = E, density = rho, section = A, yield_stress = sigmay)

# STRUCTURAL LOADING
nG.force = np.array([0., -1.e6])


%timeit model.solve()
model
3.17 ms ± 395 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
<Model: 7 nodes, 11 bars>
xlim, ylim = model.bbox(deformed = False)
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.set_aspect("equal")
#ax.axis("off")
model.draw(ax, deformed = False, field = "stress", label = True, force_scale = 1.e-6, forces = True)
plt.xlim(xlim)
plt.ylim(ylim)
plt.grid()
plt.xlabel("Axe $x$")
plt.ylabel("Axe $y$")
<IPython.core.display.Javascript object>
<matplotlib.text.Text at 0x7f79009258d0>

节点的详细结果

model.data(at = "nodes")
block coords disp force label
bx by x y ux uy Fx Fy o
0 False True 0 0 -0.00114286 0 0 1e+06 A
1 False False 3 0 -0.000857143 -0.00337955 0 0 C
2 False False 3 3 0.00142857 -0.00337955 0 0 D
3 False False 6 0 -0.000571429 -0.00618767 0 0 E
4 False False 6 3 0.000857143 -0.00647339 0 0 F
5 True False 9 0 0 -0.00813865 3e+06 -1e+06 G
6 True False 9 3 0 -0.00813865 -3e+06 0 H

钢筋的详细结果

model.data(at = "bars")
conn direction geometry props state
c1 c2 dx dy length volume density mass section elongation failure strain stress tension
0 A C 1 0 3 0.15 7800 1170 0.05 0.000285714 False 9.52381e-05 2e+07 1e+06
1 C D 0 1 3 0.15 7800 1170 0.05 0 False 0 0 0
2 A D 0.707107 0.707107 4.24264 0.212132 7800 1654.63 0.05 -0.000571429 False -0.000134687 -2.82843e+07 -1.41421e+06
3 C E 1 0 3 0.15 7800 1170 0.05 0.000285714 False 9.52381e-05 2e+07 1e+06
4 D F 1 0 3 0.15 7800 1170 0.05 -0.000571429 False -0.000190476 -4e+07 -2e+06
5 D E 0.707107 -0.707107 4.24264 0.212132 7800 1654.63 0.05 0.000571429 False 0.000134687 2.82843e+07 1.41421e+06
6 E F 0 1 3 0.15 7800 1170 0.05 -0.000285714 False -9.52381e-05 -2e+07 -1e+06
7 E G 1 0 3 0.15 7800 1170 0.05 0.000571429 False 0.000190476 4e+07 2e+06
8 F H 1 0 3 0.15 7800 1170 0.05 -0.000857143 False -0.000285714 -6e+07 -3e+06
9 F G 0.707107 -0.707107 4.24264 0.212132 7800 1654.63 0.05 0.000571429 False 0.000134687 2.82843e+07 1.41421e+06
10 G H 0 1 3 0.15 7800 1170 0.05 0 False 0 0 0

死亡( 也就是说。 结构)质量

m0 = model.mass()
m0 * 1.e-3 # Mass in tons !
14.323889603929565

问题

问题1 :验证是否没有超过屈服应力,您认为此结构的重量是否为最佳?您可以使用 state/failure 整个模型的可用数据。

# Example:
model.data(at = "bars").state.failure.values

#...
array([False, False, False, False, False, False, False, False, False,
       False, False], dtype=object)

问题2 :同时修改所有横截面,以使重量最小化,同时保持可接受的应力水平。

问题3 :我们想沿着 \(\vec y\) 点的轴 \(D\)\(F\)\(H\) 为了使节点的垂直位移最小化 \(G\) 乘以结构的质量 \(\alpha\)

\[\α=u_y(g)m\]

哪里 \(u_y(G)\) 是节点的位移。 \(G\) 沿着 \(\vec y\) 轴和 \(m\) 整个结构的质量。

不要进一步修改问题4中确定的部分。评论解决方案。

问题4 :同样的问题,也有位移 \(\vec x\) 属于 \(C\)\(D\)\(E\)\(F\) .更好吗?

问题5 :您现在可以尝试通过删除/合并精心选择的梁和节点来执行拓扑优化。为了使结构更加高效。

问题6 :现在要求您优化横截面以及 \(C\)\(D\)\(E\)\(F\) 以达到每个梁的屈服应力。