gpt4 book ai didi

python - numpy arange 值意外改变符号

转载 作者:行者123 更新时间:2023-11-28 17:36:22 25 4
gpt4 key购买 nike

我正在教自己一些关于 numpy 的知识,我已经整理了一些旧的本科教材以用作示例。因此,我编写了一个 without 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()

如果运行该图,您会看到在 x1 中的点 x = 93 处,曲线中出现错位,该值似乎更改符号。
plot of results谁能解释 a) 发生了什么? b) 我做错了什么?

最佳答案

我打赌这与某些人建议的溢出无关,而与 np.arange 的默认 dtype 无关。如果您将整数开始、停止和步进传递给 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. ]

如果您希望 / 运算符始终将结果向上转换为 float ,那么您可以使用 from __future__ import division

另一种选择是了解数组的数据类型。 Numpy 允许您对数据在内存中的存储方式进行非常低级别的控制。这在实践中非常非常有用,但乍一看似乎有点令人惊讶。但是,向上转型规则非常简单,值得了解。基本上,无论何时在操作中使用两种类型,如果它们相同,则保留该类型。否则,使用两者中更通用的那个。

关于python - numpy arange 值意外改变符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30114259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com