平时学习的记录——自己用
模拟退火求解根号n的值
参考视频: https://www.bilibili.com/video/BV1Hb4y1J7PN?vd_source=2a1d982a7191df1d29fee38ee7081e6f
function SA(n)
% 模拟退火算法
% n是目标参数,求解根号n的近似值,
T = 2000; % 初试温度
dT = 0.998; % 退火系数
eps = 1e-16; % 当温度降到这个值时就停止迭代
x = 1;
fx = target(1,n);
while( T > eps )
%% 退火过程
dx = x + (rand()* 2 - 1) * T;
while dx<0
dx = x + (rand()* 2 - 1) * T;
end
dfx = target(dx,n);
if dfx<fx
x = dx;
fx = dfx;
elseif exp((fx-dfx)/T)>rand()
x = dx;
fx = dfx;
end
%% 降温
T = T*dT;
end
x
end
function fval = target(x,n)
fval = abs(x^2 - n);
end