我目前正在编写一个数值python代码(从头开始),以解决以下思想问题:
想象一下,我有一个二维问题,一个刚性的地面,上面有一个柔性的层,通过等距的弹簧连接到地面上。在柔性层的顶部有一个圆柱体,它(如果你愿意的话)粘在柔性层的边缘。现在,圆柱体以无数的增量水平滚动,从边缘开始影响弹簧的开口。
现在我的问题涉及到以下几个方面:由于弹簧力和施加在圆柱上的力矩之间的平衡,一定数量的弹簧将在平衡时打开。由于问题的非线性,这几个开弹簧的数目是事先不知道的。此外,我不想对整个几何学建模,而是只考虑相关的开启弹簧。在这个过程中,我想,例如,将合力存储在每个打开的弹簧中,对应于某个时刻的增量。
因此,在我看来,这里的编程问题是:
array,它为每个增量包含单个弹簧中所有力的列表。复杂性来自这样一个事实:这个列表没有预先定义的长度,对于每个数值增量来说,这个长度也不是相同的。请注意,在本例中,增量的数目是通过例如一个linspace预定义的。我一直在寻找一个适合这个问题的Pythonic解决方案,但还没有找到一个。我认为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.])]我想这是我想要的结果,但我认为这远远不是最优雅的解决方案,有人能对这个例子提供帮助或评论吗?谢谢你考虑我的问题。
发布于 2015-03-23 11:14:04
老实说,我建议使用一个完整的数组,所以每个春季都使用一个列。结合例如numexpr (https://code.google.com/p/numexpr)模块,在每个时间步骤中提取所有“活动”弹簧是非常容易和快速的。
我相信一个完整的数组是可行的,因为它很好地映射到底层系统处理内存访问的方式。所以,除非弹簧的数量是hugh (比方说>100000),否则我相信拖动大量的零不会降低性能。另一种选择可能是寻找有效的稀疏矩阵。我知道SciPy支持它。我不确定你从你的问题中得到的矩阵“概要”是否很适合稀疏矩阵。
https://stackoverflow.com/questions/29207920
复制相似问题