复制
收藏
提问
全网

方法一%5.1第一种方法0.618 %先用进退法确定函数值极小值点所在区间 %给初始条件 syms a1 a2 a3 h f1 f2 f3 X Y section sign k;%所需变量,section为单峰区间 Y=exp(-X)+X^2;%所求单峰区间对应的函数 sign=1; a1=0;h=1;%初始点及初始步长 a2=a1+h; f1=double(subs(Y,X,a1));f2=double(subs(Y,X,a2));%计算f1、f2 if(f1 >= f2)%开始分情况讨论 h=2*h;%假如条件:f1 >= f2成立,则极值点在a2右边,做前进运算,步长加倍 a3=a2+h;%生成a3 f3=double(subs(Y,X,a3));%计算f3 while(sign==1) if(f2 >= f3)%假如条件:f2 >= f3成立,则极值点在a3右边,做前进运算,步长加倍 a1=a2;%将a2的值赋予原来的a1 a2=a3;%以a3替换赋予原来的a2 f1=f2;%以f2替换原来的f1 f2=f3;%以f3替换原来的f2 h=2*h; a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 else section=[a1 a3]; sign=0; end end else%假如条件:f1 >= f2不成立,则极值点在a1左边,做后退运算 h=(-1)*h;%极值点在a1左边,做后退运算 k=a1+a2; a1=k-a1;%对调a1、a2 a2=k-a2;%对调a1、a2 k=f1+f2; f1=k-f1;%对调f1、f2 f2=k-f2;%对调f1、f2 a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 while(sign==1) if(f3 <= f2)%假如条件:f3 <= f2成立,则极值点在a3左边,做后退运算 a1=a2;%舍弃原来a1,将a2的值赋予原来的a1 a2=a3;%舍弃原来a2,以a3替换原来的a2 f1=f2;%舍弃原来f1,以f2替换原来的f1 f2=f3;%舍弃原来f2,以f3替换原来的f2 h=2*h;%步长加倍 a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 else section=[a3 a1];%单峰区间 sign=0; end end end %然后用0.618法确定极小值点和极小值 %输入:phi是目标函数,a,b是搜索区间的两个端点 %delta,epsilon分别是自变量和函数值的容许误差 %输出:S,phis分别是近似极小点和极小值,G是nx4矩阵 %其第上行分别是a,p,q,b的第k次迭代值[ak,pk,qk,bk] %E=[ds,dphi],分别是s和phis的误差限 a=a3; b=a1;%区间[a,b]=[a3,a1] e=10^-3;%给出判定迭代停止条件 phi=@(s)exp(-s)+s^2;delta=0.05;epsilon=0.05; t=(sqrt(5)-1)/2; h=b-a; phia=feval(phi,a); phib=feval(phi,b); p=a+(1-t)*h; q=a+t*h; phip=feval(phi,p); phiq=feval(phi,q); k=1; G(k,:)=[a,p,q,b]; while (abs(phib-phia)>epsilon)|(h>delta) if (phip<phiq) b=q; phib=phiq; q=p; phiq=phip; h=b-a; p=a+(1-t)*h; phip=feval(phi,p); else a=p; phia=phip; p=q; phip=phiq; h=b-a; q=a+t*h; phiq=feval(phi,q); end k=k+1; G(k,:)=[a,p,q,b]; end ds=abs(b-a); dphi=abs(phib-phia); if (phip<=phiq) s=p; phis=phip; else s=q; phis=phiq; end E=[ds,dphi] 方法二%5.1第二种方法抛物线法 %先用进退法确定函数值极小值点所在区间 %给初始条件 syms a1 a2 a3 h f1 f2 f3 X Y section sign k;%所需变量,section为单峰区间 Y=exp(-X)+X^2;%所求单峰区间对应的函数 sign=1; a1=0;h=1;%初始点及初始步长 a2=a1+h; f1=double(subs(Y,X,a1));f2=double(subs(Y,X,a2));%计算f1、f2 if(f1 >= f2)%开始分情况讨论 h=2*h;%假如条件:f1 >= f2成立,则极值点在a2右边,做前进运算,步长加倍 a3=a2+h;%生成a3 f3=double(subs(Y,X,a3));%计算f3 while(sign==1) if(f2 >= f3)%假如条件:f2 >= f3成立,则极值点在a3右边,做前进运算,步长加倍 a1=a2;%将a2的值赋予原来的a1 a2=a3;%以a3替换赋予原来的a2 f1=f2;%以f2替换原来的f1 f2=f3;%以f3替换原来的f2 h=2*h; a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 else section=[a1 a3]; sign=0; end end else%假如条件:f1 >= f2不成立,则极值点在a1左边,做后退运算 h=(-1)*h;%极值点在a1左边,做后退运算 k=a1+a2; a1=k-a1;%对调a1、a2 a2=k-a2;%对调a1、a2 k=f1+f2; f1=k-f1;%对调f1、f2 f2=k-f2;%对调f1、f2 a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 while(sign==1) if(f3 <= f2)%假如条件:f3 <= f2成立,则极值点在a3左边,做后退运算 a1=a2;%舍弃原来a1,将a2的值赋予原来的a1 a2=a3;%舍弃原来a2,以a3替换原来的a2 f1=f2;%舍弃原来f1,以f2替换原来的f1 f2=f3;%舍弃原来f2,以f3替换原来的f2 h=2*h;%步长加倍 a3=a2+h;%重新生成a3 f3=double(su

纯真美学家
1个月前
全网
文档
学术
百科
知识库
时间不限
自动

理解问题方法一%5.1第一种方法0.618 %先用进退法确定函数值极小值点所在区间 %给初始条件 syms a1 a2 a3 h f1 f2 f3 X Y section sign k;%所需变量,section为单峰区间 Y=exp(-X)+X^2;%所求单峰区间对应的函数 sign=1; a1=0;h=1;%初始点及初始步长 a2=a1+h; f1=double(subs(Y,X,a1));f2=double(subs(Y,X,a2));%计算f1、f2 if(f1 >= f2)%开始分情况讨论 h=2*h;%假如条件:f1 >= f2成立,则极值点在a2右边,做前进运算,步长加倍 a3=a2+h;%生成a3 f3=double(subs(Y,X,a3));%计算f3 while(sign==1) if(f2 >= f3)%假如条件:f2 >= f3成立,则极值点在a3右边,做前进运算,步长加倍 a1=a2;%将a2的值赋予原来的a1 a2=a3;%以a3替换赋予原来的a2 f1=f2;%以f2替换原来的f1 f2=f3;%以f3替换原来的f2 h=2*h; a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 else section=[a1 a3]; sign=0; end end else%假如条件:f1 >= f2不成立,则极值点在a1左边,做后退运算 h=(-1)*h;%极值点在a1左边,做后退运算 k=a1+a2; a1=k-a1;%对调a1、a2 a2=k-a2;%对调a1、a2 k=f1+f2; f1=k-f1;%对调f1、f2 f2=k-f2;%对调f1、f2 a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 while(sign==1) if(f3 <= f2)%假如条件:f3 <= f2成立,则极值点在a3左边,做后退运算 a1=a2;%舍弃原来a1,将a2的值赋予原来的a1 a2=a3;%舍弃原来a2,以a3替换原来的a2 f1=f2;%舍弃原来f1,以f2替换原来的f1 f2=f3;%舍弃原来f2,以f3替换原来的f2 h=2*h;%步长加倍 a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 else section=[a3 a1];%单峰区间 sign=0; end end end %然后用0.618法确定极小值点和极小值 %输入:phi是目标函数,a,b是搜索区间的两个端点 %delta,epsilon分别是自变量和函数值的容许误差 %输出:S,phis分别是近似极小点和极小值,G是nx4矩阵 %其第上行分别是a,p,q,b的第k次迭代值[ak,pk,qk,bk] %E=[ds,dphi],分别是s和phis的误差限 a=a3; b=a1;%区间[a,b]=[a3,a1] e=10^-3;%给出判定迭代停止条件 phi=@(s)exp(-s)+s^2;delta=0.05;epsilon=0.05; t=(sqrt(5)-1)/2; h=b-a; phia=feval(phi,a); phib=feval(phi,b); p=a+(1-t)*h; q=a+t*h; phip=feval(phi,p); phiq=feval(phi,q); k=1; G(k,:)=[a,p,q,b]; while (abs(phib-phia)>epsilon)|(h>delta) if (phip<phiq) b=q; phib=phiq; q=p; phiq=phip; h=b-a; p=a+(1-t)*h; phip=feval(phi,p); else a=p; phia=phip; p=q; phip=phiq; h=b-a; q=a+t*h; phiq=feval(phi,q); end k=k+1; G(k,:)=[a,p,q,b]; end ds=abs(b-a); dphi=abs(phib-phia); if (phip<=phiq) s=p; phis=phip; else s=q; phis=phiq; end E=[ds,dphi] 方法二%5.1第二种方法抛物线法 %先用进退法确定函数值极小值点所在区间 %给初始条件 syms a1 a2 a3 h f1 f2 f3 X Y section sign k;%所需变量,section为单峰区间 Y=exp(-X)+X^2;%所求单峰区间对应的函数 sign=1; a1=0;h=1;%初始点及初始步长 a2=a1+h; f1=double(subs(Y,X,a1));f2=double(subs(Y,X,a2));%计算f1、f2 if(f1 >= f2)%开始分情况讨论 h=2*h;%假如条件:f1 >= f2成立,则极值点在a2右边,做前进运算,步长加倍 a3=a2+h;%生成a3 f3=double(subs(Y,X,a3));%计算f3 while(sign==1) if(f2 >= f3)%假如条件:f2 >= f3成立,则极值点在a3右边,做前进运算,步长加倍 a1=a2;%将a2的值赋予原来的a1 a2=a3;%以a3替换赋予原来的a2 f1=f2;%以f2替换原来的f1 f2=f3;%以f3替换原来的f2 h=2*h; a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 else section=[a1 a3]; sign=0; end end else%假如条件:f1 >= f2不成立,则极值点在a1左边,做后退运算 h=(-1)*h;%极值点在a1左边,做后退运算 k=a1+a2; a1=k-a1;%对调a1、a2 a2=k-a2;%对调a1、a2 k=f1+f2; f1=k-f1;%对调f1、f2 f2=k-f2;%对调f1、f2 a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 while(sign==1) if(f3 <= f2)%假如条件:f3 <= f2成立,则极值点在a3左边,做后退运算 a1=a2;%舍弃原来a1,将a2的值赋予原来的a1 a2=a3;%舍弃原来a2,以a3替换原来的a2 f1=f2;%舍弃原来f1,以f2替换原来的f1 f2=f3;%舍弃原来f2,以f3替换原来的f2 h=2*h;%步长加倍 a3=a2+h;%重新生成a3 f3=double(su

已完成理解方法一%5.1第一种方法0.618 %先用进退法确定函数值极小值点所在区间 %给初始条件 syms a1 a2 a3 h f1 f2 f3 X Y section sign k;%所需变量,section为单峰区间 Y=exp(-X)+X^2;%所求单峰区间对应的函数 sign=1; a1=0;h=1;%初始点及初始步长 a2=a1+h; f1=double(subs(Y,X,a1));f2=double(subs(Y,X,a2));%计算f1、f2 if(f1 >= f2)%开始分情况讨论 h=2*h;%假如条件:f1 >= f2成立,则极值点在a2右边,做前进运算,步长加倍 a3=a2+h;%生成a3 f3=double(subs(Y,X,a3));%计算f3 while(sign==1) if(f2 >= f3)%假如条件:f2 >= f3成立,则极值点在a3右边,做前进运算,步长加倍 a1=a2;%将a2的值赋予原来的a1 a2=a3;%以a3替换赋予原来的a2 f1=f2;%以f2替换原来的f1 f2=f3;%以f3替换原来的f2 h=2*h; a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 else section=[a1 a3]; sign=0; end end else%假如条件:f1 >= f2不成立,则极值点在a1左边,做后退运算 h=(-1)*h;%极值点在a1左边,做后退运算 k=a1+a2; a1=k-a1;%对调a1、a2 a2=k-a2;%对调a1、a2 k=f1+f2; f1=k-f1;%对调f1、f2 f2=k-f2;%对调f1、f2 a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 while(sign==1) if(f3 <= f2)%假如条件:f3 <= f2成立,则极值点在a3左边,做后退运算 a1=a2;%舍弃原来a1,将a2的值赋予原来的a1 a2=a3;%舍弃原来a2,以a3替换原来的a2 f1=f2;%舍弃原来f1,以f2替换原来的f1 f2=f3;%舍弃原来f2,以f3替换原来的f2 h=2*h;%步长加倍 a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 else section=[a3 a1];%单峰区间 sign=0; end end end %然后用0.618法确定极小值点和极小值 %输入:phi是目标函数,a,b是搜索区间的两个端点 %delta,epsilon分别是自变量和函数值的容许误差 %输出:S,phis分别是近似极小点和极小值,G是nx4矩阵 %其第上行分别是a,p,q,b的第k次迭代值[ak,pk,qk,bk] %E=[ds,dphi],分别是s和phis的误差限 a=a3; b=a1;%区间[a,b]=[a3,a1] e=10^-3;%给出判定迭代停止条件 phi=@(s)exp(-s)+s^2;delta=0.05;epsilon=0.05; t=(sqrt(5)-1)/2; h=b-a; phia=feval(phi,a); phib=feval(phi,b); p=a+(1-t)*h; q=a+t*h; phip=feval(phi,p); phiq=feval(phi,q); k=1; G(k,:)=[a,p,q,b]; while (abs(phib-phia)>epsilon)|(h>delta) if (phip<phiq) b=q; phib=phiq; q=p; phiq=phip; h=b-a; p=a+(1-t)*h; phip=feval(phi,p); else a=p; phia=phip; p=q; phip=phiq; h=b-a; q=a+t*h; phiq=feval(phi,q); end k=k+1; G(k,:)=[a,p,q,b]; end ds=abs(b-a); dphi=abs(phib-phia); if (phip<=phiq) s=p; phis=phip; else s=q; phis=phiq; end E=[ds,dphi] 方法二%5.1第二种方法抛物线法 %先用进退法确定函数值极小值点所在区间 %给初始条件 syms a1 a2 a3 h f1 f2 f3 X Y section sign k;%所需变量,section为单峰区间 Y=exp(-X)+X^2;%所求单峰区间对应的函数 sign=1; a1=0;h=1;%初始点及初始步长 a2=a1+h; f1=double(subs(Y,X,a1));f2=double(subs(Y,X,a2));%计算f1、f2 if(f1 >= f2)%开始分情况讨论 h=2*h;%假如条件:f1 >= f2成立,则极值点在a2右边,做前进运算,步长加倍 a3=a2+h;%生成a3 f3=double(subs(Y,X,a3));%计算f3 while(sign==1) if(f2 >= f3)%假如条件:f2 >= f3成立,则极值点在a3右边,做前进运算,步长加倍 a1=a2;%将a2的值赋予原来的a1 a2=a3;%以a3替换赋予原来的a2 f1=f2;%以f2替换原来的f1 f2=f3;%以f3替换原来的f2 h=2*h; a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 else section=[a1 a3]; sign=0; end end else%假如条件:f1 >= f2不成立,则极值点在a1左边,做后退运算 h=(-1)*h;%极值点在a1左边,做后退运算 k=a1+a2; a1=k-a1;%对调a1、a2 a2=k-a2;%对调a1、a2 k=f1+f2; f1=k-f1;%对调f1、f2 f2=k-f2;%对调f1、f2 a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 while(sign==1) if(f3 <= f2)%假如条件:f3 <= f2成立,则极值点在a3左边,做后退运算 a1=a2;%舍弃原来a1,将a2的值赋予原来的a1 a2=a3;%舍弃原来a2,以a3替换原来的a2 f1=f2;%舍弃原来f1,以f2替换原来的f1 f2=f3;%舍弃原来f2,以f3替换原来的f2 h=2*h;%步长加倍 a3=a2+h;%重新生成a3 f3=double(su

展开阅读网页

更专业一些
转笔记
专业
方法一%5.1第一种方法0.618 %先用进退法确定函数值极小值点所在区间 %给初始条件 syms a1 a2 a3 h f1 f2 f3 X Y section sign k;%所需变量,section为单峰区间 Y=exp(-X)+X^2;%所求单峰区间对应的函数 sign=1; a1=0;h=1;%初始点及初始步长 a2=a1+h; f1=double(subs(Y,X,a1));f2=double(subs(Y,X,a2));%计算f1、f2 if(f1 >= f2)%开始分情况讨论 h=2*h;%假如条件:f1 >= f2成立,则极值点在a2右边,做前进运算,步长加倍 a3=a2+h;%生成a3 f3=double(subs(Y,X,a3));%计算f3 while(sign==1) if(f2 >= f3)%假如条件:f2 >= f3成立,则极值点在a3右边,做前进运算,步长加倍 a1=a2;%将a2的值赋予原来的a1 a2=a3;%以a3替换赋予原来的a2 f1=f2;%以f2替换原来的f1 f2=f3;%以f3替换原来的f2 h=2*h; a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 else section=[a1 a3]; sign=0; end end else%假如条件:f1 >= f2不成立,则极值点在a1左边,做后退运算 h=(-1)*h;%极值点在a1左边,做后退运算 k=a1+a2; a1=k-a1;%对调a1、a2 a2=k-a2;%对调a1、a2 k=f1+f2; f1=k-f1;%对调f1、f2 f2=k-f2;%对调f1、f2 a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 while(sign==1) if(f3 <= f2)%假如条件:f3 <= f2成立,则极值点在a3左边,做后退运算 a1=a2;%舍弃原来a1,将a2的值赋予原来的a1 a2=a3;%舍弃原来a2,以a3替换原来的a2 f1=f2;%舍弃原来f1,以f2替换原来的f1 f2=f3;%舍弃原来f2,以f3替换原来的f2 h=2*h;%步长加倍 a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 else section=[a3 a1];%单峰区间 sign=0; end end end %然后用0.618法确定极小值点和极小值 %输入:phi是目标函数,a,b是搜索区间的两个端点 %delta,epsilon分别是自变量和函数值的容许误差 %输出:S,phis分别是近似极小点和极小值,G是nx4矩阵 %其第上行分别是a,p,q,b的第k次迭代值[ak,pk,qk,bk] %E=[ds,dphi],分别是s和phis的误差限 a=a3; b=a1;%区间[a,b]=[a3,a1] e=10^-3;%给出判定迭代停止条件 phi=@(s)exp(-s)+s^2;delta=0.05;epsilon=0.05; t=(sqrt(5)-1)/2; h=b-a; phia=feval(phi,a); phib=feval(phi,b); p=a+(1-t)*h; q=a+t*h; phip=feval(phi,p); phiq=feval(phi,q); k=1; G(k,:)=[a,p,q,b]; while (abs(phib-phia)>epsilon)|(h>delta) if (phip<phiq) b=q; phib=phiq; q=p; phiq=phip; h=b-a; p=a+(1-t)*h; phip=feval(phi,p); else a=p; phia=phip; p=q; phip=phiq; h=b-a; q=a+t*h; phiq=feval(phi,q); end k=k+1; G(k,:)=[a,p,q,b]; end ds=abs(b-a); dphi=abs(phib-phia); if (phip<=phiq) s=p; phis=phip; else s=q; phis=phiq; end E=[ds,dphi] 方法二%5.1第二种方法抛物线法 %先用进退法确定函数值极小值点所在区间 %给初始条件 syms a1 a2 a3 h f1 f2 f3 X Y section sign k;%所需变量,section为单峰区间 Y=exp(-X)+X^2;%所求单峰区间对应的函数 sign=1; a1=0;h=1;%初始点及初始步长 a2=a1+h; f1=double(subs(Y,X,a1));f2=double(subs(Y,X,a2));%计算f1、f2 if(f1 >= f2)%开始分情况讨论 h=2*h;%假如条件:f1 >= f2成立,则极值点在a2右边,做前进运算,步长加倍 a3=a2+h;%生成a3 f3=double(subs(Y,X,a3));%计算f3 while(sign==1) if(f2 >= f3)%假如条件:f2 >= f3成立,则极值点在a3右边,做前进运算,步长加倍 a1=a2;%将a2的值赋予原来的a1 a2=a3;%以a3替换赋予原来的a2 f1=f2;%以f2替换原来的f1 f2=f3;%以f3替换原来的f2 h=2*h; a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 else section=[a1 a3]; sign=0; end end else%假如条件:f1 >= f2不成立,则极值点在a1左边,做后退运算 h=(-1)*h;%极值点在a1左边,做后退运算 k=a1+a2; a1=k-a1;%对调a1、a2 a2=k-a2;%对调a1、a2 k=f1+f2; f1=k-f1;%对调f1、f2 f2=k-f2;%对调f1、f2 a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 while(sign==1) if(f3 <= f2)%假如条件:f3 <= f2成立,则极值点在a3左边,做后退运算 a1=a2;%舍弃原来a1,将a2的值赋予原来的a1 a2=a3;%舍弃原来a2,以a3替换原来的a2 f1=f2;%舍弃原来f1,以f2替换原来的f1 f2=f3;%舍弃原来f2,以f3替换原来的f2 h=2*h;%步长加倍 a3=a2+h;%重新生成a3 f3=double(su
不在提醒

方法一和方法二都是用于确定函数极小值点的数值优化方法。方法一是基于黄金分割法的优化算法,而方法二是基于抛物线插值法的优化算法。这两种方法在实际应用中各有优缺点,适用于不同的场景。

方法一:黄金分割法

  • 定义:黄金分割法是一种单峰函数优化方法,通过不断缩小搜索区间来逼近极小值点。
  • 步骤
    1. 初始化搜索区间和步长。
    2. 通过比较函数值确定新的搜索区间。
    3. 重复步骤2,直到满足停止条件(如区间宽度或函数值变化小于设定阈值)。
  • 优点:简单易实现,收敛速度较快。
  • 缺点:对初始区间和步长敏感,可能需要多次尝试才能找到合适的初始条件。

方法二:抛物线法

  • 定义:抛物线法通过在当前点附近拟合抛物线来估计极小值点,并更新搜索区间。
  • 步骤
    1. 初始化搜索区间和步长。
    2. 通过拟合抛物线确定新的极小值点。
    3. 更新搜索区间并重复步骤2,直到满足停止条件。
  • 优点:对初始条件不敏感,适用于非线性函数。
  • 缺点:计算复杂度较高,收敛速度可能较慢。

应用场景

  • 方法一:适用于简单函数或需要快速收敛的场景。
  • 方法二:适用于复杂函数或需要高精度求解的场景。

总结

方法一和方法二各有优缺点,选择哪种方法取决于具体问题的性质和需求。在实际应用中,可以根据函数的复杂度和计算资源的限制来选择合适的方法。

✏️展开
知识树
方法一%5.1第一种方法0.618 %先用进退法确定函数值极小值点所在区间 %给初始条件 syms a1 a2 a3 h f1 f2 f3 X Y section sign k;%所需变量,section为单峰区间 Y=exp(-X)+X^2;%所求单峰区间对应的函数 sign=1; a1=0;h=1;%初始点及初始步长 a2=a1+h; f1=double(subs(Y,X,a1));f2=double(subs(Y,X,a2));%计算f1、f2 if(f1 >= f2)%开始分情况讨论 h=2*h;%假如条件:f1 >= f2成立,则极值点在a2右边,做前进运算,步长加倍 a3=a2+h;%生成a3 f3=double(subs(Y,X,a3));%计算f3 while(sign==1) if(f2 >= f3)%假如条件:f2 >= f3成立,则极值点在a3右边,做前进运算,步长加倍 a1=a2;%将a2的值赋予原来的a1 a2=a3;%以a3替换赋予原来的a2 f1=f2;%以f2替换原来的f1 f2=f3;%以f3替换原来的f2 h=2*h; a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 else section=[a1 a3]; sign=0; end end else%假如条件:f1 >= f2不成立,则极值点在a1左边,做后退运算 h=(-1)*h;%极值点在a1左边,做后退运算 k=a1+a2; a1=k-a1;%对调a1、a2 a2=k-a2;%对调a1、a2 k=f1+f2; f1=k-f1;%对调f1、f2 f2=k-f2;%对调f1、f2 a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 while(sign==1) if(f3 <= f2)%假如条件:f3 <= f2成立,则极值点在a3左边,做后退运算 a1=a2;%舍弃原来a1,将a2的值赋予原来的a1 a2=a3;%舍弃原来a2,以a3替换原来的a2 f1=f2;%舍弃原来f1,以f2替换原来的f1 f2=f3;%舍弃原来f2,以f3替换原来的f2 h=2*h;%步长加倍 a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 else section=[a3 a1];%单峰区间 sign=0; end end end %然后用0.618法确定极小值点和极小值 %输入:phi是目标函数,a,b是搜索区间的两个端点 %delta,epsilon分别是自变量和函数值的容许误差 %输出:S,phis分别是近似极小点和极小值,G是nx4矩阵 %其第上行分别是a,p,q,b的第k次迭代值[ak,pk,qk,bk] %E=[ds,dphi],分别是s和phis的误差限 a=a3; b=a1;%区间[a,b]=[a3,a1] e=10^-3;%给出判定迭代停止条件 phi=@(s)exp(-s)+s^2;delta=0.05;epsilon=0.05; t=(sqrt(5)-1)/2; h=b-a; phia=feval(phi,a); phib=feval(phi,b); p=a+(1-t)*h; q=a+t*h; phip=feval(phi,p); phiq=feval(phi,q); k=1; G(k,:)=[a,p,q,b]; while (abs(phib-phia)>epsilon)|(h>delta) if (phip<phiq) b=q; phib=phiq; q=p; phiq=phip; h=b-a; p=a+(1-t)*h; phip=feval(phi,p); else a=p; phia=phip; p=q; phip=phiq; h=b-a; q=a+t*h; phiq=feval(phi,q); end k=k+1; G(k,:)=[a,p,q,b]; end ds=abs(b-a); dphi=abs(phib-phia); if (phip<=phiq) s=p; phis=phip; else s=q; phis=phiq; end E=[ds,dphi] 方法二%5.1第二种方法抛物线法 %先用进退法确定函数值极小值点所在区间 %给初始条件 syms a1 a2 a3 h f1 f2 f3 X Y section sign k;%所需变量,section为单峰区间 Y=exp(-X)+X^2;%所求单峰区间对应的函数 sign=1; a1=0;h=1;%初始点及初始步长 a2=a1+h; f1=double(subs(Y,X,a1));f2=double(subs(Y,X,a2));%计算f1、f2 if(f1 >= f2)%开始分情况讨论 h=2*h;%假如条件:f1 >= f2成立,则极值点在a2右边,做前进运算,步长加倍 a3=a2+h;%生成a3 f3=double(subs(Y,X,a3));%计算f3 while(sign==1) if(f2 >= f3)%假如条件:f2 >= f3成立,则极值点在a3右边,做前进运算,步长加倍 a1=a2;%将a2的值赋予原来的a1 a2=a3;%以a3替换赋予原来的a2 f1=f2;%以f2替换原来的f1 f2=f3;%以f3替换原来的f2 h=2*h; a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 else section=[a1 a3]; sign=0; end end else%假如条件:f1 >= f2不成立,则极值点在a1左边,做后退运算 h=(-1)*h;%极值点在a1左边,做后退运算 k=a1+a2; a1=k-a1;%对调a1、a2 a2=k-a2;%对调a1、a2 k=f1+f2; f1=k-f1;%对调f1、f2 f2=k-f2;%对调f1、f2 a3=a2+h;%重新生成a3 f3=double(subs(Y,X,a3));%重新计算f3 while(sign==1) if(f3 <= f2)%假如条件:f3 <= f2成立,则极值点在a3左边,做后退运算 a1=a2;%舍弃原来a1,将a2的值赋予原来的a1 a2=a3;%舍弃原来a2,以a3替换原来的a2 f1=f2;%舍弃原来f1,以f2替换原来的f1 f2=f3;%舍弃原来f2,以f3替换原来的f2 h=2*h;%步长加倍 a3=a2+h;%重新生成a3 f3=double(su
数值优化方法有哪些?
如何选择合适的优化算法?
优化算法在工程中的应用有哪些?

以上内容由AI搜集生成,仅供参考

在线客服