c语言求解有限元中常应变三角形单元分析问题

1,程序设计目的

  巩固和加深对有限元基本理论的理解,掌握程序设计的基本方法,技能及程序语言的编写及编译,提升求解实际工程问题。

2,程序说明

运用有限元方法中三角形常应变单元解平面问题的计算主程序。其步骤如下:

(1)由结点位移及坐标确定出单元内部各点位移。

(2)由单元内部各点的位移确定出对应的应变。

(3)根据应力——应变的关系由单元应变确定出相应的应力。

(4)根据虚功方程由应力确定出结点力。

(5)由单元的结点位移求出单元的结点力,据此求出单元的刚度矩阵。

3,应用实例

源程序:

//求图3-6所示等腰直角三角形单元的刚度矩阵k,设厚度t=1,弹性模量E=1;

#include <stdio.h>
#include <Windows.h>
#include <math.h>
#include <stdlib.h>
#pragma warning(disable:4996)

menu(){
printf("-------------------------------------------------------------------------------\n");
printf("--------------------------Welcome to 有限元程序设计----------------------------\n");
printf("-------------------------------------------------------------------------------\n");
printf("-------------------------------------------------------------------------------\n");
printf("-------------------------------------------------------------------------------\n");
printf("-------------------该程序的目的为求解三角形单元的刚度矩阵Ke!-------------------\n");
printf("-------------------------------------------------------------------------------\n");
printf("-------------------------------------------------------------------------------\n");
printf("--------------------------假设厚度t=1,弹性模量E=1-----------------------------\n");
printf("-------------------------------------------------------------------------------\n");
printf("----------------------------按任意键进入程序设计!-----------------------------\n");
printf("-------------------------------------------------------------------------------\n");
printf("-------------------------------------------------------------------------------\n");
char start = 0;
scanf("%c", &start);
}
int main()
{
static int E = 1;
static int t = 1;
//先创建三个节点的x、y坐标

menu();
system("cls");
//结点1
int x1, y1;
//结点2
int x2, y2;
//结点3
int x3, y3;
printf("请输入第一个节点的x、y坐标:\n");
scanf("%d%d", &x1,&y1);

printf("请输入第二个节点的x、y坐标:\n");
scanf("%d%d", &x2,&y2);

printf("请输入第三个节点的x、y坐标:\n");
scanf("%d%d", &x3,&y3);
//输入泊松比;
double u = 0.0;
printf("请输入泊松比:\n");
scanf("%f", &u);

int a1 = x2*y3 - x3*y2;
int a2 = x3*y1 - x1*y3;
int a3 = x1*y2 - x2*y1;

int b1 = y2 - y3;
int b2 = y3 - y1;
int b3 = y1 - y2;

int c1 = x3 - x2;
int c2 = x1 - x3;
int c3 = x2 - x1;

//算出该三角形的边长length1、2、3;
double length1 = sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));
double length2 = sqrt((x2 - x3)*(x2 - x3) + (y2 - y3)*(y2 - y3));
double length3 = sqrt((x1 - x3)*(x1 - x3) + (y1 - y3)*(y1 - y3));
//算出该三角形的周长per
double per = (length1 + length2 + length3) / 2;
//算出该三角形的面积area;
double area = sqrt(per*(per - length1)*(per - length2)*(per - length3));

//建立几何矩阵(用二维数组实现)
double B[3][6];
memset(B, 0.0, sizeof(B));
//二维数组初始化
double cd = 1 / (2 * area);
//根据课本中的3-9公式
//第一行
B[0][0] = b1*cd;
B[0][2] = b2*cd;
B[0][4] = b3*cd;
//第二行
B[1][1] = c1*cd;
B[1][3] = c2*cd;
B[1][5] = c3*cd;
//第三行
B[2][0] = c1*cd;
B[2][1] = b1*cd;
B[2][2] = c2*cd;
B[2][3] = b2*cd;
B[2][4] = c3*cd;
B[2][5] = b3*cd;
//完成几何矩阵的创建;

//由于u=0,平面应力与平面问题的D相同;
//计算应力弹性矩阵
double D[3][3] = { { 1.0, u, 0.0 }, \
{u, 1.0, 0.0}, \
{0.0, 0.0, (1 - u) / 2}
};
for (int i = 0; i < (sizeof(D) / sizeof(D[0])); i++){
D[0][i] *= (E / (1 - u*u));
D[1][i] *= (E / (1 - u*u));
D[2][i] *= (E / (1 - u*u));
}//求得最终的应力弹性矩阵;

//计算应力转换矩阵
double S[3][6];
//数组初始化;
memset(S, 0.0, sizeof(S));

//S=D*B;
for (int j = 0; j < (sizeof(D) / sizeof(D[0])); j++){
for (int i = 0; i < (sizeof(D) / sizeof(D[0])); i++){
S[j][0] += D[j][i] * B[i][0];
S[j][1] += D[j][i] * B[i][1];
S[j][2] += D[j][i] * B[i][2];
S[j][3] += D[j][i] * B[i][3];
S[j][4] += D[j][i] * B[i][4];
S[j][5] += D[j][i] * B[i][5];
}
}

//将B、S及t,面积area带入公式得单元刚度矩阵Ke;

//求得B的转置矩阵B1;
double B1[6][3];
memset(B1, 0.0, sizeof(B1));
for (int i = 0; i < (sizeof(B1) / sizeof(B1[0])); i++){
B1[i][0] = B[0][i];
B1[i][1] = B[1][i];
B1[i][2] = B[2][i];
}

//求单元刚度矩阵;
double B1S[6][6];
memset(B1S, 0.0, sizeof(B1S));
for (int j = 0; j < 6; j++){
for (int i = 0;  i< 3; i++){
B1S[j][0] += B1[j][i] * S[i][0];
B1S[j][1] += B1[j][i] * S[i][1];
B1S[j][2] += B1[j][i] * S[i][2];
B1S[j][3] += B1[j][i] * S[i][3];
B1S[j][4] += B1[j][i] * S[i][4];
B1S[j][5] += B1[j][i] * S[i][5];
}
}
printf("求得该三角形单位刚度矩阵Ke为:\n");
printf("-------------------------------------------------------------------------------\n");
for (int j = 0; j < (sizeof(B1S) / sizeof(B1S[0])); j++){
for (int i = 0; i < (sizeof(B1S) / sizeof(B1S[0])); i++){
printf("%6.2f ",B1S[i][j] *= (area*t));//为最终结果!
}
printf("\n");
}
printf("-------------------------------------------------------------------------------\n");
system("pause");
return 0;
}

运行上述代码;

输入三个节点的坐标,输入泊松比;

 

 

  • 11
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Android 项目是使用 Android 操作系统和相关开发工具开发的一款移动应用程序。Android 平台提供了丰富的功能和接口,开发人员可以使用 Java 或 Kotlin 等编程语言编写 Android 应用程序。Android 项目也可以是针对特定设备或特定需求进行自定义开发的软件解决方案。 以下是 Android 项目的一些主要特点和资料介绍: 1. 开放源代码:Android 是基于 Linux 内核的开源操作系统,开发人员可以自由获取、使用和修改源代码。 2. 多样化的硬件设备支持:Android 支持多种硬件设备和屏幕尺寸,可以运行于手机、平板电脑、电视、手表等多种设备上。 3. 灵活的用户界面:Android 提供了丰富的用户界面控件和布局方式,可以实现漂亮、个性化的用户界面。 4. 响应式设计:Android 应用程序可以根据设备类型、屏幕尺寸等因素调整布局和显示方式,以适应不同的设备和用户需求。 5. 多媒体支持:Android 支持见的音频、视频、图像等多媒体格式,可以实现各种多媒体应用。 6. 数据存储:Android 提供了多种数据存储方式,包括 SQLite 数据库、文件存储、SharedPreferences 等。 7. 网络通信:Android 支持多种网络通信方式,包括 HTTP、TCP、UDP 等。 8. 社交媒体集成:Android 提供了集成社交媒体的功能,可以实现与 Facebook、Twitter、Google+ 等社交媒体的交互。 # 注意 1. 本资源仅用于开源学习和技术交流。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。 3. 不可商用,一切后果由使用者承担。
好的,这是一个比较复杂的问题,我会尽可能地简单明了地回答。 首先,有限元法是一种广泛应用于结构力学中的数值方法。它的基本思想是将连续介质离散化为有限个小元素,对每个小元素进行分析,再将结果组合起来得到整个系统的解。 在三角形单元中,每个元素由三个节点组成,每个节点有三个自由度(x、y、z方向的位移)。因此,每个元素有9个自由度。在应力分析中,我们需要求解每个节点的位移和应力,因此需要解决一个大型的线性方程组。 下面是一个简单的程序框架,用c语言实现有限元三结点三角形单元求解结构应力: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #define PI 3.14159265358979323846 // 定义节点和单元 struct node { double x; double y; double z; }; struct element { int node1; int node2; int node3; }; // 定义材料属性 double E; // 弹性模量 double nu; // 泊松比 // 定义载荷 double F; // 外力 // 定义刚度矩阵和位移向量 double **K; double *U; // 定义函数 void init(); void assemble(); void solve(); void output(); int main() { init(); assemble(); solve(); output(); return 0; } void init() { // 初始化节点和单元 ... // 初始化材料属性 E = 210e9; // 钢的弹性模量 nu = 0.3; // 钢的泊松比 // 初始化载荷 F = 10000; // N // 初始化刚度矩阵和位移向量 K = (double **) malloc(num_nodes * 3 * sizeof(double *)); for (int i = 0; i < num_nodes * 3; i++) { K[i] = (double *) malloc(num_nodes * 3 * sizeof(double)); } U = (double *) malloc(num_nodes * 3 * sizeof(double)); } void assemble() { // 组装刚度矩阵 ... } void solve() { // 解线性方程组 ... } void output() { // 输出结果 ... } ``` 这个程序框架还需要完善和细化,具体实现需要涉及到很多细节和算法。如果您对此感兴趣,可以参考一些经典的有限元教材或者在线课程,学习有限元分析的基本原理和实现方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值