You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何拆分Numpy刚度矩阵以实现静力凝聚?

如何拆分Numpy刚度矩阵以实现静力凝聚?

嘿,这事儿用Numpy的索引切片就能轻松搞定,完全不用手动敲子矩阵的元素,既高效又不会出错!我来给你一步步演示:

首先,你的原始刚度矩阵是5x5的,根据你给出的拆分需求,其实就是把矩阵按「前3行/列(保留自由度rr)」和「后2行/列(凝聚自由度cc)」来划分。直接用Numpy的切片语法就能快速提取出各个子矩阵:

完整实现代码

from sympy import *
import numpy as np

# 你原来的定义代码
u1 = Symbol("u1")
u2 = Symbol("u2")
q3 = Symbol("q3")
u4 = Symbol("u4")
q5 = Symbol("q5")

disp_vector = np.array([u1, u2, q3, u4, q5])

stiffness_matrix = np.array([[1, 0, 0, -1, 0],
                             [0, 0.12, 0.6, 0, 0.6],
                             [0, 0.6, 4, 0, 2],
                             [-1, 0, 0, 1, 0],
                             [0, 0.6, 2, 0, 4]])

force_vector = np.array([0, 40, -26.7, 0, 0])

# 核心:用切片拆分刚度矩阵
krr = stiffness_matrix[:3, :3]  # 前3行,前3列
krc = stiffness_matrix[:3, 3:]  # 前3行,后2列
kcr = stiffness_matrix[3:, :3]  # 后2行,前3列
kcc = stiffness_matrix[3:, 3:]  # 后2行,后2列

# 可以打印出来验证,和你手动定义的完全一致!
print("krr:\n", krr)
print("\nkrc:\n", krc)
print("\nkcr:\n", kcr)
print("\nkcc:\n", kcc)

灵活扩展:如果自由度不是连续的怎么办?

要是你的保留自由度和凝聚自由度不是像这样前后连续的(比如分散的索引,比如r=[0,2,4],c=[1,3]),可以用np.ix_()来生成索引网格,这样能正确提取子矩阵:

# 举个例子,假设保留自由度是索引0、2、4,凝聚是1、3
r = [0, 2, 4]
c = [1, 3]
krr = stiffness_matrix[np.ix_(r, r)]
krc = stiffness_matrix[np.ix_(r, c)]
kcr = stiffness_matrix[np.ix_(c, r)]
kcc = stiffness_matrix[np.ix_(c, c)]

这样不管自由度怎么分布,都能准确拆分出需要的子矩阵,完美适配静力凝聚的需求~

备注:内容来源于stack exchange,提问作者Hür Doğan ÜNLÜ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 11:35:29