机械优化设计阻尼牛顿法.docx
《机械优化设计阻尼牛顿法.docx》由会员分享,可在线阅读,更多相关《机械优化设计阻尼牛顿法.docx(14页珍藏版)》请在冰豆网上搜索。
![机械优化设计阻尼牛顿法.docx](https://file1.bdocx.com/fileroot1/2023-5/20/2d08cabd-9c6e-4e92-afd7-8bc66af83ec6/2d08cabd-9c6e-4e92-afd7-8bc66af83ec61.gif)
机械优化设计阻尼牛顿法
第1章选择方法及思路 1
1.1概述 1
1.1.1优化设计 1
1.1.2优化设计的思想 1
1.1.3优化设计的步骤 1
1.2优化设计的方法 1
1.2.1分类 1
1.2.2常用的优化方法 2
第2章阻尼牛顿法计算应用 4
2.1阻尼牛顿法的计算步骤 4
2.2阻尼牛顿法的程序框图 5
2.3实例解析 5
2.4阻尼牛顿法的程序编程 6
第3章总结 9
第1章选择方法及思路
1.1概述
1.1.1优化设计
优化设计是一种规格化的设计方法,它首先要求将设计问题按优化设计所规定的格式建立数学模型,选择合适的优化方法及计算机程序,然后再通过计算机的计算,自动获得最优设计方案。
1.1.2优化设计的思想
优化设计的指导思想源于它所倡导的开放型思维方式,即在面对问题时,抛开现实的局限去想象一种最理想的境界,然后再返回到当前的现状中来寻找最佳的解决方案.在管理学中有一句俗语,“思路决定出路,心动决定行动”.如此的思维方式有助于摆脱虚设的假象,这并非属于异想天开或者好高骛远的空想,而是强调一切从未来出发,然后再从现实着手。
1.1.2优化设计的步骤
一般来说,优化设计有以下几个步骤:
1、建立数学模型
2、选择最优化算法
3、程序设计
4、制定目标要求
5、计算机自动筛选最优设计方案等
1.2优化设计的方法
1.2.1分类
根据讨论问题的不同方面,有不同的分类方法:
1、按设计变量数量来分
(1)单变量(一维)优化
(2)多变量优化
2、按约束条件来分
(1)无约束优化
(2)有约束优化
3、按目标函数来分
(1)单目标优化
(2)多目标优化
4、按求解方法特点
(1)准则法
(2)数学归纳法
1.2.2常用的优化方法
常用的优化方法:
单变量(一维)优化,无约束优化,多目标函数优化,数学归纳法。
1、单变量(一维)优化
(1)概述
单变量(一维)优化方法是优化方法中最简单、最基本的方法。
(2)具体优化方法
1)黄金分割法(0.618法)
黄金分割是指将一段线段分成两端的方法,使整段与较长段的比值等于较长段与较短段的比值,即
2)插值法
插值法又称“内插法”,是利用函数f(x)在某区间中若干点的函数值,作出适当的特定函数,在这些点上取已知值,在区间的其他点上用这特定函数的值作为函数f(x)的近似值,这种方法称为插值法。
黄金分割法(0.618法)与插值法的比较
相同点:
两种方法都是利用区间消去法原理将初始搜索区间不断缩短,求得极小值的数值近似解。
不同点:
表现在试验点(插入点)位置的确定方法不同。
黄金分割法:
试验点是按照某种个特定的规律确定;不考虑函数值的分布;插值法:
试验点是按照函数值近似分布的极小点确定;利用了函数值本身及其导数信息。
2、无约束优化
(1)概述
无约束最优化问题是:
求n维设计变量X=[x1,x2,…,xn]T使目标函数为minf(X),而对X没有任何限制;如果存在X*,使minf(X)=f(X*)分别称X*为最优点,f(X*)为最优值
(2)具体优化方法
无约束最优化方法归纳起来可分为两大类:
直接法:
变量(坐标)轮换法、共轭方向法、鲍威尔(Powell)法
间接法:
梯度法、共轭梯度法、牛顿法
1)变量(坐标)轮换法
它是把多变量的优化问题转化为一系列单变量的优化问题的一种方法。
原理:
沿着坐标轴的方向轮流进行搜索,直至最优点。
又称坐标轮换法。
特点:
变量轮换法的基本思想认为坐标轴方向为有利的搜索方向,因此,在搜索时总是沿着互相垂直的坐标轴方向,并变换多次,才能达到极值点。
搜索效率低,且越接近极值点,搜索速度越慢。
2)共轭方向法
设A为n×n阶实对称正定矩阵,如果有两个n维向量S1和S2满足
S1TAS2=0
则称向量S1与S2对于矩阵A共轭。
共轭向量的方向称为共轭方向,
沿着共轭向量的方向进行搜索的方法称为共轭方向法。
3)鲍威尔(Powell)法
鲍威尔(Powell)法又称鲍威尔共轭方向法,它是对原始共轭方向法的改进,与原始共轭法的区别在于它对于每一次的搜索结果进行判断,并选择最优方向继续搜索。
4)梯度法
基本原理:
人们利用函数在其负梯度方向函数值下降最快这一局部性质,将n维无约束极小化问题转化为一系列沿目标函数负梯度方向一维搜索寻优,这就成为梯度法的基本构想。
5)共轭梯度法
基本原理:
在梯度法的基础上,利用目标函数的共轭方向和一阶导数推算和重置负方向梯度,从而得到最优的搜索结果。
6)牛顿法
1原始牛顿法
基本原理:
原目标函数f(X)用在迭代点X(k)邻域展开的泰勒二次多项式ψ(X)去近似的代替,再以ψ(X)这个二次函数的极小点Xψ*作为原目标函数的下一个迭代点X(k+1),这样重复迭代若干次后,使迭代点点列逐步逼近原目标函数的极小点。
②阻尼牛顿法
基本原理:
在原始牛顿法的基础上,在搜索的的每一步选择最优因子进行下一步的搜索。
第2章阻尼牛顿法计算应用
2.1阻尼牛顿法的计算步骤
1)给定初始点
,收敛精度
,置
。
2)计算
、
、
和
3)求
,其中
为沿
进行一维搜索的最佳步长。
4)检查收敛精度。
若
,则
,停机;否则置
,返回步骤2,继续进行进行搜索。
2.2阻尼牛顿法的程序框图
图2-1阻尼牛顿法的程序框图
2.3实例解析
利用阻尼牛顿法求函数
的极小值点(迭代两次,一维搜索任选一种方法)。
解:
取初始值
,则初始点初的函数梯度,海塞矩阵及其逆矩阵分别是
把
代入
中得最佳步长
,求出
把
代入
中得最佳步长
,求出
2.4阻尼牛顿法的程序编程
程序如下:
//阻尼牛顿法.cpp:
Definestheentrypointfortheconsoleapplication.
#include
#include
#include
#include
doublefun1(doubleq1,doubleq2)
{
return(pow((q1-2),4)+pow((q1-2*q2),2)); //修改函数f(x1,x2)=(x1-2)*(x1-2)*(x1-2)*(x1-2)+(x1-2*x2)*(x1-2*x2)
}
doublefun2(doubleg,doublex,doubley,doubler1,doubler2)
{
return(pow((x+g*y-2),4)+pow((x+g*y-2*(r1+g*r2)),2));//关于阻尼因子的函数
}
voidmain()
{
doubleA[2][1],B[2][2],C[2][1],D[2][1],X[2][1];
doubleE[2][1]={4,3};//迭代的初始点x0
intt=0,i=0,j=0;
doubleE0,x1,x2,x3,h(0.1);
doubley1,y2,y3,m;
doublea,b,k=0.618,a1,a2,f1,f2;
printf("输入收敛精度:
");//输入标准收敛精度
std:
:
cin>>E0;
do
{
D[0][0]=E[0][0];
D[1][0]=E[1][0];
A[0][0]=4*(D[0][0]-2)*(D[0][0]-2)*(D[0][0]-2)+2*D[0][0]-4*D[1][0];
A[1][0]=-4*(D[0][0]-2*D[1][0]);//A[0][0],A[1][0]为原函数梯度的各项
B[0][0]=1.0/(12.0*(D[0][0]-2)*(D[0][0]-2));
B[0][1]=1.0/(24.0*(D[0][0]-2)*(D[0][0]-2));
B[1][0]=1.0/(24.0*(D[0][0]-2)*(D[0][0]-2));
B[1][1]=(6.0*(D[0][0]-2)*(D[0][0]-2)+1)/(48.0*(D[0][0]-2)*(D[0][0]-2));//B[0][0],B[0][1],B[1][0],B[1][1]分别代表原函数的海赛矩阵的逆阵的各项
C[0][0]=-(B[0][0]*A[0][0]+B[0][1]*A[1][0]);
C[1][0]=-(B[1][0]*A[0][0]+B[1][1]*A[1][0]);//C[0][0],C[1][0]为搜索方向dk的各项
//下面利用外推法寻找函数2的区间,找单谷区间
x1=0;
x2=x1+h;
y1=fun2(x1,D[0][0],C[0][0],D[1][0],C[1][0]);
y2=fun2(x2,D[0][0],C[0][0],D[1][0],C[1][0]);
if(y2>y1)
{
h=-h;
x3=x1,y3=y1;
x1=x2,y1=y2;
x2=x3,y2=y3;
}
x3=x2+h;
y3=fun2(x3,D[0][0],C[0][0],D[1][0],C[1][0]);
while(y3{
h=2*h;
x1=x2,y1=y2;
x2=x3,y2=y3;
x3=x2+h;
y3=fun2(x3,D[0][0],C[0][0],D[1][0],C[1][0]);
i++;
}
//下面利用黄金分割法寻找函数2极值
a=x1;
b=x3;
a1=b-k*(b-a);
a2=a+k*(b-a);
f1=fun2(a1,D[0][0],C[0][0],D[1][0],C[1][0]);
f2=fun2(a2,D[0][0],C[0][0],D[1][0],C[1][0]);
do
{
if(f1>=f2)
{
a=a1;
a1=a2;
f1=f2;
a2=a+k*(b-a);
f2=fun2(a2,D[0][0],C[0][0],D[1][0],C[1][0]);
}
else
{
b=a2;
a2=a1;
f2=f1;
a1=b-k*(b-a);
f1=fun2(a1,D[0][0],C[0][0],D[1][0],C[1][0]);
}
j++;
}while(fabs((b-a)/b)>=E0&&fabs((f2-f1)/f2)>=E0);
m=0.5*(a+b);//m为阻尼因子
E[0][0]=D[0][0]+m*C[0][0];
E[1][0]=D[1][0]+m*C[1][0];
printf("%d%15f10%15f10\n",t,E[0][0],E[1][0],fun1(E[0][0],E[1][0]));
t++;
}while(fabs(E[0][0]-D[0][0])>=E0&&fabs(E[1][0]-D[1][0])>=E0);
X[0][0]=E[0][0];
X[1][0]=E[1][0];
printf("迭代了%d次\n",t);
printf("极小点(x1,x2)=(%f10,%f10)\n",X[0][0],X[1][0]);
printf("极小值f(x1,x2)=%f10\n",fun1(X[0][0],X[1][0]));
}
该程序的运行结果,要求迭代两次后函数的极小值点在(1.94,0.97)处。
第3章总结
学习机械优化设计以前,总感觉企业的生产,人类日常生活中的劳动等都是一种简单的过程,总有一定的套路可循。
但自从接触了机械优化设计这门学科以后,让我认识到在人类的生产中,我们总是意向于得到我们最满意的效果,如加工零件怎样最省材料又不影响零件的加工,生产的最优安排,设计的最优方案等,看似很简单的问题,但其中却蕴藏着极大的智慧。
以前在参加数学建模比赛的时候接触到一定的优化设计。
一些实例如管材问题中怎样剧料最省材料且利润最大,就这一个问题细分下来积累的,让我们团队奋斗了三天三夜,经过这那次比赛,我们都意识到原来优化设计是这么切合实际,贴近我们的生活。
终于在即将毕业之际,我接触到了机械优化设计这么课程,系统的学习了优化设计的各种方法。
机械优化设计虽然只有从近代到现在短短几十年的发展历史,但是其体系的迅速完善我想是其他学科难以企及的。
如今,机械优化方法也是各类决策方法中普遍采用的一种方法,机械优化设计作为一种现代化的设计方法已经广泛的机械设计中,并取得了良好的经济效益。
在面对市场竞争日益激烈的大环境下,计算机处理技术日益改进,作为新产品的开发与改进环节中最重要的环节就在于如何大幅度的缩短产品的使用周期,如何提高新产品的设计质量,以及降低新产品的设计成本这些方面等对于企业缩减开发成本,更快的抢占同类产品的市场等具有决定性的作用。
上完这门课,我学到了很多优化设计的方法,收获了很多,这对将来我的工作、生活都有很大的帮助。
我一定会与时俱进,跟上学科发展的势头,把机械优化设计作为学习生活中研究与关注的对象,在平时的处事中长存优化的思想。