外点罚函数法
x0[i]=0.0; return; } /*目标函数*/ double hanshu1(double x[]) { double f; f=x[0]*x[0]+x[1]*x[1]; return f; } /*不等式约束方程*/ void strain(double x[],double g[],double h[]) { double eb; eb=EPSIN; g[0]=x[0]-1.0-eb*10.0; // g[1]=1.0-(x[0]+x[1])-eb*10.0; h[0]=0.0; return; } /***********以上为修改部分***********/ /*惩罚函数*/ double hanshu(double x[]) { int i; double f,f1,g[NG],h[NH]; f=hanshu1(x); strain(x,g,h); f1=0.0; for(i=0;i<NG;i++) if(g[i]<0.0) f1+=g[i]*g[i]; for(i=0;i<NH;i++) f1+=h[i]*h[i]; f+=mr*f1; return f; } /*计算 f(xk+as)*/ double xkadd(double x[],double d[],double a) { int i; double x1[N]; for(i=0;i<N;i++) x1[i]=x[i]+a*d[i]; return hanshu(x1); /*至少有一个为 0 的等式约束*/
迭代轮数
k= x(
9 9)=[ 1.0000100, 0.000000346 -0.0000011], f( 9)= 1.0000200
迭代精度:
********************* 外点惩罚函数法优化最优点及目标函数值为: x( *)=[ 1.0000100, 0.000000346 -0.0000011], f( *)= 1.0000200
迭代精度:
迭代轮数
k= x(
7 7)=[ 1.0000090, 0.000009112 0.0000006], f( 7)= 1.0000190
迭代精度:
迭代轮数
k= x(
8 8)=[ 1.0000099, 0.000001643 -0.0000007], f( 8)= 1.0000199
迭代精度:
机械优化设计
日 期 成绩评定
机测 2 班 陈明鑫
实验室
机械馆机房
老师签名
利用外点罚函数法求解相关函数的极小值点
实 验 原 理 步 骤 、
外点罚函数法计算结果 **********外点惩罚函数法计算结果**********
**********无约束优化方法:鲍威尔法********** ++++++一维搜索方法:黄金分割法++++++
迭代精度:
k= x(
2 2)=[ 0.9090993, 0.409094982 -0.0000014], f( 2)= 0.9091091
迭代精度:
k= x(
3 3)=[ 0.9901088, 0.081009509 0.0000007], f( 3)= 0.9901188
迭代精度:
迭代轮数
k= x(
else { b=a2; a2=a1; f2=f1; a1=b-0.618*(b-a); f1=xkadd(x,d,a1); } }while(b-a>ebsin); for(i=0;i<N;i++) x[i]+=(b+a)*d[i]/2; return; } /*二次插值法*/ int rccz(double x[],double d[],double h,double ebsin) { double a1,a2,a3,a4,f1,f2,f3,f4,c1,c2,ab[2]; int i,p=0,k=0; csssqj(x,d,h,ab); a1=ab[0]; a3=ab[1]; a2=(a1+a3)/2; f1=xkadd(x,d,a1); f2=xkadd(x,d,a2); f3=xkadd(x,d,a3); while(1) { c1=(f3-f1)/(a3-a1); c2=((f2-f1)/(a2-a1)-c1)/(a2-a3); if(0==c2) { p=1; break; } a4=0.5*(a1+a3-c1/c2); if((a4-a1)*(a3-a4)<=0.0) { p=2; break; } f4=xkadd(x,d,a4); if(1==k&&fabs(a4-a2)<=ebsin) break; if(a4<a2) {
**********外点惩罚函数法计算结果********** **********无约束优化方法:鲍威尔法********** ++++++一维搜索方法:黄金分割法++++++ **********初始惩罚因子:r0= 1.00********** ********** 初始坐标: x( 0)=[ 2.0000000, 2.0000000], f( 0)= 18.0000000 递增系数:c0=10.00**********
迭代精度: 迭代轮数 k= 10 x( 10)=[ 迭代精度: *********************
0.8228757, 0.000000011
0.9114378],
f( 10)=
1.3934650
外点惩罚函数法优化最优点及目标函数值为: x( *)=[ 0.8228757, 0.000000011 0.9114378], f( *)= 1.3934650 迭代精度:
4 4)=[ 0.9990110, 0.008902129 -0.0000008], f( 4)= 0.9990210
迭代精度:
迭代轮数
k= x(
5 5)=[ 0.9999100, 0.000899031 0.0000007], f( 5)= 0.9999200
迭代精度:
迭代轮数
k= x(
6 6)=[ 1.0000000, 0.000090004 -0.0000008], f( 6)= 1.0000100
太原理工大学机械学院机测系课程上机实验报告
课 程 名 称:
班级 姓名 实验 名称 所用 软件 实验目的: 实 验 目 的 及 内 容 1.掌握并能够建立最优化基本类型本方法,奠定最优化的理论基础。 3.能够熟练编制和调试最优化方法的程序,奠定解决实际中的优化问题的基础 实验内容: 理解外点罚函数法并编写相关程序求其极小值点。
min f ( x) ( x1 2) 2 ( x 2 1) 2 2 1 0 0.25 x12 x 2 s . t . x [2, 2]T x1 2 x 2 1 0 内点 : ,其初始迭代点为 0 ,中止误
差 1e 5
算法程序实现
//*鲍威尔法*/ #include <string.h> #include <stdio.h> #include <math.h> #include <stdlib.h> #include <time.h> #define N 2 #define EPSIN 0.000001 #define H_QJ 1.0 #define Y_F 1 #define MC 10.0 #define NG 1 #define NH 1 FILE *fp; double mr=1.0; /*给出初始点坐标*/ void csd_x(double x0[]) { int i; for(i=0;i<N;i++) /*初始点为坐标原点的情况*/ /*外点惩罚因子*/ /*计算结果输出文件*/ char outname[50]="外点惩罚函数法计算结果.txt"; /*优化设计维数*/ /*迭代精度*/ /*初始区间搜索步长*/ /*一维搜索方法选择:1——黄金分割法*/ /* /*惩罚因子递增系数*/ /*不等式约束个数*/ /*等式约束个数*/ 2——二次插值法*/
} /*输出选定的一维迭代方法*/ void ywddf(int yw) { switch(yw) { case 1: fprintf(fp,"++++++一维搜索方法:黄金分割法++++++\n\n"); break; case 2: fprintf(fp,"++++++一维搜索方法:二次插值法++++++\n\n"); break; } return; } /*输出当前迭代点坐标及目标函数值*/ double xfout(double x[],int m) { int j; double f; f=hanshu(x); fprintf(fp," for(j=0;j<N-1;j++) fprintf(fp,"%15.7lf,",x[j]); fprintf(fp,"%15.7lf], return f; } /*初始搜索区间的确定*/ void csssqj(double x[],double d[],double h,double ab[]) { double a1,a2,a3,f1,f2,f3; a2=0.0; a3=a2+h; f2=xkadd(x,d,a2); f3=xkadd(x,d,a3); if(f3>f2) { a2=a3; a3=0.0; f1=f2; f2=f3; f3=f1; h=-h; } f(%3d)=%15.7lf\n",x[N-1],m,f); x(%3d)=[",m);