注解
此笔记本可在此处下载: 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\) 以达到每个梁的屈服应力。