我使用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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。