线性公式转矩阵形式及位置匹配方法咨询(含代码结果格式化)
问题解答
1. 将der_1格式化为刚度矩阵形式
原代码中对势能求$u_1$的偏导得到
$$
\begin{bmatrix}
k_1 & 0 & -k_1 & 0
\end{bmatrix}
\begin{bmatrix}
u_1 \ u_2 \ u_3 \ u_4
\end{bmatrix}
der_1 = k₁(u₁ - u₃) - f₁,整理后可表示为刚度矩阵与位移向量的乘积等于力向量的形式:$$
\begin{bmatrix}
k_1 & 0 & -k_1 & 0
\end{bmatrix}
\begin{bmatrix}
u_1 \ u_2 \ u_3 \ u_4
\end{bmatrix}
\begin{bmatrix}
f_1
\end{bmatrix}
$$
如果要通过SymPy直接输出矩阵形式,可以修改代码,将偏导结果整理为系数矩阵:
from sympy import symbols, diff, Matrix # 定义符号 u_1, u_2, u_3, u_4 = symbols('u_1 u_2 u_3 u_4') f_1, f_2, f_3, f_4 = symbols('f_1 f_2 f_3 f_4') k_1, k_2, k_3, k_4 = symbols('k_1 k_2 k_3 k_4') # 定义势能 U_internal = 0.5*k_1*(u_1 - u_3)**2 + 0.5*k_2*(u_3 - u_4)**2 + 0.5*k_3*(u_4 - u_2)**2 O_potential = (-f_1*u_1 - f_2*u_2 - f_3*u_3 - f_4*u_4) potential_energy = U_internal + O_potential # 求偏导并整理为矩阵行 der_1 = diff(potential_energy, u_1) # 将偏导移项为 系数*u1 + 系数*u2 + ... = f1 的形式 left_side = der_1 + f_1 # 提取各位移变量的系数 coeffs = [left_side.coeff(var) for var in [u_1, u_2, u_3, u_4]] stiffness_row = Matrix([coeffs]) displacement_vec = Matrix([u_1, u_2, u_3, u_4]) force_vec = Matrix([f_1]) print("刚度矩阵行:") print(stiffness_row) print("\n位移向量:") print(displacement_vec) print("\n力向量:") print(force_vec) print("\n矩阵形式:") print(stiffness_row * displacement_vec, "=", force_vec)
运行后会输出规范的矩阵形式,对应刚度矩阵的第一行。
2. 普通线性公式转位置正确的矩阵形式
通用步骤如下:
- 步骤1:整理线性公式
将公式所有变量项移到左侧,常数/载荷项移到右侧,确保形式为:$a_1x_1 + a_2x_2 + ... + a_nx_n = b$ - 步骤2:确定变量顺序
明确所有目标变量的固定顺序(比如按$u_1$到$u_4$的顺序),这个顺序决定了矩阵列的对应关系 - 步骤3:提取系数
对每个变量,提取其在左侧表达式中的系数(如果变量未出现,系数为0) - 步骤4:构建矩阵
将提取的系数按变量顺序组成一行,对应刚度矩阵的一行;右侧的$b$对应力向量的一个元素。如果有多个线性公式,将每行堆叠起来形成完整的刚度矩阵,右侧堆叠形成完整的力向量。
举个例子,若有公式 $2u_1 - 3u_3 = f_2$,按$u_1,u_2,u_3,u_4$的顺序,系数为[2, 0, -3, 0],对应刚度矩阵的一行:$\begin{bmatrix}2 & 0 & -3 & 0\end{bmatrix}$,力向量对应元素为$f_2$。
内容的提问来源于stack exchange,提问作者Elta
相关产品推荐
相关产品推荐

