- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
机械优化设实验指导书
实验一 一维搜索方法
本实验求函数 f(x)=(x-3)2 以及f(x)=-(x-3)2的搜索区间[a, b]。并用黄金分割法和插值法分别求最优解。
进退法:
#include math.h
#include stdio.h
/* 函数 f(x)=(x-3)2 */
double f(double x)
{
return (x-3)*(x-3);
}
/* 求搜索区间[a,b]的函数, x0---初始点; h0---初始步长 */
void find_ab(double x0,double h0,double *a,double *b)
{
double h,x1,y1,x2,y2,x3,y3;
h=h0;
x1=x0; y1=f(x1);
x2=x1+h; y2=f(x2);
if (y2=y1)
{
*****
******
}
for (;;)
{
h*=2.0; x3=x2+h; y3=f(x3);
if (y2y3) break;
**********
}
if (h0) {******}
else {******}
}
/*
黄金分割法
a,b---搜索区间[a,b]; e---精度
x,y---最优解X*,F*
*/
void search_gold(double a,double b,double e, double *x,double *y)
{
double x1,x2,y1,y2;
x1=******; y1=f(x1);
x2=******; y2=f(x2);
do {
if (y1y2) {
******
} else {
******
}
} while (b-ae);
*****
}
/*
二次插值法
a,b---搜索区间[a,b]; e---精度
xpt,ypt---最优解X*,F*
*/
void search_insert(double a, double b, double e, double *xpt, double *fpt)
{
double x1,x2,f1,f2,x3,f3,xp,fp,xp0,c1,c2;
int k=1;
x1=a; x3=b; x2=0.5*(a+b);
f1=f(x1); f2=f(x2); f3=f(x3); xp0=0;
for (;;) {
c1=(f3-f1)/(x3-x1);
c2=((f2-f1)/(x2-x1)-c1)/(x2-x3);
if (c2==0.0) {******, break;}
xp=0.5*(x1+x3-c1/c2); fp=f(xp);
if ((xp-x1)*(x3-xp)=0.0) {
*******
break;
}
if (k!=1) if (fabs(xp0-xp)=e) {
*********
break;
}
if (xpx2) if (f2fp) {
******
} else {
********
} else if (f2fp) {
x1=xp; f1=fp;
} else {
*********
}
xp0=xp; k++;
}
}
实验二 无约束优化方法---鲍威尔方法
本实验用鲍威尔方法求函数 f(x)=(x1-5)2+(x2-6)2 的最优解。
#include math.h
#include stdio.h
#include stdlib.h
const MAXN = 10;
double xkk[MAXN],xk[MAXN],sk[MAXN];
int N;
double F(double *x)
{
return 4*pow(x[0]-5,2.0)+pow(x[1]-6,2.0);
}
double f(double x)
{
for (int i=0; iN; i++) xkk[i]=xk[i]+x*sk[i];
return F(xkk);
}
/*
无约束坐标轮换法
x0--初始点
e1--一维搜索精度
e2--求解精度
*/
double nc_trans(double *x0,double e1,double e2)
{
int i,j,k=1;
doub
文档评论(0)