开发者社区> 问答> 正文

Scipy -时间几乎与特征值的数量无关?

我使用scipy.linalg。求解一般特征值问题:K @ u = w * M @ u,其中K、M分别为刚度矩阵和质量矩阵。它们在数学上是稀疏的,但我坚持使用scipy。linalg,不要用scipy,稀疏的。linalg的代码,因为它不是有效的与他们目前的大小。应该是这样吗? 令我吃惊的是,当我试图测试函数的速度时,它不仅比预期的要慢,而且经过的时间与特征值的数量无关。

stiffness_matrix
>> array([[ 3.80765476e+03,  0.00000000e+00, -2.17580272e+03, ...,
         0.00000000e+00,  0.00000000e+00,  0.00000000e+00],
       [ 0.00000000e+00,  3.80765476e+03, -2.84217094e-14, ...,
         0.00000000e+00,  0.00000000e+00,  0.00000000e+00],
       [-2.17580272e+03, -2.84217094e-14,  7.61530952e+03, ...,
         0.00000000e+00,  0.00000000e+00,  0.00000000e+00],
       ...,
       [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00, ...,
         3.80765476e+03, -2.03981505e+02,  1.35987670e+02],
       [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00, ...,
        -2.03981505e+02,  1.90382738e+03,  6.11944515e+02],
       [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00, ...,
         1.35987670e+02,  6.11944515e+02,  1.90382738e+03]])

# mass_matrix is similar
stiffness_matrix.shape
>>(2100, 2100)

%timeit linalg.eigh(stiffness_matrix, b=mass_matrix, eigvals=(0,1), eigvals_only=True, check_finite=False)
2.39 s ± 124 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit linalg.eigh(stiffness_matrix, b=mass_matrix, eigvals=(0,1000), eigvals_only=True, check_finite=False)
3.02 s ± 71.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

编辑:即使我交换了两个矩阵,得到了最大的瓦尔斯,它仍然需要相同的时间:

linalg.eigh(mass_matrix,
            b=stiffness_matrix, 
            eigvals=(2098, 2099), 
            eigvals_only=True, 
            check_finite=False)

因为我只需要前两个特征值,这真让我心烦。这个算法是不是很有效,不会升级到O阶(numeigs)?或者“2个特征值的情况”是如此缓慢,就好像它运行着更多的特征值?最重要的是:我能加快速度吗? 问题来源StackOverflow 地址:/questions/59382031/scipy-time-almost-irrelevant-to-the-number-of-eigenvalues

展开
收起
kun坤 2019-12-27 17:20:37 393 0
1 条回答
写回答
取消 提交回答
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载