A=C;
else
B=D;
end
end
%判断2
n=n+1;%循环加1
end
t=A;
minF13=F13
(2);
3.6计算运行结果如下:
二无约束优化问题
1.1题目:
1.2最优解:
1.3采用的算法及其算法的基本思想:
将f(x)在x(k)点作泰勒展开,取二次函数式Φ(x)作为近似函数,以Φ(x)的极小值点作为f(x)的近似极小值点。
求二次函数的极值
1.4程序框图:
牛顿法程图如下:
1.6程序:
共一个main21.m文件:
main21.m具体程序如下:
clc;clearall;
symsx1x2tpmaxnprecision;%定义变量
f21=4*x1^2+x2^2-40*x1-12*x2+136;%定义函数
fx1=diff(f21,x1);%对f求x1偏导求的一阶导数;diff(函数,n),求的n阶导数(n是具体整数);%diff(函数,变量名),求对的偏导数;diff(函数,变量名,n)
fx2=diff(f21,x2);%对f求x2偏导
p=0;g=1;
disp('用梯度法求二元二次目标函数f(X)=4*x1^2+x2^2-40*x1-12*x2+136的最优解');
fori=1:
5%fori=1:
5
if(p==0)%if(p==0)
x1=input('Pleaseentertheinitialstartingpointx1:
');
x2=input('Pleaseentertheinitialstartingpointx2:
');
maxn=input('Pleaseenterthemaxmumnumberofinterationsmaxn:
');
precision=input('Pleaseentertheminimumofthesearchingdirectionprecision:
');
g=input('Outputtheresultofeachinteration,ifyouwantEnter1,ornot:
');
fora=1:
maxn%fora=1:
2:
8,则每次取值为1,3,5,7.其中2是步长
%但步长为1时可省略即原式为forn=1:
1:
100
f0=subs(f21);%subs(函数名)将函数里的变量用已知量代换对f中的变量带入已知量
f1=subs(fx1);%subs(函数名)将函数里的变量用已知量代换对fx1中的变量带入已知量
f2=subs(fx2);%subs(函数名)将函数里的变量用已知量代换对fx2中的变量带入已知量
if(double(sqrt(f1^2+f2^2))<=precision)%计算梯度模值进行比较
%以下为输出函数
disp('*************************************************************************');
disp('Theresult:
');
disp('Thetotalnumberofinterationsa:
');
disp('Thevalueofextremumx1:
');
vpa(x1,5)%vpa函数来实现数值精确到小数点后某一位vpa会根据精度要求去掉末尾的数位%或者补0vpa(x1,7)
%vpa的结果是符号数值,可以用于初等运算,不可用于关系运算以小数形式表示
disp('Thevalueofextremumx2:
');
vpa(x2,5)
disp('Thefunctionofextremumvalue:
');
vpa(f0)
p=1;break;
else
FF=F21(x1-t*f1,x2-t*f2);%最优解为t
FFt=diff(FF,t);
tt=solve(FFt,'t');%solve命令主要是用来求解代数方程(即多项式)的解即求解满足此中默认FFt=0;x1=x1-tt*f1;x2=x2-tt*f2;
if(g==1)
disp('Thenumberofinterationsa:
');
disp('Thevalueofx1:
');
x1=vpa(x1,5)%vpa函数来实现数值精确到小数点后某一位vpa会根据精度要求去掉末尾的数位或者补0vpa(x1,5)
%vpa的结果是符号数值,可以用于初等运算,不可用于关系运算以小数形式表示
disp('Thevalueofx2:
');
x2=vpa(x2,5);
disp('Thevalueoffunctionf0:
');
f0=vpa(f0,5)
disp('*************************************************************************');
end
end%对if进行结束
end%对for进行结束
if(p==0)
disp('PLEASETRYAGAIN');
end%if(p==0)
end%if(p==0)头一个
end%fori=1:
5
1.7计算输出结果:
2.1题目:
2.2最优解:
2.3采用的算法及其算法的基本思想:
将f(x)在x(k)点作泰勒展开,取二次函数式Φ(x)作为近似函数,以Φ(x)的极小值点作为f(x)的近似极小值点。
求二次函数的极值
2.4程序框图:
(牛顿法程图如下)
2.5具体程序:
Main22具体程序如下:
%用牛顿法求目标函数f(x)=(x1^2+x2-11)^2+(x1+x2^2-7)^2的最优解
clc;
symsx1x2precision;
f=(x1^2+x2-11)^2+(x1+x2^2-7)^2;
v=[x1x2];
df=jacobian(f,v);
df=df.';
H=jacobian(df,v);
disp('**********************************************************');
disp('用牛顿法求目标函数f(x)=(x1^2+x2-11)^2+(x1+x2^2-7)^2的最优解');
disp('**********************************************************');
disp('请输入初始位置点以及精度要求');
fprintf('\n');
x1=input('选取的初始点坐标点x1:
');
x2=input('选取的初始点坐标点x2:
');
precision=input('计算所要求迭代精度为:
');
x0=[x1,x2]';
g0=subs(df,v,x0);
H0=subs(H,v,x0);
H0=inv(H0);
k=0;
s=-H0*g0;
while(subs(sqrt(s(1,1)^2+s(2,1)^2))>precision)
s=-H0*g0;
x0=x0+s;
g0=subs(df,v,x0);
H0=subs(H,v,x0);
H0=inv(H0);
k=k+1;
end
disp('----------------------------------');
disp('计算结果如下:
');
fprintf('迭代的总次数:
\nk=%d\n',k);
fprintf('最优点坐标:
\nx1=%3.4f\n',x0
(1));
fprintf('最优点坐标:
\nx2=%3.4f\n',x0
(2))
f=subs(f,v,x0);
fprintf('函数的极值:
\nf=%3.4f\n',f);
disp('*************************************************');
disp('*************************************************');
2.6计算和输出结果:
3.1题目:
3.2最优解:
3.3采用的算法及其算法的基本思想:
将f(x)在x(k)点作泰勒展开,取二次函数式Φ(x)作为近似函数,以Φ(x)的极小值点作为f(x)的近似极小值点。
求二次函数的极值
3.4程序框图:
3.5程序:
共一个M文件:
main23.m:
%用牛顿法求目标函数f(x)=(x1^2+10*x2)^2+5*(x3-x4^2)^2+(x2-2*x3)^2+10*(x1-x4)^4最优解
clc;
symsx1x2x3x4precision;
f=(x1^2+10*x2)^2+5*(x3-x4^2)^2+(x2-2*x3)^2+10*(x1-x4)^4;%目标函数
v=[x1x2x3x4];%变量向量
df=jacobian(f,v);%梯度
df=df.';%非共轭转置
H=jacobian(df,v);%海森矩阵
disp('************************************************************************');
disp('用牛顿法求目标函数f(x)=(x1^2+10*x2)^2+5*(x3-x4^2)^2+(x2-2*x3)^2+10*(x1-x4)^4的最优解');
disp('***********************************************************************');
disp('请输入初始位置点以及精度要求');
fprintf('\n');
x1=input('选取的初始点坐标点x1:
');
x2=input('选取的初始点坐标点x2:
');
x3=input('选取的初始点坐标点x3:
');
x4=input('选取的初始点坐标点x4:
');
precision=input('计算所要求迭代精度要求:
');
x0=[x1,x2,x3,x4]';g0=subs(df,v,x0);H0=subs(H,v,x0);
H0=inv(H0);%海森矩阵的逆
k=0;s=-H0*g0;
while(subs(sqrt(s(1,1)^2+s(2,1)^2)+s(3,1)^2+s(4,1)^2)>precision)
s=-H0*g0;x0=x0+s;
g0=subs(df,v,x0);%求梯度的值
H0=subs(H,v,x0);%求海森矩阵的值
H0=inv(H0);
k=k+1;
end
disp('----------------------------------');
disp('计算结果如下:
');
fprintf('迭代的总次数:
\nk=%d\n',k);fprintf('最优点坐标:
\nx1=%3.4f\n',x0
(1));
fprintf('最优点坐标:
\nx2=%3.4f\n',x0
(2));fprintf('最优点坐标:
\nx3=%3.4f\n',x0(3));
fprintf('最优点坐标:
\nx4=%3.4f\n',x0(4));f=subs(f,v,x0);
fprintf('函数的极值:
\nf=%3.4f\n',f);
disp('*************************************************');
disp('*************************************************');
3.6计算结果如下:
三约束优化问题
1.1题目:
1.2最优解:
1.3采用的算法及其算法的基本思想:
采用的为外点法来进行计算。
其基本思想:
外点法是从可行域的外部构造一个点序列去逼近原约束问题的最优解。
构造函数进行计算。
1.4程序框图:
1.5程序:
共2个M文件,分别为:
main31.m和fdd31.m.
main31.m具体如下:
%用外点法求多维有约束目标函数f(x)=(x1-2)^2+(x2-1)^2极值
clc;
k=0;
M=1;
c=10;
symsx1x2precision1precision2a1a2;
v=[x1x2];%变量向量
f=(x1-2)^2+(x2-1)^2;%目标函数
g1=-x1^2-x2;
g2=x1+x2-2;
disp('****************************************************');
disp('用外点法求多维有约束目标函数f(x)=(x1-2)^2+(x2-1)^2极值');
disp('****************************************************');
disp('请输入初始位置点以及精度要求');
fprintf('\n');
a1=input('选取的初始点坐标点a1:
');
a2=input('选取的初始点坐标点a2:
');
precision1=input('计算所要求迭代精度要求precision1:
');
precision2=input('计算所要求迭代精度要求precision2:
');
X0=[a1,a2]';
while(k<100)
q=f+M*((g1)^2+(g2)^2);
X1=fdd31(q,x1,x2,X0);
norm=subs(sqrt((X1
(1)-X0
(1))^2+(X1
(2)-X0
(2))^2));
ff0=subs(subs(q,v,X0));
ff1=subs(subs(q,v,X1));
if(norm<=precision1)&(abs((ff0-ff1)/ff0)<=precision2)
break;
end
X0=X1;
M=c*M;
k=k+1;
end
disp('------------------------------------------');
disp('计算结果如下:
');
fprintf('迭代的总次数:
\nk=%d\n',k);
fprintf('最优点坐标:
\nx1=%3.4f\n',X0
(1));
fprintf('最优点坐标:
\nx2=%3.4f\n',X0
(2));
f=subs(f,v,X0);
fprintf('函数的极值:
\nf=%3.4f\n',f);
disp('********************************************************************');
disp('********************************************************************');
fdd31.m具体如下:
functionsc=fdd31(f,x1,x2,X0)
symsv;v=[x1,x2];%变量向量
df=jacobian(f,v);%梯度
df=df.';G=jacobian(df,