f(x1,x2)=x12+2x22-4x1-2x1x2
的最优解。
解:
基于鲍威尔法,现采用编程来计算最优解,程序简要步骤如下:
1) 设置初始点,收敛精度,迭代次数计数变量,并给定第一个搜索方向和两个线性无关的
向量
2) 给定收敛精度判别变量为 1,使程序进入循环
3) 沿两个方向分别进行一维搜索,分别得出最佳步长,下一搜索的起初点以及函数值增量
4) 通过两个方向走步后的相对应的函数值增量,找出最大者
5) 求出终点的反射点及其函数值
6) 检查判别条件来确定下一轮搜索方向和起始点
7) 检查收敛精度,满足要求,则退出循环,得到最优解,否则返回到 3)处
程序如下:
%%用鲍威尔法求函数f=x1^2+2*x2^2-4*x1-2x1*x2的极小点
syms x1 x2 x00 x01 x02 x03 xk0 a1 a2 ak0
disp('请输入初始向量x00');
x00=input('x00>>');
disp('请输入第一搜索方向d01');
d01=input('d01>>');
disp('
请输入第二搜索方向d02');
d02=input('d02>>');
disp('请输入收敛精度e');
e=input('e>>');
f=x1^2+2*x2^2-4*x1-2*x1*x2;
ee=1;k=0;
f0=double(subs(f,{x1,x2},{x00(1),x00(2)}))
while ee>e
k=k+1;
x01=x00+a1*d01;
f1=subs(f,{x1,x2},{x01(1),x01(2)});
aa1=solve(diff(f1,a1),'a1');
x01=subs(x01,a1,aa1)
f1=double(subs(f1,a1,aa1));
f0f1=f0-f1;
x02=x01+a2*d02;
f2=subs(f,{x1,x2},{x02(1),x02(2)});
aa2=solve(diff(f2,a2),'a2');
x02=subs(x02,a2,aa2)
f2=double(subs(f2,a2,aa2))
f1f2=f1-f2;
f12max=max(double(f0f1),double(f1f2));
x03=2*x02-x00;
d03=x02-x00;