引用:
作者: anbcjys
用优化算法可以 它们对初始不要求
|
优化方法有不少啊 …… 我试过模拟退火法,不知道是不是我编得不对,误差竟然以1e-6的数量级一点一点减小!!! 实在太慢了 ……
您能帮我看看错哪儿了吗? 多谢了!
function [x0,f0]=Opt_Simu(f,x0,l,u,kmax,q,TolFun)
%%%%%%%% 第一步,根据输入变量数,将默写量设为默认值。
if nargin<7
TolFun=1e-8;
end
if nargin<6
q=1;
end
if nargin<5
kmax=100;
end
%%%%%%%%%%%% 第二步,求解一些基本变量
N=length(x0);
x=x0;
fx=feval(f,x);
x0=x;
f0=fx;
%%%%%%%%%%%% 第三步,进行迭代计算,找出近似全局最小点。
for k=0:kmax
Ti=(k/kmax)^q;
mu=10^(Ti*100);
dx=Mu_Inv(2*rand(size(x))-1,mu).*(u-l);
x1=x+dx;
x1=(x1 < l).*l+(l <= x1).*(x1 <= u).*x1+(u < x1).*u;
fx1=feval(f,x1);
df=fx1-fx;
if df < 0 | rand < exp(-Ti*df/(abs(fx) +eps)/TolFun)
x=x1;
fx=fx1;
end
if fx<f0
x0=x;
f0=fx1;
end
end
其中,
function x=Mu_Inv(y,mu)
x=(((1+mu).^abs(y)-1)/mu).*sign(y);
另外,退火法里面的f我定义的是f=@fun422
function F=fun422(X)
data(:,1)=importdata('xdata.txt');
data(:,2)=importdata('ydata.txt');
nt=100;
data_nt=data(1:nt,1:2);
tt=importdata('tt.txt');
for i=1:nt
d=tt(i+1)-tt(i);
for j=0:i-1
sc1_data_nt(j+1)=data_nt(i-j,1)*gamma(j-X(5))/gamma(j+1);
end
sc2_data_nt=cumsum(sc1_data_nt);
fun4202_D_data_nt(i)=d^(-X(5))*sc2_data_nt(i)/gamma(-X(5));
end
fun4202_D_data_nt=fun4202_D_data_nt';
sum=0;
for i=1:nt
f(i)=(X(1)*data_nt(i,1)+X(2)*data_nt(i,1).^2+X(3)*data_nt(i,1).^3+X(4)*fun4202_D_data_nt(i)-data_nt(i,2))^2;
sum=sum+f(i);
end
F=sum;
请不吝指教,谢谢!!