⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tuihuo.m

📁 matlab实现退火算法求解非线性方程组。
💻 M
字号:
clear,clc
%这是退火算法的主程序,它需要调用的函数是
%函数(1)nonLinearSumError1:计算非线性方程组总误差的函数
%函数(2)newSolver1:在一组解的邻域产生另一组解
%函数(3)isSolution:验证方程是否得解
%设置初始值
i=0;T=10001;j=0;%i:同一温度下状态转移次数;T:温度;j:下降温度
precision=0.1;
x1Group=1;%x1Group:可能解的组数
x1N=4;%非线性方程组的元数
x1=round((-0.5+rand(x1Group,x1N))*20);%随机生成-10~10之间的初解
errorHold=Inf;
xHold=0;
%x1=[-7 5 1 -3];
i=0;
while i<200
i=i+1;
j=0;
T=T-50;%退火
while j<200
j=j+1;
functionError1=nonLinearSumError1(x1);%计算x1的误差
x2=newSolver1(x1,functionError1,-10,1,10);%在x1的邻域生成新一组解x2
functionError2=nonLinearSumError1(x2);%计算x2的误差
%检查方程是否得解
[solution1,minError1,isTrue1]=isSolution(x1,functionError1,precision);
[solution2,minError2,isTrue2]=isSolution(x2,functionError2,precision);
if isTrue1==1
%'方程得解'
functionError1
solutiourn
i,j
return
elseif isTrue2==1
%'方程得解'
solution2
functionError2
i,j
return
end
%x1
%x2
if functionError2-functionError1<0
x1=x2;%x2比x1好,用x2取代x1
elseif errorHold-functionError2<0
%x1=xHold;
else
p_x2x1=exp(-log(functionError2-functionError1)/T);
%状态转移概率,注意:误差取对数,因为要解的非线性方程组比较复杂,
%可能解的一点偏差会引起方程很大的变化。所以通过取对数缩小差距。
if rand(1)<p_x2x1 %状态转移
xHold=x1;%hHold:把比较好的解保留下来
errorHold=functionError1;%比较好的解对应的误差
x1=x2;
end
end

end
end
solution1
functionError1
solution2
functionError2

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -