曾攀老师的《有限元分析基础教程》第三章有二维杆单元的推导,并结合一个例题进行了解析解和基于Matlab的程序求解。但是我感觉书中的MATLAB代码有点罗嗦,而且一些实现方法也比较麻烦,比如已经知道了杆单元的起点和终点坐标,仍然需要另外给出单元局部坐标与整体坐标的夹角,这完全没必要。于是我就用Python重构了这段程序,当然并不是把书中的MATLAB代码翻译成python(事实上完全可以这么干,而且很快!)。比如我使用了面向对象的思想,把杆单元写成了一个类,这样思路比较清晰。

#! /usr/bin/python
# -*- coding: utf-8 -*- import math
import numpy as np sqrt, cos, sin, pi = math.sqrt, math.cos, math.sin, math.pi
"前处理"
nodeNumber = 4
KK = np.zeros((2*nodeNumber, 2*nodeNumber)) """
边界条件,U表示节点的位移向量,如果某个自由度的位移未知,则该处填写‘u_Unknown’,
F表示节点的荷载向量,如果某个自由度的荷载未知,则该处填写‘f_Unknown’
"""
U = np.array([0, 0, 'u_Unknown', 0, 'u_Unknown', 'u_Unknown', 0, 0], dtype=object)
F = np.array(['f_Unknown', 'f_Unknown', 2e4, 'f_Unknown', 0, -2.5e4, 'f_Unknown', 'f_Unknown'], dtype=object) class Bar2D:
"""定义二维杆单元类,该类包含杆件的基本信息:
E 弹性模量,A 杆单元面积,i 单元起点的节点编号,j 单元终点的节点编号
x1 y1 起点的坐标,x2 y2 终点的坐标,
DOF 单元在总体刚度矩阵里面所在的位置,L 单元的长度,
cos sin 单元的方向余弦 方向正弦,
k 单元刚度矩阵"""
def __init__(self, E, A, x1, y1, x2, y2, i, j):
self.E = E
self.A = A
self.i = i
self.j = j
# 定义一个由单刚矩阵的自由度向总刚矩阵自由度转换的数组
self.DOF = np.array([2*i-2, 2*i-1, 2*j-2, 2*j-1],dtype=np.int16)
self.L = sqrt((x1 - x2)**2 + (y1 - y2)**2)
self.cos = (x2 - x1) / self.L
self.sin = (y2 - y1) / self.L
L, c, s = self.L, self.cos, self.sin
self.k = (E*A/L)*np.array([[c*c, c*s, -c*c, -c*s],
[c*s, s*s, -c*s, -s*s],
[-c*c, -c*s, c*c, c*s],
[-c*s, -s*s, c*s, s*s]])
"定义求解单元应力的函数"
def stress(U):
# 从位移矩阵U中获取该单元两个节点的1*4位移矩阵
u = U(self.DOF)
E, L, c, s = self.E, self.L, self.c, self.s
T = np.array([-c, -s, c, s])
self.bar_Stress = E / L * np.dot(T, u)
return self.bar_Stress "定义总刚矩阵集成函数"
def Bar2D2Node_Assembly(KK, bar):
for n1 in xrange(4):
for n2 in xrange(4):
KK[bar.DOF[n1], bar.DOF[n2]] += bar.k[n1, n2]
return KK '求解节点位移'
def node_Disaplacement(KK, U, F):
# 获取缩减后的总刚矩阵
del_row_col = np.where(U == 0)
kk_delRow = np.delete(KK, del_row_col, 0)
kk_delCol = np.delete(kk_delRow, del_row_col,1)
kk = kk_delCol
# 获取节点位移位置对应的节点力矩阵
f = F[np.where(U == 'u_Unknown')]
u = np.linalg.solve(kk, f)
U[np.where(U=='u_Unknown')] = u
return U '求解节点力,必须在已经求得节点位移U后才可调用本函数'
def node_Force(KK, U):
F = np.dot(KK, U)
return F

仍然以书上的例题为例

结构的离散化同书中一致

程序中Bar2D这个类表示杆单元,实例化的时候,需要提供一下信息:

弹性模量E,面积A,起点i和终点j的编号以及各自的坐标。

所以对于本例题,这几个信息如下:

E, A, x1, y1, x2, y2, x3, y3, x4, y4 = 2.95e11, 0.0001, 0, 0, 0.4, 0, 0.4, 0.3, 0, 0.3
bar1 = Bar2D(E, A, x1, y1, x2, y2, 1, 2)
bar2 = Bar2D(E, A, x3, y3, x2, y2, 3, 2)
bar3 = Bar2D(E, A, x1, y1, x3, y3, 1, 3)
bar4 = Bar2D(E, A, x4, y4, x3, y3, 4, 3) bars = [bar1, bar2, bar3, bar4] for bar in bars:
Bar2D2Node_Assembly(KK, bar)

然后调用相应的函数求解位移和荷载即可:

# 求解位移
U = node_Disaplacement(KK, U, F)
# 求解节点力
F = node_Force(KK, U)

最终求得的结果如下:

可看到最终结果与书中求得的结果是一致的,由于单位制采用m为单位,所以求得的位移单位也是m。

--------------------------------------------------------------------------

写这段代码的时候,让我想起了当年我上靳慧老师的《有限元方法》这门课。还记得当时前面几章的基础部分是靳老师授课,后面的章节是暑期的一个小学期由加州大学尔湾分校的孙立志教授授课,孙教授采用的是全英文授课。那是我唯一的一次听全英文授课,虽然稍微有点吃力,但大部分还是可以听得懂的。国外老师的授课思路与国内老师还是有些区别,国外老师一般从基本的属性方法讲起,我记得当时孙老师用了不少篇幅讲加权残值法和伽辽金方法,虽然现在忘得差不多了,但那是一段难忘的经历。。

靳老师中间布置过一次作业,是一个三维杆单元结构的例题,让我们自己编写程序求解该例题,然后使用通用有限元程序分析,比较二者的结果。编程语言不限制,但所有人都不由自主的选择了MATLAB。本来我了逼格,我还想用FORTRAN的,但权衡了一下还是算了,学起来太麻烦。最后还是选择了MATLAB。现在回想起来,当时写的代码太烂了。用了一天入门matlab,然后赶鸭子上架搞出来的,为了声明带下标的变量生生用了N多行eval函数,不堪回首。

《有限元分析基础教程》(曾攀)笔记一-二维杆单元有限元程序(基于Python)的更多相关文章

  1. 《objective-c基础教程》学习笔记(二)—— for循环的基本应用

    在上一篇博文中,我们介绍了如何开发前期的准备,以及简单的类型输出实例. 这篇博文,我要记录一个for循环输出的实例.并对此展开,改变成不同的三个小函数. int main(int argc, cons ...

  2. CG基础教程-陈惟老师十二讲笔记

    转自 麽洋TinyOcean:http://www.douban.com/people/Tinyocean/notes?start=50&type=note 因为看了陈惟十二讲视频没有课件,边 ...

  3. Java编程基础阶段笔记 day06 二维数组

    二维数组 笔记Notes 二维数组 二维数组声明 二维数组静态初始化与二位初始化 二维数组元素赋值与获取 二维数组遍历 二维数组内存解析 打印杨辉三角 Arrays工具类 数组中常见的异常 二维数组 ...

  4. Git学习笔记(二) · 非典型性程序猿

    远程库的使用 前面说到的都是git在本地的操作,那么实际协作开发过程中我们肯定是要有一个远程版本库作为项目的核心版本库,也就是投入生产使用的版本.这里我们以 Github为例.Github是一个开放的 ...

  5. C语言基础练习——最大值及其位置(二维数组)

    C语言基础练习——最大值及其位置(二维数组) 时间限制: 1 Sec  内存限制: 10 MB 题目描述 有一个n×m的矩阵,要求编程序求出: 每行元素的最大值,以及其所在的行号和列号.求出所有元素的 ...

  6. C语言学习笔记 (005) - 二维数组作为函数参数传递剖析

    前言 很多文章不外乎告诉你下面这几种标准的形式,你如果按照它们来用,准没错: //对于一个2行13列int元素的二维数组 //函数f的形参形式 f(int daytab[2][13]) {...} / ...

  7. 《C#图解教程》读书笔记之二:存储、类型和变量

    本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.类型初窥:掀起你的盖头来 (1)C程序是一组函数和数据类型,C++程序是一组函数和类,而C#程序是一组类型声 ...

  8. 《jQuery基础教程》读书笔记

    最近在看<jQuery基础教程>这本书,做了点读书笔记以备回顾,不定期更新. 第一章第二章比较基础,就此略过了... 第三章 事件 jQuery中$(document).ready()与j ...

  9. 《objective-c基础教程》学习笔记 (一)—— 开发环境配置和简单类型输出

    懒惰是富有最大的敌人,再不前进,我们就out了.最近工作比较轻松,不是很忙.于是想晚上下班回家学习点新东西.看着苹果大军的一天天壮大,心里也是痒痒的.于是就想先系统的学习下Objective-C,为之 ...

随机推荐

  1. Elasticsearch aggregations API

    聚合能力 Aggregation API 类似 SQL 中的 GROUP BY 语句,可以以某个字段来进行分组. Aggregation API 支持分级分组,多级的分组过程是由外到里的. Aggre ...

  2. QQ粘性效果

    演示如下 QQ粘性效果.zip

  3. 用js实现跳转提示页面

    效果图: 网页布局 <p>操作成功</p> <strong>5</strong><span>秒后回到主页</span><a ...

  4. 一点关于this的理解

    关于this,是很多前端面试必考的题目,有时候在网上看到这些题目,自己试了一下,额,还真的错了!在实际开发中,也会遇到 this 的问题(虽然一些类库会帮我们处理),例如在使用一些框架的时候,例如:k ...

  5. java web项目中classes文件夹下的class和WEB-INF/lib中jar里的class文件加载顺序

    如果是发布到weblogic的话,可以在WebContent\WEB-INF\weblogic.xml里面配置.参考配置如下:<?xml version="1.0" enco ...

  6. 过滤textarea

    Function UBBFilter(ByVal reString) Dim Str:Str=reString If Not IsNull(Str) Then Str = Replace(Str, & ...

  7. 深入理解java的抽象类和接口(转载)

    原文链接:http://www.cnblogs.com/dolphin0520/p/3811437.html 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的 ...

  8. ###《More Effective C++》- 基础议题

    More Effective C++ #@author: gr #@date: 2015-05-11 #@email: forgerui@gmail.com 一.仔细区别pointers和refere ...

  9. jq选取对象的方法

     $("#找id的")$(".找样式的")  $("div[id]") 选择所有含有id属性的div元素 $("input[nam ...

  10. TCP/IP 教程

    TCP/IP 是因特网的通信协议. 通信协议是对计算机必须遵守的规则的描述,只有遵守这些规则,计算机之间才能进行通信. 浏览器和服务器都在使用 TCP/IP 因特网浏览器和因特网服务器均使用 TCP/ ...