有限元代码


import numpy as np

class FiniteElementAnalysis:
    def __init__(self, nodes, elements, material_properties):
        self.nodes = nodes
        self.elements = elements
        self.material_properties = material_properties
        self.global_stiffness_matrix = None

    def shape_functions(self, xi, eta, zeta):
        # 二次等参单元的形函数
        N = [
            (1 - xi) * (1 - eta) * (1 - zeta) / 8,
            (1 + xi) * (1 - eta) * (1 - zeta) / 8,
            (1 + xi) * (1 + eta) * (1 - zeta) / 8,
            (1 - xi) * (1 + eta) * (1 - zeta) / 8,
            (1 - xi) * (1 - eta) * (1 + zeta) / 8,
            (1 + xi) * (1 - eta) * (1 + zeta) / 8,
            (1 + xi) * (1 + eta) * (1 + zeta) / 8,
            (1 - xi) * (1 + eta) * (1 + zeta) / 8
        ]
        return N

    def compute_element_stiffness_matrix(self, element):
        # 计算单元刚度矩阵
        node_ids = element['nodes']
        E = self.material_properties['E']
        nu = self.material_properties['nu']
        t = self.material_properties['t']
        Ke = np.zeros((24, 24))

        # 高斯积分点
        gauss_points = [(0.57735, 0.57735, 0.57735), (-0.57735, 0.57735, 0.57735), ...]  # 更多积分点

        for xi, eta, zeta in gauss_points:
            N = self.shape_functions(xi, eta, zeta)
            # 计算雅可比矩阵和其逆
            J = np.array([[...], [...], [...]])  # 雅可比矩阵
            det_J = np.linalg.det(J)
            inv_J = np.linalg.inv(J)

            # 计算B矩阵
            B = np.array([[...], [...], [...]])  # B矩阵

            Ke += B.T @ np.array([[E / (1 - nu**2) * np.array([[1, nu, 0], [nu, 1, 0], [0, 0, (1 - nu) / 2]])]]) @ B * det_J * t

        return Ke

    def assemble_global_stiffness_matrix(self):
        num_nodes = len(self.nodes)
        self.global_stiffness_matrix = np.zeros((3 * num_nodes, 3 * num_nodes))

        for element in self.elements:
            Ke = self.compute_element_stiffness_matrix(element)
            for i, node_i in enumerate(element['nodes']):
                for j, node_j in enumerate(element['nodes']):
                    self.global_stiffness_matrix[3*node_i:3*node_i+3, 3*node_j:3*node_j+3] += Ke[3*i:3*i+3, 3*j:3*j+3]

    def apply_boundary_conditions(self, bc):
        for node_id, dof in bc.items():
            for d in dof:
                self.global_stiffness_matrix[3*node_id+d, :] = 0
                self.global_stiffness_matrix[:, 3*node_id+d] = 0
                self.global_stiffness_matrix[3*node_id+d, 3*node_id+d] = 1

    def solve(self, forces):
        displacements = np.linalg.solve(self.global_stiffness_matrix, forces)
        return displacements

# 示例数据
nodes = np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0], [0, 0, 1], [1, 0, 1], [1, 1, 1], [0, 1, 1]])
elements = [{'nodes': [0, 1, 2, 3, 4, 5, 6, 7]}]
material_properties = {'E': 210e9, 'nu': 0.3, 't': 1}

# 创建有限元分析对象
fea = FiniteElementAnalysis(nodes, elements, material_properties)
fea.assemble_global_stiffness_matrix()

# 应用边界条件
bc = {0: [0, 1, 2], 1: [0, 1, 2]}  # 例如,节点0和1的x, y, z方向固定
fea.apply_boundary_conditions(bc)

# 施加外力
forces = np.zeros(24)
forces[3*2+2] = -1000  # 在节点2的z方向施加1000N的力

# 求解
displacements = fea.solve(forces)
print("Displacements:", displacements)
posted @   redufa  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示