我正在教mysef一点关于numpy
,我已经把我的一些旧的本科文本作为例子。所以,我写了一个函数,没有 numpy
来计算由于任何点的单点负载引起的悬臂梁偏转。非常简单,除了偏转方程根据您所在的点力的哪一侧而变化,因此我将光束分成两个范围,计算范围中每个间隔的偏转值并将结果附加到列表中。这是代码。
def deflection(l, P, a, E, I):
"""
Calculate the deflection of a cantilever beam due to a simple point load.
Calculates the deflection at equal one inch intervals along the beam and
returns the deflection as a list along with the the length range.
Parameters
----------
l : float
beam length (in)
P : float
Point Force (lbs)
a : float
distance from fixed end to force (in)
E : float
modulus of elasticity (psi)
I : float
moment of inertia (in**4)
Returns
-------
list
x : distance along beam (in)
list of floats
y : deflection of beam (in)
Raises
------
ValueError
If a < 0 or a > l (denoting force location is off the beam)
"""
if (a < 0) or (a > l):
raise ValueError('force location is off beam')
x1 = range(0, a)
x2 = range(a, l + 1)
deflects = []
for x in x1:
y = (3 * a - x) * (P * x**2) / (6 * E * I)
deflects.append(y)
for x in x2:
y = (3 * x - a) * (P * a**2) / (6 * E * I)
deflects.append(y)
return list(x1) + list(x2), deflects
现在我想使用numpy做同样的事情,所以我编写了以下函数:
def np_deflection(l, P, a, E, I):
"""To Do. Write me."""
if (a < 0) or (a > l):
raise ValueError('force location is off beam')
x1 = np.arange(0, a)
x2 = np.arange(a, l + 1)
y1 = (3 * a - x1) * (P * x1**2) / (6 * E * I)
y2 = (3 * x2 - a) * (P * a**2) / (6 * E * I)
return np.hstack([x1, x2]), np.hstack([y1, y2])
问题在于,在计算的某个时刻,y1的值会改变符号。这是一个例子。
if __name__ == '__main__':
import matplotlib.pyplot as plt
l, P, a, E, I = 120, 1200, 100, 30000000, 926
x, y = deflection(l, P, a, E, I)
print(max(y))
np_x, np_y = np_deflection(l, P, a, E, I)
print(max(np_y))
plt.subplot(2, 1, 1)
plt.plot(x, y, 'b.-')
plt.xlabel('dist from fixed end (in)')
plt.ylabel('using a range/list')
plt.subplot(2, 1, 2)
plt.plot(np_x, np_y, 'r.-')
plt.xlabel('dist from fixed end (in)')
plt.ylabel('using numpy range')
plt.show()
如果您运行绘图,您会在x = 93
处x1
处看到,曲线中存在一个错位,其中值似乎会改变符号。
任何人都可以解释a)发生了什么?和b)我做错了什么?
答案 0 :(得分:1)
尝试使用numpy.arange(...,dtype = numpy.double)或使用astype(np.double)转换结果
两者之间可能存在一些微妙的变化 - 类似于浮动的for循环,在警告/ habbit方面犯了错误我会说astype是一个更好的习惯。
答案 1 :(得分:1)
我认为这与溢出无关,因为有些人建议并且与dtype
的默认np.arange
有关。如果传入一个整数start,stop,然后步进arange
,那么输出将是一个整数数组。
在python 2.x中,/
运算符使用整数除法。
例如:
import numpy as np
print np.arange(10) / 3
结果:
[0 0 0 1 1 1 2 2 2 3]
然而,
np.arange(10, dtype=float) / 3
或
np.arange(10.0) / 3
或
np.arange(10) / 3.0
所有结果都会导致
[ 0. 0.33333333 0.66666667 1. 1.33333333 1.66666667
2. 2.33333333 2.66666667 3. ]
如果您希望/
运算符始终将结果向上转换为浮点数,则可以使用from __future__ import division
。
另一种选择是了解数组的数据类型。 Numpy允许您对数据在内存中的存储方式进行非常低级别的控制。这非常,非常在实践中很有用,但一开始看起来有点令人惊讶。但是,上行规则非常简单,值得注意。基本上,只要在操作中使用两种类型,如果它们相同,则保留类型。否则,使用两者中更一般的。