查看单个帖子
旧 2011-04-25, 13:27   #5
qq437544897
初级会员
 
注册日期: 2011-04-23
年龄: 39
帖子: 4
声望力: 0
qq437544897 正向着好的方向发展
默认 回复: 求助!!! 请问如何处理非线性函数参数拟合时初值敏感的问题?万分感谢!

引用:
作者: 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;

请不吝指教,谢谢!!
qq437544897 当前离线   回复时引用此帖