import numpy as np
from math import sqrt, sin, cos, acos
np.set_printoptions(precision=3)
np.set_printoptions(suppress=True) # 将科学数组转化为浮点数
EI = 1 # 为了方便计算,设EI=1
# n = input("请输入位移数量:")
n = 3
ElemNode = np.array([[0, 1], [1, 2], [2, 3]]) # 组成单元的两结点编号
NodeForce = np.array([[-60], [50], [30]]) # 作用在结点上的力,单位N·m
Ei = [0.75, 1.5, 1]
ki = np.array([[4 * EI, 2 * EI],
[2 * EI, 4 * EI]]) # 单元刚度矩阵*L
NodeCoord = np.array([[0, 0], [6, 0], [14, 0], [20, 0]]) # 结点整体坐标
NodeX = NodeCoord[:, 0] # 结点x坐标
NodeY = NodeCoord[:, 1] # 结点y坐标
def k_i(i):
"""
整体坐标系下单元刚度矩阵,i为单元编号
:param i:结点编号
:return: 整体坐标系下单元刚度矩阵,由于连续梁不用坐标变换,所以k = ke
"""
NodeIndex = ElemNode[i, :]
#print(NodeIndex)
Node1_locx = NodeX[NodeIndex[0]]
Node1_locy = NodeY[NodeIndex[0]]
Node2_locx = NodeX[NodeIndex[1]]
Node2_locy = NodeY[NodeIndex[1]]
Len = sqrt((Node1_locx - Node2_locx) ** 2 + (Node1_locy - Node2_locy) ** 2)
# print("len = %d " % (Len))
return ki * Ei[i] / Len # 假设为水平
def TransMatrix(angle):#坐标转换矩阵T
return np.array([
[ cos(angle), sin(angle) , 0, 0 , 0 ],
[-sin(angle), cos(angle), 0, 0 , 0 ],
[ 0 , 0 , 1, 0 , 0 ],
[ 0 , 0 , 0, cos(angle), sin(angle)],
[ 0 , 0 , 0, -sin(angle), cos(angle)],
[ 0 , 0 , 0, 0 , 1 ],
])
# 对上述单元刚度矩阵的各元素,按照其行码和列码直接送入结构刚度矩阵,进行”对号入座“
NumberOfNodeFreeDof = 3
K = np.zeros((NumberOfNodeFreeDof, NumberOfNodeFreeDof))
for i in range(0, n):
kii = k_i(i)
# print(kii)
for j in range(0, 2):
for k in range(0, 2):
if i + j - 1 < 0 or i + k - 1 < 0:
continue
K[i + j - 1, i + k - 1] += kii[j, k]
# print(K)
print("结构刚度矩阵K = ")
print(K)
print('-' * 20)
K_1 = np.linalg.inv(K) # 求K矩阵的逆
print('K的逆 = ')
print(K_1)
print('-' * 20)
NodeDis = np.matmul(K_1, NodeForce) # 🔺 = K-1*F
NodeDisplacement = np.zeros((1,n+1))
for i in range(0, n):
NodeIndex = NodeDis[i,:]
NodeDisplacement[0,i+1] = NodeIndex[0]
print(NodeDisplacement)
for i in range(0,n):
kii = k_i(i)
M1 = kii[0,0]*NodeDisplacement[0,i]+kii[0,1]*NodeDisplacement[0,i+1]
M2 = kii[1, 0] * NodeDisplacement[0, i] + kii[1, 1] * NodeDisplacement[0, i + 1]
print("在%d号杆件上,左端弯矩为M = %.3f, 右端弯矩为M = %.3f" % (i,M1,M2))