- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话: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;
double a,b,ax,ay,d;
for (;;) {for (j=0; jN; j++) xk[j]=x0[j];for (i=0; iN; i++) {for (j=0; jN; j++) if (j==i) sk[j]=1;else sk[j]=0;find_ab(0,1,a,b);search_gold(a,b,e2,ax,ay);for (j=0; jN; j++) xk[j]=xkk[j];}d=0;for (j=0; jN; j++)d+=(x0[j]-xkk[j])*(x0[j]-xkk[j]);
文档评论(0)