我目前正在编写一个数字python代码(从头开始),以解决以下思考问题:
假设我有一个二维问题,有一个刚性地面,上面有一个柔性层,通过等距弹簧与地面相连。在柔性层的顶部有一个圆柱体,它(如果你喜欢)粘在柔性层的边缘上。现在,圆柱体从边缘开始水平滚动,以无数增量影响弹簧的开口。你知道吗
现在我的问题涉及到以下几个方面:由于弹簧合力和施加在气缸上的力矩之间的平衡,一定数量的弹簧将在平衡时打开。由于问题的非线性,这个打开的弹簧的数量事先是未知的。 此外,我不希望对整个几何体建模,而是只考虑相关的开口弹簧。在这个过程中,我想,例如,存储合力在每个开放的弹簧对应于一定的力矩增量。你知道吗
因此,在我看来,这里的编程问题是:
array
,每个增量包含一个单独弹簧中所有力的列表。复杂性来自这样一个事实,即该列表没有预定义的长度,也不是每个数字增量的长度相同。注意,在这种情况下,增量的数量是通过例如linspace
预定义的我一直在寻找一个合适的Python解决这个问题,但还没有找到一个。我认为NumPy库应该提供一个方便的解决方案,但是我缺乏Python经验,也没有找到一个好的例子。如果您认为上述设置更方便,我也愿意接受其他方法。你知道吗
目前,我有以下代码示例来展示我的方法:
from numpy import array , zeros , linspace
area = 2.0
Forces = [] # Initialize complete Force array
for inc in range(1,4):
stresses = linspace(0.,10.,inc)
n = len(stresses)
Forcej = zeros( n ) # Initialize Forces in current increment
for i, stress in enumerate(stresses):
Forcej[i] = area*stress
print Forcej
Forces.append(Forcej)
print Forces
输出:
[ 0.]
[ 0. 20.]
[ 0. 10. 20.]
[array([ 0.]), array([ 0., 20.]), array([ 0., 10., 20.])]
我想这是理想的结果,但我认为这远不是最优雅的解决方案,有人能帮助或评论这个例子吗?谢谢你考虑我的问题。你知道吗
老实说,我建议使用完整的数组,因此每个spring使用一列。例如,结合numexpr(https://code.google.com/p/numexpr)模块,在每个时间步提取所有“活动”弹簧非常简单和快速。你知道吗
我之所以认为完整数组是一种可行的方法,是因为它很好地映射到了底层系统如何处理内存访问。因此,除非弹簧的数量是hugh(比如说>;100000),否则我相信拖动大量的零不会降低性能。另一种选择可能是寻找有效的稀疏矩阵。我知道SciPy支持它。我不确定你从你的问题中得到的矩阵“轮廓”是否非常适合稀疏矩阵。你知道吗
更多(num)Python
在python中,您可以编写
更优雅的是,作为一个列表:
(请注意,python中的局部变量按约定在
lowercase
或snake_case
中命名。)但这是NumPy代码,所以让我们用标量向量乘法代替:
用
矩阵数组进行并行向量计算在您的简单示例中,甚至可以使用单个标量矩阵乘法计算所有增量的力:
输出
现在,由于行的大小不同(每行代表一个增量),
stresses
并不是一个真正的矩阵,只是一个数组。因此,向量矩阵乘法和矩阵矩阵乘法(这将需要写现实,更复杂的计算,这简洁)将失败。(标量矩阵乘法不关心矩阵的形状。显然,它甚至不必是actual matrix。)实矩阵
但是如果我理解正确的话,尺寸的变化仅仅是因为弹簧在各自的增量中没有应力。你知道吗
因此,如果您想使用矩阵运算,而不是完全保留零项,请考虑使用sparse matrices。它们避免存储零条目或对它们进行计算,这样只会产生新的零条目,但它们仍然“知道”有零条目和矩阵的完整形状(从而保持矩阵乘法等有意义)。你知道吗
相关问题 更多 >
编程相关推荐