求解以下函数极大值
z = − x 2 + 2 x − 2 y 2 − y + 10 z = -x^2 + 2x - 2y^2 - y + 10 z=−x2+2x−2y2−y+10
% 定义目标函数
fun = @(x,y) -x^2 + 2*x - 2*y^2 - y + 10;
% 定义初始温度、终止温度和温度下降率
Tstart = 1000; % 初始温度
Tend = 1e-8; % 终止温度
alpha = 0.99; % 温度下降率
% 定义搜索区间和步长
xmin = -10;
xmax = 10;
ymin = -10;
ymax = 10;
step = 0.1;
% 初始化当前状态和当前能量
x0 = xmin + (xmax - xmin)*rand(); % 随机生成初始状态
y0 = ymin + (ymax - ymin)*rand();
z0 = fun(x0,y0); % 计算初始能量
x = x0;
y = y0;
z = z0;
% 初始化最优状态和最优能量
xbest = x;
ybest = y;
zbest = z;
% 进入模拟退火主循环
while Tstart > Tend
% 在邻域内随机生成新状态
xnew = x + step*(rand()*2 - 1);
ynew = y + step*(rand()*2 - 1);
% 计算新状态的能量
znew = fun(xnew,ynew);
% 判断是否接受新状态
delta = znew - z;
if delta > 0
% 如果新状态能量更优,则直接接受
x = xnew;
y = ynew;
z = znew;
% 如果新状态比当前最优状态更优,则更新最优状态
if z > zbest
xbest = x;
ybest = y;
zbest = z;
end
else
% 如果新状态能量更差,则以一定概率接受
p = exp(delta/Tstart);
if rand() < p
x = xnew;
y = ynew;
z = znew;
end
end
% 降低温度
Tstart = Tstart*alpha;
end
% 图像可视化
fsurf(fun)
hold on
plot3(xbest,ybest,zbest,'r*')
% 输出结果
fprintf('最优解:x = %f, y = %f, z = %f\n',xbest,ybest,zbest);