在机械工程领域中,经常会遇到要为设计好的结构或者部件选择合适的材料的问题。材料的选择问题要考虑到多方面的因素,力学性能、结构的重量要求、材料的经济性等等。目前,工程材料选择一般的策略是根据经验从一个庞大的材料库中为结构或者部件中的不同部分选择较为合适的不同材料,然后对整个选材方案进行评价,如果符合要求,即采用,否则继续选择。这种依赖于经验的选择方法缺乏科学性,无法保证每次的选择是最优的。因此,希望您能根据所学的知识,为企业提供一个合适的解决方案。
为了简化问题,现将某些问题具体化(实际参加建模比赛时,问题都比较抽象,因此很多需要自己将问题进行具体化!!!!):
1、所设计的方案主要考虑结构的质量和经济性,结构的类型可以自行定义,不要太复杂,能说明问题即可(建议采用下图所示结构,所需尺寸可以自己定义);
2、材料选择需要一个材料库,下表中给出了一个简单的16个材料的数据库,材料属性中缺少的信息需要队员自行补充(查阅资料获得实际价格,或者人为给定!)
建模队员需要完成的任务
1、对问题进行一个较为全面的了解,阅读相关文献(中英文),能较为清楚地表述所研究的问题,明确该问题的难点所在,阐述自己的突破口,能够较清楚地表达自己的思路和建模的过程;
2、建立合适的材料选择数学模型;
3、研究数学模型的求解策略,研究是否具有较高效率的求解算法,给出至少一种算法流程图。
写作队员需要完成的任务
对问题进行一个较为全面的了解,阅读相关文献(中英文),能较为清楚地表述所研究的问题、该问题目前的主要解决方法以及存在的不足,明确该问题的难点所在,以合理的文章结构将一种现有的解决方法表述出来;参考成功的数模参赛论文结构,论文的语言表述以及文章的结构将是重点考察的对象,此外,文章的排版、图标的绘制也将作为考察对象。
编程队员需要完成的任务
对问题进行一个较为全面的了解,阅读相关文献(中英文),能较为清楚地表述所研究的问题,明确该问题的难点所在。针对现有的一种数学模型,提出恰当的求解方法,给出算法的实现流程图,并用程序实现(最好用MATLAB!不建议用C语言!)(可做适当的简化)
提交的答卷
所有的队员都需要提交一份电子文档,编程人员需要同时提交所编写的程序代码(m文件或者c文件,不要将代码粘贴在文档的最后!!),电子文档的内容包括了自己所有的需要完成的任务。不需要都完成一篇完整的数模论文,建模队员需要将模型的建立过程表述清楚,编程队员需要将算法实现过程以及实现难点表述清楚。写作队员需要给出结构想对较为完整的论文,但是内容上根据自己对问题的理解进行编写。对具体的建模过程和算法实现过程不做要求,但是为了论文的完整性,可以适当地涉及。
问题分析:
此类多目标优化问题最常用的方法建立的层次分析法(AHP)将问题化为目标层、准则层及方案层,通过建立比较矩阵求权向量。但为了使问题的解决更合理且易求解,本人创新建立了一种模型。即使力学性能成为必须达到的约束条件,经济性成为我们需要求最值的目标函数。而经济性的模型建立为购买价格与使用寿命的商值。
模型假设:
1.在选择材料时只考虑材料的力学性能(拉应力强度 切应力强度 弹性模量),与经济性(购买价格及使用寿命),其他条件(比如说自重,工程材料受力主要来源于机械运动,自重影响很小,且不同的工程材料密度相似)忽略不考虑。
2.工程人员需要的材料必出现在材料库中。
3.工程人员提出要求只选择一种材料。
符号声明:
A 经济性
B 购买价格(元)
C 使用寿命(天)
D 材料的拉应力强度(Mpa)
E 材料的切应力强度(Mpa)
F 材料的弹性模量
G 需求的材料的最小拉应力强度(Mpa) H 需求的材料的最小切应力强度(Mpa)
L 需求的材料的最小弹性模量
模型建立:
目标函数:P=B/C
约束条件:1.D>=G
2.E>=H
3.F>=L
4.只选择一种材料
问题转化为在约束条件下求目标函数最小值问题
数据:
C语言代码
#include<stdio.h>
void main()
{
/*各种材料性能数据的录入(由程序员进行)*/
int a,b,c,i,j,k=0,l,m,n;
int d[9]={412,529,570,598,630,696,380,470,490};
int e[9]={522,639,689,698,740,799,450,570,590};
int f[9]={365,365,730,365,547,730,365,547,547};
int g[9]={100,150,200,200,100,150,200,150,200};
int h[9]={2000,2500,4100,3000,3446,5080,1500,3000,2790};
int y[9];
int z[9];
/*用户需求的性能输入(由查询用户进行)*/
printf("请输入您所需要材料的拉应力强度(Mpa):\n");
scanf("%d",&a);
printf("请输入您所需要材料的切应力强度(Mpa):\n");
scanf("%d",&b);
printf("请输入您所需要材料的弹性模量(Mpa):\n");
scanf("%d",&c);
/*模型计算循环*/
for(j=0;j<=8;j++) z[j]=(h[j])/(f[j]);
/*筛选材料性能(选出性能可用的材料)循环*/
for(n=0;n<=8;n++)
{
if((d[n]>=a)&&(e[n]>=b)&&(g[n]>=c))
{
y[k]=n;
k++;
}
}
/*比较可用材料经济性循环*/
for(l=0,m=z[(y[0])];l<=k-1;l++)
{
if(m>=z[(y[l])])
{
i=y[l];
m=z[(y[l])];
}
}
/*将性能满足,经济性最好的材料牌号交给查询用户*/
switch(i)
{
case 0: printf("建议您选择Y20钢\n"); break;
case 1: printf("建议您选择Y35钢\n"); break;
case 2: printf("建议您选择Y40钢\n"); break;
case 3: printf("建议您选择Y45钢\n"); break;
case 4: printf("建议您选择Y50钢\n"); break;
case 5: printf("建议您选择Y65钢\n"); break;
case 6: printf("建议您选择Q235钢\n"); break;
case 7: printf("建议您选择Q255钢\n"); break;
case 8: printf("建议您选择Q275钢\n"); break;
default:printf("没有合适材料\n");
}
}
lingo:
model:
!建立材料集(成员为各种材料,属性为价格 强度等);
sets:
materials/Y20,Y35,Y40,Y45,Y50,Y65,Q235,Q255,Q275/:jiage,laqiangdu,qieqiangdu,shouming,tanxing,xuanze;
endsets
!确立目标函数(经济性);
min=@sum(materials(I):xuanze(I)*jiage(I)/shouming(I));
!进行约束(只选用一种材料);
@for(materials(I):@bin(xuanze(I)));
1=@sum(materials(I):xuanze(I));
!进行力学性能约束(强度刚度);
550<=@sum(materials(I):xuanze(I)*laqiangdu(I));
600<=@sum(materials(I):xuanze(I)*qieqiangdu(I));
150<=@sum(materials(I):xuanze(I)*tanxing(I));
!将各材料的性质送入程序;
data:
jiage=2000,2500,4100,3000,3446,5080,1500,3000,2790;
laqiangdu=412,529,570,598,630,696,380,470,490;
qieqiangdu=522,639,689,698,740,799,450,570,590;
shouming=365,365,730,365,547,730,365,547,547;
tanxing=100,150,200,200,100,150,200,150,200;
enddata
end