版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1.1程序(Java)public class Wolfe_Powell public static double getFx ( double x ) double x1= x0; double x2 = x1; double Fx= 100 * (x2-x1*x1)* (x2-x1*x1) + (1-x1)* (1-x1) ; return Fx; public static double getDeltFx ( double x ) double x1= x0; double x2 = x1; double deltFx = new double2; deltFx 0 = -400*(x
2、2 - x1* x1) *x1- 2*(1- x1) ; deltFx 1 = 200*(x2- x1 * x1) ; return deltFx ; public static double getDeltFx_Sk ( double deltFx , double Sk ) double a = 0 ; for ( int i = 0 ; i < Sk.length ; i+ ) a = a + deltFx i * Sk i ; return a ; public static double getL ( double x, double s ) double x1= x0; do
3、uble x2 = x1; double c1 =0.1 , c2 =0.5 ,a =0 , b=1e8 ,L= 1; double Fx0 , Fx1 ,deltFx1_Sk ,deltFx0_Sk ,temp ,temp2; double deltFx0 , deltFx1 ; Fx0 = getFx(x) ; deltFx0 = getDeltFx (x) ; deltFx0_Sk = getDeltFx_Sk( deltFx0 , s) ; temp = c2 * getDeltFx_Sk( deltFx0 , s) ; for ( int i=0;i< 1e8 ; i+) te
4、mp2 = -c1 * L * deltFx0_Sk ; x0 = x1 + L *s0 ; x1 = x2 + L *s1 ; Fx1 = getFx(x) ; deltFx1 = getDeltFx (x) ; deltFx1_Sk = getDeltFx_Sk (deltFx1 , s) ; if( (Fx0 - Fx1 ) >= temp2 && deltFx1_Sk >= temp) break ; else if( (Fx0 - Fx1 ) < temp2 ) b = L ; L = (L +a) /2 ; else if ( deltFx1_Sk
5、 < temp ) a = L ; L = ( L + b ) / 2 >= 2*L ? (2*L):( L + b ) / 2; System.out.println(" L= " + L); System.out.println(" 计算次数 " + i ); return L ; public static void main(String args) Wolfe_Powell temp =new Wolfe_Powell(); double X = -1 ,1 ; double sk = 1 ,1 ; temp.getL( X ,sk
6、) ; 1.2实验结果步长L = 0.00390625x =-0.9992 , 1.0324 计算次数 8 2.1程序(Java)public class GongE public static double getFx ( double x ) double x1= x0; double x2 = x1;double Fx= x1*x1 - 2*x1*x2 + 2*x2*x2 +x3*x3 - x2*x3 +2 * x1 +3*x2 -x3 ; return Fx; public static double getDeltFx ( double x ) double x1= x0; doub
7、le x2 = x1; double deltFx = new doublex.length;deltFx 0 = 2*x1 - 2*x2+2 ;deltFx 1 = -2*x1 +4*x2 - x3 +3;deltFx 2 = 2*x3 -x2 -1 ; return deltFx ; public static double getX ( double x ) double g0,g1; double s0= new doublex.length; double s1=new doublex.length; double g0_L,g1_L ,L ,temp; double x0 =x ;
8、 int k =0 ; g0 = getDeltFx ( x0 ) ; for ( int j = 0 ; j < x.length ; j+ ) s0 j = -g0 j ; for (int i = 0 ;i<2; i +,k+) g0 = getDeltFx ( x0 ) ; g0_L = getDeltFx_Sk ( s0 , s0 ) ; L =getL(x0,s0); / 例题一中的方法取得步长L for(int j=0;j<x.length ; j+) x0j= x0j+ s0j*L ; g1 = getDeltFx(x0) ; g1_L = getDeltFx
9、_Sk ( g1 , g1 ); if ( Math.sqrt( g1_L )<= 1e-2 ) break ; else temp = g1_L/ g0_L ; for(int j=0;j<x.length ; j+) s0j = -g1j + temp * s0j; return x0; public static void main(String args) GongE temp =new GongE(); double x = 1,1 ; double result = temp.getX(x) ; for ( int i = 0 ; i < x.length ; i
10、+ ) System.out.println ( "result" + i + "=" + result i ) ; 2.2实验结果最优点 x*=-4,-3,-1 最优解 f*=-8 3.1公用程序(Java) public static double getFx ( double x ) /取得Fx 值 double x1= x0; double x2 = x1;double Fx = x1 + 2 * x2 * x2 + Math.exp ( x1 * x1 + x2 * x2 ) ; return Fx ; public static double
11、 getDeltFx ( double x ) /取得Fx 的梯度值 double x1= x0; double x2 = x1; double deltFx = new double 2 ;deltFx 0 = 1 + 2 * x1 * Math.exp ( x1 * x1 + x2 * x2 ) ; deltFx 1 = 4 * x2 + 2 * x2 * Math.exp ( x1 * x1 + x2 * x2 ) ; return deltFx ; 3.2.1最速下降法程序(Java)public class FastWay public static double getX ( do
12、uble x ) double deltF0 = new double2; double L =0; for ( int i = 0 ; i < 1e1 ; i+ ) deltF0 = getDeltFx(x); for(int j=0 ;j <deltF0.length ;j+) /取得负梯度 deltF0j = - deltF0j; L = getL ( x , deltF0 ) ; / 调用习题1的不精确搜索取得步长L if ( Math.sqrt ( getDeltFx_Sk ( deltF0 , deltF0 ) ) <= 1e-3 ) System.out.pri
13、ntln ( "最终计算次数 " + i ) ; System.out.println("x1=" + x0+" x2=" + x1); break ; x0 = x0+ L * deltF0 0 ; x1= x1+ L * deltF0 1 ; return x; public static void main ( String args ) FastWay temp = new FastWay () ; double x0 = 2 , 2 ; temp.getX(x0) ; 3.2.2最速下降法结果 最优点X*=-0.4194 0
14、 最优解f*=0.7729 计算次数count=103.3.1牛顿法程序(Java) public static double getDeltFx ( double x ) double x1 = x 0 ; double x2 = x 1 ; double one = new double 2 ; double exp =Math.exp( Math.pow(x1,2)+Math.pow(x2,2) ; one 0 = 1+ 2*x1*exp ; one 1 = 4* x2 +2*x2*exp ; double two = new double22 ; two00 = 2*exp *(1+2
15、*Math.pow(x1,2) ; two11 = 2*exp *(1+2*Math.pow(x2,2) +4 ; double deltFx = new double 2 ; for (int i = 0 ; i < 2 ; i+ ) deltFx0 = one 0 /two00 ; deltFx1 = one 1 /two11 ; return deltFx; public static void main ( String args ) double x = 1 , 0 ; double DeltFx = new double 2 ; for(int i =0 ;i <1e3
16、;i+) DeltFx = getDeltFx(x); x0 = x0- DeltFx0; x1 = x1- DeltFx1; if( Math.sqrt( getDeltFx_Sk(DeltFx,DeltFx ) ) <= 1e-4) System.out.println("计算次数为 " + i); break ; System.out.println(" x1= " +x0 +" x2= " + x1 +"n") ; System.out.println(" Fx= " +getFx
17、(x) ; 3.3.2牛顿法结果 最优点X*= -0.4194 , 0 最优解f*= 0.7729 计算次数count=53.4.1 BFGS法程序(matlab)function x,val,k = bfgs(fun,gfun,x0)maxk=1000; sigma=0.4; rho=0.55 ; epsion=1e-5;k=0 ; n =length(x0);Bk=eye(n); %Bk=feval('Hess',x0);while (k<maxk) gk=feval(gfun,x0); if(norm(gk)<epsion),break;end; dk=-Bk
18、gk; m=0;mk=0; while(m<20) newf=feval(fun,x0+rhom*dk) oldf=feval(fun,x0) if(newf<oldf+sigma*rhom*gk'*dk) mk=m;break; end m=m+1; end x=x0+rhomk*dk; sk=x-x0; yk=feval(gfun,x)-gk; if(yk'*sk>0) Bk=Bk-(Bk*sk*sk'*Bk)/(sk'*Bk*sk)+(yk*yk')/(yk'*sk); end; k=k+1; x0=x;endval=fe
19、val(fun,x0);3.4.2 BFGS法结果 最优点X*=-0.4194 0 最优解f*=0.7729 计算次数count=44.1 有效集法(matlab)4.1.1 主程序functionx , Lagrange , exitflag , output= TwoProg (H,c,Ae,be,Ai,bi,x0)n=length(x0); x=x0; ni=length(bi); ne=length(be); Lagrange =zeros(ne+ni,1); index=ones(ni,1);for(i=1:ni) if(Ai(i,:)*x>bi(i)+1e-9),index(
20、i)=0;endend%算法主程序k=0;while(k<=1e4) %求解子问题 Temp=; if(ne>0),Temp=Ae ; end for(j=1:ni) if(index(j)>0),Temp=Temp;Ai(j,:);end end gk=H*x+c; m1,n1=size(Temp); dk,Lagrange =SubPro (H,gk , Temp,zeros(m1,1); if(norm(dk)<= 1.0e-6) y=0.0; if(length(Lagrange )>ne) y,jk=min(Lagrange (ne+1:length(L
21、agrange ); end if(y>=0) exitflag=0; else exitflag=1; for(i=1:ni) if(index(i)&(ne+sum(index(1:i)=jk) index(i)=0;break; end end end k=k+1; else exitflag=1; %求步长 alpha=1.0;tm=1.0; for(i=1:ni) if(index(i)=0)&(Ai(i,:)*dk<0) tm1=(bi(i)-Ai(i,:)*x)/(Ai(i,:)*dk); if(tm1<tm) tm=tm1;ti=i; end
22、end end alpha=min(alpha,tm); x=x+alpha*dk; if(tm<1),index(ti)=1;endendif(exitflag=0),break;endk=k+1;endoutput.fval=0.5*x'*H*x+c'*x;output.iter=k;4.1.2 目标函数function f=fun(x)x1=x(1); x2=x(2); f=eval ('x1+2*x22+exp(x12+x22)'); 4.1.3 子问题函数functionx, Lagrange = SubPro (H ,c, Ae, be)m,n
23、=size(Ae);ginvH=pinv(H);if(m>0) rb=Ae*ginvH*c+be; Lagrange =pinv(Ae*ginvH*Ae')*rb; x=ginvH*(Ae'*Lagrange -c);else x=-ginvH*c; Lagrange =0;end4.1.4 运行函数H=2 -2;-2 4;c=-2 -6'Ae= ;be= ;Ai=1 -2;-0.5 -0.5;1 0;0 1;bi=-2 -1 0 0'x0=0 1 'x,lambda,exitflag,output=qpact(H,c,Ae,be,Ai,bi,x0
24、)4.2 有效集法结果 内部点 初始点x0=0 0 最优点X*=0.8 1.2 最优解f*=-7.2 迭代次数=10 边界点 初始点x0=1 1 最优点X*=0.8 1.2 最优解f*=-7.2 迭代次数=2 检验点 初始点x0=0 1 最优点X*=0.8 1.2 最优解f*=-7.2 迭代次数=75.1 乘子法程序(matlab)5.1.1 chengZi程序-乘子法主程序functionx,mu,Lagrange ,output=chengZi(fun,hf,gf,dfun,dhf,dgf,x0)sigma=2.0;count=0;innerCount=0; eta=2.0;=0.8;%P
25、HR算法中的实参数 x=x0;he=feval(hf,x);gi=feval(gf,x);n=length(x);l=length(he);m=length(gi);%选取乘子向量的初始值mu=0.1*ones(l,1);Lagrange =0.1*ones(m,1);btak=10;btaold=10;%用来检验终止条件的两个值while(btak>1e-6&count<1e3 ) %调用BFGS算法程序求解无约束子问题 x,ival,ik=bfgs('Lagr','LagrTiDu',x0,fun,hf,gf,dfun,dhf,dgf,m
26、u,Lagrange ,sigma); innerCount=innerCount+ik; he=feval(hf,x);gi=feval(gf,x); btak=0.0; for(i=1:l),btak=btak+he(i)2; end for(i=1:m) temp=min(gi(i),Lagrange (i)/sigma); btak=btak+temp2; end btak=sqrt(btak); if btak>1e-6 if(count>=2&btak>*btaold) sigma=eta*sigma; end %更新乘子向量 for(i=1:l),mu(
27、i)=mu(i)-sigma*he(i);end for(i=1:m) Lagrange (i)=max(0.0,Lagrange (i)-sigma*gi(i); end end count=count+1; btaold=btak; x0=x;endf=feval(fun,x)output.inner_iter=innerCount;output.iter=count;output.bta=btak;output.fval=f;5.1.2 f1程序-目标函数function f=f1(x)f=4*x(1)-x(2)2-12;5.1.3 h1程序-等式约束function he=h1(x)he=25-x(1)2-x(2)2;5.1.4 g1程序-不等式约束function gi=g1(x)gi=10*x(1)-x(1)2+10*x(2)-x(2)2-34;5.1.5 df1程序-目标函数的梯度文件function g=df1(x)g=4 ,-2.0*x(2)'5.1.6 dhe程序-等式约束(向量)函数的Jacobi矩阵(转置)funct
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届四川省绵阳市三台中学英语高三第一学期期末学业质量监测模拟试题含解析
- 2025至2030中国特色农产品电商供应链优化分析报告
- 2025-2030中国建筑幕墙市场未来建设规模及企业经营状况分析研究报告
- 2025-2030无人飞行器制造行业市场现状容量分析技术创新投资评估发展路径报告
- 2025-2030无人机航拍行业市场需求现状分析及技术发展规划研究
- 2025-2030无人机物流行业市场现状分析投资评估规划发展研究报告
- 2025-2030新能源电动汽车行业发展趋势与投资机会分析研究报告
- 辣椒高效栽培技术指导方案
- 2026年英德市国防教育训练中心面向社会公开招聘1名专职民兵教练员备考题库及参考答案详解一套
- 2026年事业单位考试公共基础知识历年真题试题及答案
- 外贸跟单基础知识培训课件
- (高清版)DBJ∕T 13-278-2025 《福建省电动汽车充电基础设施建设技术标准》
- 2025年高一数学必修一数学竞赛模拟题
- QGDW11970.7-2023输变电工程水土保持技术规程第7部分水土保持设施质量检验及评定
- 2025至2030年中国止鼾器行业市场现状调查及前景战略研判报告
- 人教版信息科技五年级全一册 第26课 寻找最短的路径 课件
- 人民军队性质宗旨教育
- T-CEPPEA 5002-2019 电力建设项目工程总承包管理规范
- 护士长管理培训课件
- 暂缓行政拘留申请书
- TSG 21-2015《固定式压力容器安全技术监察规程》
评论
0/150
提交评论