在分析物理结构时,了解保持其稳定的力学至关重要。施加在地板、梁或任何其他结构上的力会产生反作用力和力矩。这些反应是抵抗运动而不破裂的结构。如果结构在施加力的情况下仍不移动,牛顿第二定律规定系统中所有方向的加速度和力之和必须为零。您可以使用 NumPy 数组来表示和解决这个概念。
你会做什么:
- 在本教程中,您将使用 NumPy 使用 NumPy 数组创建向量和矩
- 解决涉及支撑结构的电缆和地板的问题
- 编写 NumPy 矩阵来隔离未知数
- 使用 NumPy 函数执行线性代数运算
你将学到什么:
- 如何使用 NumPy 表示点、向量和矩。
- 如何求向量的法线
- 使用 NumPy 进行矩阵计算
你需要什么:
- Numpy
- Matplotlib
使用以下命令导入:
import numpy as np import matplotlib.pyplot as plt
在本教程中,您将使用以下 NumPy 工具:
np.linalg.norm:该函数确定矢量幅度的度量np.cross:该函数采用两个矩阵并生成叉积
用牛顿第二定律求解平衡
您的模型由承受力和力矩总和的梁组成。您可以开始用牛顿第二定律来分析这个系统:
为了简化所看的示例,假设它们是静态的,并且有加速度。由于我们的系统存在于三个维度,请考虑在每个维度上施加的力。这意味着您可以将这些力表示为向量。对于矩,您得出相同的结论,这是由于在距物体质心一定距离处施加的力而产生的。
假设力表示为三维向量
其中三个分量中的每一个都代表在每个相应方向上施加的力的大小。还假设向量中的每个分量
是力的每个分量的施加点与系统质心之间的距离。然后,力矩可以通过下式计算
从力矢量的一些简单示例开始
forceA = np.array([1, 0, 0])
forceB = np.array([0, 1, 0])
print("Force A =", forceA)
print("Force B =", forceB)
Force A = [1 0 0] Force B = [0 1 0]
这定义forceA为一个大小为 1 的向量方向和forceB大小为 1方向。
将这些力量可视化可能有助于更好地理解它们如何相互作用。 Matplotlib 是一个带有可视化工具的库,可用于此目的。 Quiver 图将用于演示三维矢量,但该库也可用于二维演示。
fig = plt.figure() d3 = fig.add_subplot(projection="3d") d3.set_xlim(-1, 1) d3.set_ylim(-1, 1) d3.set_zlim(-1, 1) x, y, z = np.array([0, 0, 0]) # defining the point of application. Make it the origin u, v, w = forceA # breaking the force vector into individual components d3.quiver(x, y, z, u, v, w, color="r", label="forceA") u, v, w = forceB d3.quiver(x, y, z, u, v, w, color="b", label="forceB") plt.legend() plt.show()

有两种力量从一个点发出。为了简化这个问题,您可以将它们相加来求出力的总和。请注意, 和forceA都是forceB三维向量,由 NumPy 表示为具有三个分量的数组。由于 NumPy 旨在简化和优化向量之间的运算,因此您可以轻松计算这两个向量的总和,如下所示:
forceC = forceA + forceB
print("Force C =", forceC)
Force C = [1 1 0]
力 C 现在充当代表 A 和 B 的单一力。您可以将其绘制出来以查看结果。
fig = plt.figure() d3 = fig.add_subplot(projection="3d") d3.set_xlim(-1, 1) d3.set_ylim(-1, 1) d3.set_zlim(-1, 1) x, y, z = np.array([0, 0, 0]) u, v, w = forceA d3.quiver(x, y, z, u, v, w, color="r", label="forceA") u, v, w = forceB d3.quiver(x, y, z, u, v, w, color="b", label="forceB") u, v, w = forceC d3.quiver(x, y, z, u, v, w, color="g", label="forceC") plt.legend() plt.show()

然而,目标是平衡。这意味着您希望力的总和为否则你的物体将会经历加速。因此,需要有另一种力量来抵消先前的力量。
你可以把这个问题写成, 和是解决问题的反作用力。
在此示例中,这意味着:
碎成,, 和组件这为您提供:
解决,, 和给你一个向量的。
如果绘制出来,前面示例中看到的力应该被抵消。只有当没有力剩余时,系统才被认为处于平衡状态。
R = np.array([-1, -1, 0]) fig = plt.figure() d3.set_xlim(-1, 1) d3.set_ylim(-1, 1) d3.set_zlim(-1, 1) d3 = fig.add_subplot(projection="3d") x, y, z = np.array([0, 0, 0]) u, v, w = forceA + forceB + R # add them all together for sum of forces d3.quiver(x, y, z, u, v, w) plt.show()

空图表示不存在外围力量。这表示系统处于平衡状态。
将平衡解为矩之和
接下来让我们转向更复杂的应用程序。当力并非全部施加在同一点时,就会产生力矩。
与力类似,这些力矩的总和必须为零,否则将会经历旋转加速度。与力之和类似,这为空间中三个坐标方向中的每一个创建了一个线性方程。
一个简单的例子是施加到固定在地面上的固定杆上的力。杆子不动,因此必须施加反作用力。杆子也不旋转,因此它也一定会产生反作用力矩。求解反作用力和力矩。
假设在杆子底部上方 2m 处垂直施加 5N 的力。
f = 5 # Force in newtons
L = 2 # Length of the pole
R = 0 - f
M = 0 - f * L
print("Reaction force =", R)
print("Reaction moment =", M)
Reaction force = -5 Reaction moment = -10
寻找具有物理属性的值
假设力不是垂直作用于横梁,而是通过一根也连接到地面的电线施加到我们的杆子上。考虑到这根绳子的张力,解决这个问题所需要做的就是这些对象的物理位置。

为了响应作用在杆上的力,底座产生 x 和 y 方向的反作用力以及反作用力矩。
将杆的底部表示为原点。现在,假设绳索在 x 方向上连接到地面 3m,并在 z 方向上连接到杆上 2m。
将空间中的这些点定义为 NumPy 数组,然后使用这些数组查找方向向量。
poleBase = np.array([0, 0, 0])
cordBase = np.array([3, 0, 0])
cordConnection = np.array([0, 0, 2])
poleDirection = cordConnection - poleBase
print("Pole direction =", poleDirection)
cordDirection = cordBase - cordConnection
print("Cord direction =", cordDirection)
Pole direction = [0 0 2] Cord direction = [ 3 0 -2]
为了使用与力相关的这些向量,您需要将它们转换为单位向量。单位向量的大小为 1,仅表示力的方向。
cordUnit = cordDirection / np.linalg.norm(cordDirection)
print("Cord unit vector =", cordUnit)
Cord unit vector = [ 0.83205029 0. -0.5547002 ]
然后,您可以将该方向与力的大小相乘,以找到力矢量。
假设绳索的张力为 5N:
cordTension = 5
forceCord = cordUnit * cordTension
print("Force from the cord =", forceCord)
Force from the cord = [ 4.16025147 0. -2.77350098]
为了找到力矩,您需要力矢量和半径的叉积。
momentCord = np.cross(forceCord, poleDirection)
print("Moment from the cord =", momentCord)
Moment from the cord = [ 0. -8.32050294 0. ]
现在您需要做的就是找到反作用力和力矩。
equilibrium = np.array([0, 0, 0])
R = equilibrium - forceCord
M = equilibrium - momentCord
print("Reaction force =", R)
print("Reaction moment =", M)
Reaction force = [-4.16025147 0. 2.77350098] Reaction moment = [0. 8.32050294 0. ]
另一个例子
让我们看一个稍微复杂一点的模型。在此示例中,您将观察带有两根电缆和施加力的梁。这次您需要找到绳索的张力和梁的反作用力。(来源:工程师矢量力学:静力学,问题 4.106)

定义距离a为3米
和以前一样,首先将每个相关点的位置定义为数组。
A = np.array([0, 0, 0]) B = np.array([0, 3, 0]) C = np.array([0, 6, 0]) D = np.array([1.5, 0, -3]) E = np.array([1.5, 0, 3]) F = np.array([-3, 0, 2])
根据这些方程,您首先用单位向量确定向量方向。
AB = B - C AC = C - A BD = D - B BE = E - B CF = F - C UnitBD = BD / np.linalg.norm(BD) UnitBE = BE / np.linalg.norm(BE) UnitCF = CF / np.linalg.norm(CF) RadBD = np.cross(AB, UnitBD) RadBE = np.cross(AB, UnitBE) RadCF = np.cross(AC, UnitCF)
这使您可以将作用在系统上的拉力 (T) 和反作用力 (R) 表示为
和那些时刻
在哪里是相应绳索的张力,是各个方向上的反作用力。那么你只有六个方程:
您现在有五个未知数和五个方程,可以求解:
包起来
您已经学习了如何使用数组来表示三维空间中的点、力和力矩。数组中的每个条目可用于表示分解为方向分量的物理属性。然后可以使用 NumPy 函数轻松操作这些。
附加应用程序
同样的过程可以应用于动力学问题或任意数量的维度。本教程中完成的示例假设静态平衡中的三维问题。这些方法可以很容易地用于解决更多不同的问题。或多或少的维度需要更大或更小的数组来表示。在经历加速度的系统中,速度和加速度也可以类似地表示为矢量。
