为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > 香蕉函数的各类最优解法

香蕉函数的各类最优解法

2019-06-16 10页 doc 40KB 66阅读

用户头像

is_729658

暂无简介

举报
香蕉函数的各类最优解法 %用牛顿法求香蕉函数minf=(x2-x1^2)^2+(x2-1)^2 X(:,1)=[2,2]'; eps=0.00001; k=1; l=0%迭代的次数 x1=X(1,1);x2=X(2,1); %f=(x2-x1^2)^2+(x2-1)^2 f_val(k)=(x2-x1^2)^2+(x2-1)^2; %求梯度和hesse矩阵 g(1,1)=-4*(x2-x1^2)*x1; g(2,1)=4*x2-2*x1^2-2; q=[12*x1^2-4*x2,-4*x1;-4*x1,4]; %梯度的模 ...
香蕉函数的各类最优解法
%用牛顿法求香蕉函数minf=(x2-x1^2)^2+(x2-1)^2 X(:,1)=[2,2]'; eps=0.00001; k=1; l=0%迭代的次数 x1=X(1,1);x2=X(2,1); %f=(x2-x1^2)^2+(x2-1)^2 f_val(k)=(x2-x1^2)^2+(x2-1)^2; %求梯度和hesse矩阵 g(1,1)=-4*(x2-x1^2)*x1; g(2,1)=4*x2-2*x1^2-2; q=[12*x1^2-4*x2,-4*x1;-4*x1,4]; %梯度的模 g_mo(k)=sqrt(g(1,1)^2+g(2,1)^2); while(g_mo(k)>eps) l=l+1; %确定搜索方向 p(:,k)=-inv(q)*g(:,k); %一维搜索 t=sym('t'); x1=X(1,k)+t*p(1,k); x2=X(2,k)+t*p(2,k); f=(x2-x1^2)^2+(x2-1)^2; s=diff(f,t); s1=finverse(s); t=subs(s1,'0',t); s1=0; X(:,k+1)=X(:,k)+t*p(:,k); x1=X(1,k+1);x2=X(2,k+1); f_val(k+1)=(x2-x1^2)^2+(x2-1)^2; g(1,1)=-4*(x2-x1^2)*x1; g(2,1)=4*x2-2*x1^2-2; g_mo(k+1)=sqrt(g(1,1)^2+g(2,1)^2); k=k+1; end X(:,k) l %用最速下降法求香蕉函数minf=(x2-x1^2)^2+(x2-1)^2 X(:,1)=[2,2]'; eps=0.00001; k=1; l=0; x1=X(1,1);x2=X(2,1); %f=(x2-x1^2)^2+(x2-1)^2 f_val(k)=(x2-x1^2)^2+(x2-1)^2; %求梯度和hesse矩阵 g(1,1)=-4*(x2-x1^2)*x1; g(2,1)=4*x2-2*x1^2-2; q=[12*x1^2-4*x2,-4*x1;-4*x1,4]; %梯度的模 g_mo=sqrt(g(1,1)^2+g(2,1)^2); while(g_mo>eps) %迭代 l=l+1; X(:,k+1)=X(:,k)-g'*g/(g'*q*g)*g x1=X(1,k+1);x2=X(2,k+1); f_val(k+1)=(x2-x1^2)^2+(x2-1)^2; g(1,1)=-4*(x2-x1^2)*x1; g(2,1)=4*x2-2*x1^2-2; g_mo=sqrt(g(1,1)^2+g(2,1)^2); k=k+1; end X(:,k) l %用DFP法求香蕉函数 minf(X)=(x2-x1^2)^2+(x2-1)^2 clear X(:,1)=[2,2]'; eps=0.00001; k=1; n=2; H=eye(2,2); x1=X(1,1);x2=X(2,1); %f(X)=(x2-x1^2)^2+(x2-1)^2 g(1,1)=-4*(x2-x1^2)*x1; g(2,1)=4*x2-2*x1^2-2; g_mo(k)=sqrt(g(1,1)^2+g(2,1)^2); if(g_mo(k) #include main() {floata,b,t,t1,t2,eps,f1,f2,beta; beta=0.618; printf("pleaseinputa,b,eps\n"); scanf("%f,%f,%f",&a,&b,&eps); t2=a+beta*(b-a); f2=t2*(t2+2); t1=a+b-t2; f1=t1*(t1+2); while(t2-t1>eps) {if(f1<=f2) { b=t2;t2=t1; f2=f1; t1=a+b-t2;f1=t1*(t1+2); } else { a=t1;t1=t2; f1=f2; t2=a+beta*(b-a); f2=t2*t2+2*t2; } } t=(t1+t2)/2.0; printf("f(x)=x*x+2*xminmumpointis:"); printf("%f\n",t); printf("f(x)minmumis:%f\n",t*t+2*t); getch(); }_ 二分法 #include #include main() {floata,b,c,fc,t,eps; printf("pleaseinputa,b,eps\n"); scanf("%f,%f,%f",&a,&b,&eps); while(b-a>eps) {c=(a+b)/2.0; fc=2*c+2; if(fc<0)a=c; elseif(fc>0)b=c; elseif(fc==0){t=c;break;} } if(fc!=0)t=(a+b)/2; printf("f(x)=x*x+2*x+1minmumpointis:"); printf("%f\n",t); getch(); }_     牛顿法 #include #include float f(float *x) { float fi; fi=60-10*x[0]-4*x[1]+pow(x[0],2)+pow(x[1],2)-x[0]*x[1]; return (fi); } newton(float *x,float e) { float H[2][2]={{2,-1},{-1,2}},H0[2][2]={{2.0/3.0,1.0/3.0},{1.0/3,2.0/3.0}}; float g0[2],b[2]={0,0},q; int i,j; g0[0]=2*x[0]-10-x[1]; g0[1]=2*x[1]-4-x[0]; printf("(%f\t%f)\t%f\t(%f\t%f)\n",x[0],x[1],f(x),g0[0],g0[1]); q=sqrt(pow(g0[0],2)+pow(g0[1],2)); if(q>e) { for(i=0;i<2;i++) for(j=0;j<2;j++) b[i]+=H0[i][j]*g0[j]; for(i=0;i<2;i++) x[i]=x[i]-b[i]; newton(x,e); } else printf("\nx*=(%f,%f)\t min f=%f\n",x[0],x[1],f(x)); } main() { float x[2]={2,2},e; printf("\nInput e\n"); scanf("%f",&e); printf("\n\tx[2]\t\t\t f(x)\t\t\t g\n"); newton(x,e); getch(); } _     抛物线法 #include #include float fine(float t) { float fi; fi=8*t*t*t-2*t*t-7*t+3; return (fi); } jixiao(float t1,float t2,float t0,float e) { float ti,a,b; a=(t0*t0-t2*t2)*fine(t1)+(t2*t2-t1*t1)*fine(t0)+(t1*t1-t0*t0)*fine(t2); b=(t0-t2)*fine(t1)+(t2-t1)*fine(t0)+(t1-t0)*fine(t2); ti=a/(2*b); printf("%f\t%f\t%f\t%f\n",t1,t2,t0,ti); if(fabs(ti-t0)>e) { if(tifine(t0)) t1=ti; else { t1=ti;t2=t0,t0=(t1+t2)/2;} } else if(ti>t0) { if(fine(ti)fine(t0)) t2=ti; else { t1=t0;t2=ti,t0=(t1+t2)/2;} } jixiao(t1,t2,t0,e); } else { ti=(ti+t0)/2; printf("\nt*=%f,min f=%f",ti,fine(ti)); } } main() { float t1=0,t2=2,t0,e; printf("\nInput e\n"); scanf("%f",&e); printf("\nInput t0 in [0,2]\n") ; scanf("%f",&t0); printf("t1\t\t t2\t\t t0\t\t ti\n"); jixiao(t1,t2,t0,e); getch(); } _     %minf(x)=x1^2+4*x2^2用变尺度法求解 x0=[1,1]'; Q=[2,0;0,8]; g=[2,8]'; g0=g.*x0; x1=x0-(g0'*g0)/(g0'*Q*g0)*g0; g1=g.*x1; h0=eye(2,2); g2=g1; eps=10^(-6); k=1; whileg2'*g2>eps s0=x1-x0; y0=g1-g0; h1=h0+(s0*s0')/(s0'*y0)-(h0*y0*y0'*h0')/(y0'*h0*y0); p1=-h1*g1; t=-(g(1)*x1(1)*p1(1)+g(2)*x1(2)*p1(2))/(g(1) *p1(1)^2+g(2)*p1(2)^2); x2=x1+t*p1; g2=g.*x2; k=k+1; end disp('函数f(x)=x1^2+4*x2^2最优解为:') x2 disp('函数最小值为:') x2(1)^2+4*x2(2)^2 fprintf('用变尺度算法(DFP算法)求解一共迭代%d次\n',k) %minf(x)=x1^2+25*x2^2用共轭梯度法求解 x0=[2,2]; eps=10^(-1); g0=[2,50]; p0=-g0.*x0; g1=g0; k=0; whileg1*g1'>eps t=-(g0(1)*x0(1)*p0(1)+g0(2) *x0(2)*p0(2))/(g0(1)*p0(1)^2+g0(2)*p0(2)^2); x0=x0+t*p0; g1=g0.*x0; t0=(g1*g1')/(p0*p0'); p0=-g1+t0*p0; k=k+1; end disp('函数最优解为:') x0 disp('函数最小值为:') x0(1)^2+25*x0(2)^2 fprintf('用共轭梯度法求解一共迭代%d次\n',k)     % 坐标轮换法求f(X)=x1^2+x2^2+x1*x2-10*x1-4*x2+60 n=2; x=[0,0]'; eps=0.1; e=eye(n); k=0; t=1; while(t>eps) t1=(10-2*x(1)+x(2))/2; x1=x+t1*e(:,1); t2=(x1(1)-2*x1(2)+4)/2; x2=x1+t2*e(:,2); t=(sum((x2-x1).^2))^(1/2); x=x2; k=k+1; end fprintf('用坐标轮换法解minf(X)=x1^2+x2^2+x1*x2-10*x1-4*x2+60,最优解为:') x disp('最优值为:') x(1)^2+x(2)^2+x(1)*x(2)-10*x(1)-4*x(2)+60 fprintf('一共迭代了%d次\n',k) 加步探索法 #include #include voidmain() {intt0=0,h=1,c=2,f1,f2,f3,t,t1,a,b; f1=t0*t0*t0-2*t0+1; t=t0+h; f2=t*t*t-2*t+1; while(f1>f2&&t>0){ h=c*h; t=t+h; f1=f2; f2=t*t*t-2*t+1; } printf("%d%d",h,t); h=-h; t=h+t; f3=t*t*t-2*t+1; while(f2>f3){//if(t<=0);break; h=c*h; t1=t; t=t+h; f1=f2; f2=t*t*t-2*t+1; } printf("\n"); if(t1>t){b=t1;a=t;} else{b=t;a=t1;} printf("[%d,%d]",a,b); getchar(); }    
/
本文档为【香蕉函数的各类最优解法】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索