《有限元分析基础教程》(曾攀)笔记一-二维杆单元有限元程序(基于Python)
曾攀老师的《有限元分析基础教程》第三章有二维杆单元的推导,并结合一个例题进行了解析解和基于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)的更多相关文章
- 《objective-c基础教程》学习笔记(二)—— for循环的基本应用
在上一篇博文中,我们介绍了如何开发前期的准备,以及简单的类型输出实例. 这篇博文,我要记录一个for循环输出的实例.并对此展开,改变成不同的三个小函数. int main(int argc, cons ...
- CG基础教程-陈惟老师十二讲笔记
转自 麽洋TinyOcean:http://www.douban.com/people/Tinyocean/notes?start=50&type=note 因为看了陈惟十二讲视频没有课件,边 ...
- Java编程基础阶段笔记 day06 二维数组
二维数组 笔记Notes 二维数组 二维数组声明 二维数组静态初始化与二位初始化 二维数组元素赋值与获取 二维数组遍历 二维数组内存解析 打印杨辉三角 Arrays工具类 数组中常见的异常 二维数组 ...
- Git学习笔记(二) · 非典型性程序猿
远程库的使用 前面说到的都是git在本地的操作,那么实际协作开发过程中我们肯定是要有一个远程版本库作为项目的核心版本库,也就是投入生产使用的版本.这里我们以 Github为例.Github是一个开放的 ...
- C语言基础练习——最大值及其位置(二维数组)
C语言基础练习——最大值及其位置(二维数组) 时间限制: 1 Sec 内存限制: 10 MB 题目描述 有一个n×m的矩阵,要求编程序求出: 每行元素的最大值,以及其所在的行号和列号.求出所有元素的 ...
- C语言学习笔记 (005) - 二维数组作为函数参数传递剖析
前言 很多文章不外乎告诉你下面这几种标准的形式,你如果按照它们来用,准没错: //对于一个2行13列int元素的二维数组 //函数f的形参形式 f(int daytab[2][13]) {...} / ...
- 《C#图解教程》读书笔记之二:存储、类型和变量
本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.类型初窥:掀起你的盖头来 (1)C程序是一组函数和数据类型,C++程序是一组函数和类,而C#程序是一组类型声 ...
- 《jQuery基础教程》读书笔记
最近在看<jQuery基础教程>这本书,做了点读书笔记以备回顾,不定期更新. 第一章第二章比较基础,就此略过了... 第三章 事件 jQuery中$(document).ready()与j ...
- 《objective-c基础教程》学习笔记 (一)—— 开发环境配置和简单类型输出
懒惰是富有最大的敌人,再不前进,我们就out了.最近工作比较轻松,不是很忙.于是想晚上下班回家学习点新东西.看着苹果大军的一天天壮大,心里也是痒痒的.于是就想先系统的学习下Objective-C,为之 ...
随机推荐
- 我的开发框架(WinForm)3
今天继续给大家介绍核心库的IOC的使用,在我的框架里,IOC使用的比较简单,主要是用于解除模块间的耦合和实例化接口. 1.接口说明,IocContainer接口比较简单只有3个方法,但是是系统中用的最 ...
- angualrjs学习总结二(作用域、控制器、过滤器)
一:Scope简介 Scope(作用域) 是应用在 HTML (视图) 和 JavaScript (控制器)之间的纽带.Scope 是一个对象,有可用的方法和属性.Scope 可应用在视图和控制器上. ...
- java基础学习总结四(控制语句<顺序、选择、循环>、方法)
一:结构控制语句 结构控制语句分为3种,顺序语句.选择语句.循环语句. 1:顺序语句 就是自上而下的执行程序,默认执行顺序. 2:选择语句 if结构语句:如果满足条件,则执行该语句. if...els ...
- VSPackge插件系列:如何正确获取DTE
做VS插件开发,不得不了解DTE,有了DTE我们就可以与VS交互了,比如说获取当前选择的文件,比如说获取当前主窗口,比如说获取编译器等等,关于DTE接口更多的说明我把接口地址贴出来方便大家查阅. ht ...
- 基于ARM的RealView MDK开发环境
RealView MDK可以对各种嵌入式处理器的软件开发工具.这么高端,着实很吸引我,ADS12还不知道怎么搞,居然还有这么高端的,但是还是得了解一下唉.洗这个自动配 置启动代码,集成Flash烧写模 ...
- Ubuntu 安装php_intl 扩展
PHP Intl 类在I18n的网站中真的很方便,允许你依赖在终端用户区域,很容易的输出正确的日期格式. 在使用 yii2-app-ecom , 初始化之后,访问首页出现了: The default ...
- 浏览器是如何运行HTML的?
什么是网页 网页(HTML page)是在浏览器(Browser)上运行并且可以与用户产生互动的应用程序. 此图为浏览器运行HTML 这个想说 ...
- div中的img垂直居中
<html> <head> <style type="text/css"> .imgDiv { overflow: hidden; displa ...
- css扁平化博客学习总结(一)模块分析
一.模块分析 1.每开发一个项目之前,首先要对项目进行一个大致规划,它到底要做什么功能,它有什么具体需求. 2.所以需要进行模块化分析,把这些东西具象化,把一个问题模块化,对需求有一个宏观的了解. 3 ...
- 服务端缓存HttpRuntime.Cache的使用
HttpRuntime.Cache.Insert("缓存key", "缓存content", null, DateTime.Now.AddMinutes(3), ...