您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 机械/模具设计 > MATLAB关于Powell优化设计程序
%用鲍威尔法优化设计程序,求解函数2112221242)(xxxxxxf的最优解.初始条件为:,迭代精度:(程序中用E代替)110x001.0%%第一轮迭代(k=1)!clc;clear;X_0=[1;1];X0_1=X_0;%给定初始点.fprintf('迭代初始点坐标为:X0_1=[%6f;%6f]\n',X0_1)E=0.001;%给定计算精度.e1=[1;0];e2=[0;1];S1_1=e1;%确定初始搜索方向向量e1.S2_1=e2;%确定初始搜索方向向量e2.f0=X0_1(1)^2+2*X0_1(2)^2-4*X0_1(1)-2*X0_1(1)*X0_1(2);%初始点的函数值.F1=f0;%%第一次循环:%沿着坐标轴e1方向进行一维搜索(求出最优步长a1):symsa1X1_1=X0_1+a1*S1_1;f1=X1_1(1)^2+2*X1_1(2)^2-4*X1_1(1)-2*X1_1(1)*X1_1(2);ff1=diff(f1);a1=solve(ff1,0);%求得最优步长a1.fprintf('第一轮第一次一维搜索的最优步长因子为:a1=%6f\n',eval(a1))X1_1=X0_1+a1*S1_1;%得到沿e1方向进行一维搜索后的极小值点X1_1.f1=eval(X1_1(1)^2+2*X1_1(2)^2-4*X1_1(1)-2*X1_1(1)*X1_1(2));%得到极小点X1_1处的函数值.%沿着坐标轴e2方向进行一维搜索(求出最优步长a2):symsa2X2_1=X1_1+a2*S2_1;f2=X2_1(1)^2+2*X2_1(2)^2-4*X2_1(1)-2*X2_1(1)*X2_1(2);ff2=diff(f2);a2=solve(ff2,0);%求得最优步长a2.fprintf('第一轮第二次一维搜索的最优步长因子为:a2=%6f\n',eval(a2))X2_1=X1_1+a2*S2_1;%得到沿e1方向进行一维搜索后的极小值点X2_1.f2=eval(X2_1(1)^2+2*X2_1(2)^2-4*X2_1(1)-2*X2_1(1)*X2_1(2));%得到极小点X2_1处的函数值.F2=f2;S_1=X2_1-X0_1;%求得第一个共轭方向S_1.fprintf('第一轮迭代完成过后,得到的第一个共轭方向向量为:S_1=[%4f;%4f]\n',eval(S_1))X3_1=2*X2_1-X0_1;%沿着共轭方向S_1计算X0_1的映射点.fprintf('沿着共轭方向S_1计算X0_1的映射点为:X3_1=[%4f;%4f]\n',eval(X3_1))F3=eval(X3_1(1)^2+2*X3_1(2)^2-4*X3_1(1)-2*X3_1(1)*X3_1(2));%计算的到映射点F3的值.Dt1_1=f0-f1;%计算本轮相邻两点函数值的下降量.Dt2_1=f1-f2;Dtm_1=max(Dt1_1,Dt2_1);%进行收敛判断(是否用得到的第一个共轭方向替换上一轮中的第一个一维搜索方向).if(F3F1&&(F1+F3-2*F2)*(F1-F2-Dtm_1)^20.5*Dtm_1*(F1-F3)^2)S1_2=S2_1;S2_2=S_1;elseS1_2=S2_1;S2_2=S1_1;endsymsa3%以下语句是求出沿S_1方向进行一维搜索的最佳步长因子以及第二轮迭代的初始点X0_2.X_1=X2_1+a3*S_1;f3=X_1(1)^2+2*X_1(2)^2-4*X_1(1)-2*X_1(1)*X_1(2);ff3=diff(f3);a3=solve(ff3,0);%求得沿S_1方向进行一维搜索的最优步长a3.X_1=X2_1+a3*S_1;f3=eval(X_1(1)^2+2*X_1(2)^2-4*X_1(1)-2*X_1(1)*X_1(2));%得到第二轮迭代的初始点X_1处的函数值.X0_2=eval(X_1);%得到第二轮的迭代初始点X0_2.F_1=f3;%进行迭代终止检验d1=sqrt((X0_2(1)-X0_1(1))^2+(X0_2(2)-X0_1(2))^2);%得到d1=2.886173937932362fprintf('第一轮迭代完成过后的精度检验值为:d1=%4f\n',d1)if(d1E)%进行迭代终止检验是否继续进行下一轮迭代%第二轮迭代(K=2!)%沿S2_1方向进行第二轮迭代第一次一维搜索symsa4%以下语句是求出沿S1_2方向进行一维搜索的最佳步长因子X1_2=X0_2+a4*S1_2;f4=X1_2(1)^2+2*X1_2(2)^2-4*X1_2(1)-2*X1_2(1)*X1_2(2);ff4=diff(f4);a4=solve(ff4,0);%得到第二轮迭代第一次一维搜索的最优步长因子a4.fprintf('第二轮迭代第一次一维搜索的最优步长因子为:a4=%4f\n',eval(a4))X1_2=X0_2+a4*S1_2;f4=eval(X1_2(1)^2+2*X1_2(2)^2-4*X1_2(1)-2*X1_2(1)*X1_2(2));%得到第二轮迭代点X1_2处的函数值f4.%沿S2_2方向进行第二轮迭代第二次一维搜索symsa5X2_2=X1_2+a5*S2_2;f5=X2_2(1)^2+2*X2_2(2)^2-4*X2_2(1)-2*X2_2(1)*X2_2(2);ff5=diff(f5);a5=solve(ff5,0);%得到第二轮迭代第二次一维搜索的最优步长因子a5.fprintf('第二轮迭代第二次一维搜索的最优步长因子为:a5=%4f\n',eval(a5))X2_2=X1_2+a5*S2_2;%得到沿e1方向进行一维搜索后,得到的极小值点X1.f5=eval(X2_2(1)^2+2*X2_2(2)^2-4*X2_2(1)-2*X2_2(1)*X2_2(2));%得到第二轮迭代点X1_2处的函数值f5.F_2=f5;S_2=X2_2-X0_2;%求得第二个共轭方向S_2.fprintf('第二轮迭代完成过后,得到的第二个共轭方向向量为:S_2=[%4f;%4f]\n',eval(S_2))X3_2=2*X2_2-X0_2;%沿着共轭方向S_2计算X0_2的映射点X3_2.fprintf('沿着共轭方向S_2计算X0_2的映射点为:X3_2=[%4f;%4f]\n',eval(X3_2))F_3=eval(X3_2(1)^2+2*X3_2(2)^2-4*X3_2(1)-2*X3_2(1)*X3_2(2));%计算的到映射点X0_2处的函数值F_3.Dt1_2=f3-f4;%计算本轮相邻两点函数值的下降量.Dt2_2=f4-f5;Dtm_2=max(Dt1_1,Dt2_1);%进行收敛判断if(F_3F_1&&(F_1-2*F_2+F_3)*(F_1-F_2-Dtm_2)^20.5*Dtm_2*(F_1-F_3)^2)S1_3=S2_2;S2_3=S_2;elseS1_3=S2_2;S2_3=S1_2;endsymsa6%寻求沿S_2方向进行一维搜索的最佳步长因子a6以及第三轮迭代的初始点X0_3.X_2=X2_2+a6*S_2;f6=X_2(1)^2+2*X_2(2)^2-4*X_2(1)-2*X_2(1)*X_2(2);ff6=diff(f6);a6=solve(ff6,0);%得沿S_2方向进行一维搜索的最佳步长因子a6.X_2=X2_2+a6*S_2;%沿S_2方向进行一维搜索的函数f(x)的最小值X_2,f6=eval(X_2(1)^2+2*X_2(2)^2-4*X_2(1)-2*X_2(1)*X_2(2));X0_3=eval(X_2);%第三轮的迭代初始点.F__1=f6;%得第三轮初始点的函数值.%进行迭代终止检验.d2=sqrt((X0_3(1)-X0_2(1))^2+(X0_3(2)-X0_2(2))^2);%得到d2=0.360555127546399fprintf('第二轮迭代完成过后的精度检验值为:d2=%4f\n',d2)if(d2E)%第三轮迭代(k=3!)symsa7X1_3=X0_3+a7*S1_3;f7=X1_3(1)^2+2*X1_3(2)^2-4*X1_3(1)-2*X1_3(1)*X1_3(2);ff7=diff(f7);a7=solve(ff7,0);%得到第三轮迭代第一次一维搜索的最优步长因子a7.fprintf('第三轮迭代第一次一维搜索的最优步长因子为:a7=%4f\n',eval(a7))X1_3=X0_3+a4*S1_3;%得到沿s1_3方向进行一维搜索后,得到的极小值点X1_3.f7=eval(X1_3(1)^2+2*X1_3(2)^2-4*X1_3(1)-2*X1_3(1)*X1_3(2));symsa8X2_3=X1_3+a8*S2_3;f8=X2_3(1)^2+2*X2_3(2)^2-4*X2_3(1)-2*X2_3(1)*X2_3(2);ff8=diff(f8);a8=solve(ff8,0);%得到第三轮迭代第二次一维搜索的最优步长因子a8.fprintf('第三轮迭代第二次一维搜索的最优步长因子为:a8=%4f\n',eval(a8))X2_3=X1_3+a8*S2_3;%得到沿s2_3方向进行一维搜索后,得到的极小值点X2_3.f8=eval(X2_3(1)^2+2*X2_3(2)^2-4*X2_3(1)-2*X2_3(1)*X2_3(2));F__2=f8;%得第三轮终点的函数值.S_3=X2_3-X0_3;%求得第三个共轭方向S_3.fprintf('第三轮迭代完成过后,得到的第三个共轭方向向量为:S_3=[%4f;%4f]\n',eval(S_3))X3_3=2*X2_3-X0_3;%沿着共轭方向S_3计算X0_3的映射点X3_3.fprintf('沿着共轭方向S_3计算X0_3的映射点为:X3_3=[%4f;%4f]\n',eval(X3_3))F__3=eval(X3_3(1)^2+2*X3_3(2)^2-4*X3_3(1)-2*X3_3(1)*X3_3(2));%计算第三轮所得映射点的函数值F__3.Dt1_3=f6-f7;%计算本轮相邻两点函数值的下降量.Dt2_3=f7-f8;Dtm_3=max(Dt1_3,Dt2_3);%进行收敛判断.if(F__3F__1&&(F__1-2*F__2+F__3)*(F__1-F__2-Dtm_3)^20.5*Dtm_3*(F__1-F__3)^2)S1_4=S2_3;S2_4=S_3;elseS1_4=S2_3;S2_4=S1_3;end%寻求沿S_3方向进行一维搜索的最佳步长因子a9以及第四轮迭代的初始点X0_4(即第三轮两次一维搜索所得到的最小值!).symsa9X_3=X2_3+a9*S_3;f9=X_3(1)^2+2*X_3(2)^2-4*X_3(1)-2*X_3(1)*X_3(2);ff9=diff(f9);a9=solve(ff9,0);%沿S_3方向进行一维搜索的最佳步长因子a9.X_3=X2_3+a9*S_3;%沿S_3方向进行一维搜索的f(x)的极小点X_3.f9=eval(X_3(1)^2+2*X_3(2)^2-4*X_3(1)-2*X_3(1)*X_3(2));%沿S_3方向进行一维搜索的极小点X_3的函数值.X0_4=eval(X_3);%将X_3作为第四轮的迭代初始点.F___1=f9;%得第四轮初始点的函数值.%进行迭代终止检验.d3=sqrt((X0_4(1)-X0_3(1))^2+(X0_4(2)-X0_3(2))^2);fprintf('第三轮迭代完成过后的精度检验值为:d3=%4f\n',d3)if(d3E)disp('进行第四次迭代!')elsedisp('满足精度要求,故迭代终止!')fp
三七文档所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
本文标题:MATLAB关于Powell优化设计程序
链接地址:https://www.777doc.com/doc-2479638 .html