![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
试用模拟退火法求函数f(x,y)=sin(xy)+x^2+y^2的最小值。 200
展开全部
%使用模拟退火法求函数f(x,y)=sin(x*y)+x^2+y^2的最小值
format long
XMAX=4; %搜索的最大区间
YMAX=4; %搜索的最大区间
MarkovLength=10000; %马可夫链长度
DecayScale=0.95; %衰减参数0.95
StepFactor=0.02; %步长因子
Temperature=100; %初始温度
Tolerance=1e-8; %容差
AcceptPoints=0.0; %Metropolis过程中总接受点
PreX=-XMAX*rand; %初始的搜索值
PreY=-YMAX*rand; %初始的搜索值
PreBestX=PreX; %上一个最优解
PreBestY=PreY; %上一个最优解
BestX=PreX; %最终解
BestY=PreY; %最终解
while(1)
Temperature=Temperature*DecayScale; %每迭代一次退旅旁火一次(降温),直到满足迭代条件为止
AcceptPoints=0.0;
%在当前温度下迭代(即MARKOV链长度)次
for i=0:1:MarkovLength
while(1)
NextX=PreX+StepFactor*XMAX*(rand-0.5); %在初始点附近随机选下一点
NextY=PreY+StepFactor*YMAX*(rand-0.5); %在初始点附近随机选下一点
%判断新产生的点是否在规定的最大搜索区间内,若在,则退出循环,不在,继续循环,直到新产生的点在规定的最大搜索区间内
if((NextX>=-XMAX && NextX<=XMAX && NextY>=-YMAX && NextY<=YMAX))
break %退出循环
end
end
%判拆羡橡断新产生点与原来最优点哪个更优
if(minfunction(BestX,BestY)>minfunction(NextX,NextY))
PreBestX=BestX; %保留上一个最优解
PreBestY=BestY;
BestX=NextX; %新的最优解
BestY=NextY;
end
%接受新产生的点为下一迭代的开始点
if(minfunction(PreX,PreY)-minfunction(NextX,NextY)>0)
PreX=NextX;
PreY=NextY;
AcceptPoints=AcceptPoints+1;
else
change=-1*(minfunction(NextX,NextY)-minfunction(PreX,PreY))/Temperature;
%不接受,保存原解
if(exp(change)>派敬rand)
PreX=NextX;
PreY=NextY;
AcceptPoints=AcceptPoints+1;
end
end
end
%结束条件为根据上一个最优解与最新的一个最优解的之差小于某个容差
if(~(abs(minfunction(BestX,BestY)-minfunction(PreBestX,PreBestY))>Tolerance))
break
end
end
a=BestX
b=BestY
c=minfunction(BestX,BestY)
%%%%%%%%%%%%%子程序%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function minf=minfunction(x,y)
minf=sin(x*y)+x*x+y*y;%求目标函数的值为0.
format long
XMAX=4; %搜索的最大区间
YMAX=4; %搜索的最大区间
MarkovLength=10000; %马可夫链长度
DecayScale=0.95; %衰减参数0.95
StepFactor=0.02; %步长因子
Temperature=100; %初始温度
Tolerance=1e-8; %容差
AcceptPoints=0.0; %Metropolis过程中总接受点
PreX=-XMAX*rand; %初始的搜索值
PreY=-YMAX*rand; %初始的搜索值
PreBestX=PreX; %上一个最优解
PreBestY=PreY; %上一个最优解
BestX=PreX; %最终解
BestY=PreY; %最终解
while(1)
Temperature=Temperature*DecayScale; %每迭代一次退旅旁火一次(降温),直到满足迭代条件为止
AcceptPoints=0.0;
%在当前温度下迭代(即MARKOV链长度)次
for i=0:1:MarkovLength
while(1)
NextX=PreX+StepFactor*XMAX*(rand-0.5); %在初始点附近随机选下一点
NextY=PreY+StepFactor*YMAX*(rand-0.5); %在初始点附近随机选下一点
%判断新产生的点是否在规定的最大搜索区间内,若在,则退出循环,不在,继续循环,直到新产生的点在规定的最大搜索区间内
if((NextX>=-XMAX && NextX<=XMAX && NextY>=-YMAX && NextY<=YMAX))
break %退出循环
end
end
%判拆羡橡断新产生点与原来最优点哪个更优
if(minfunction(BestX,BestY)>minfunction(NextX,NextY))
PreBestX=BestX; %保留上一个最优解
PreBestY=BestY;
BestX=NextX; %新的最优解
BestY=NextY;
end
%接受新产生的点为下一迭代的开始点
if(minfunction(PreX,PreY)-minfunction(NextX,NextY)>0)
PreX=NextX;
PreY=NextY;
AcceptPoints=AcceptPoints+1;
else
change=-1*(minfunction(NextX,NextY)-minfunction(PreX,PreY))/Temperature;
%不接受,保存原解
if(exp(change)>派敬rand)
PreX=NextX;
PreY=NextY;
AcceptPoints=AcceptPoints+1;
end
end
end
%结束条件为根据上一个最优解与最新的一个最优解的之差小于某个容差
if(~(abs(minfunction(BestX,BestY)-minfunction(PreBestX,PreBestY))>Tolerance))
break
end
end
a=BestX
b=BestY
c=minfunction(BestX,BestY)
%%%%%%%%%%%%%子程序%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function minf=minfunction(x,y)
minf=sin(x*y)+x*x+y*y;%求目标函数的值为0.
![](https://ecmc.bdimg.com/public03/b4cb859ca634443212c22993b0c87088.png)
2024-10-13 广告
是的。传统上,对于符合要求的内毒素检测,最终用户必须从标准内毒素库存瓶中构建至少一式两份三点标准曲线;必须有重复的阴性控制;每个样品和PPC必须一式两份。有了Sievers Eclipse内毒素检测仪,这些步骤可以通过使用预嵌入的内毒素标准...
点击进入详情页
本回答由Sievers分析仪提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询