登录论坛

查看完整版本 : [MATLAB基础] 求助!!! 请问如何处理非线性函数参数拟合时初值敏感的问题?万分感谢!


qq437544897
2011-04-24, 17:20
各位高手s,请问谁有曲线参数拟合对初值不那么敏感的自编MATLBA程序代码啊? 传一份救救急吧! 叩谢! 叩谢! 要疯啦 ……

附件有我问题的相关文件,一个自编的没办法稳定实现系数拟合的程序,一份原始数据,一个目标公式。

[email protected]

anbcjys
2011-04-25, 05:34
用优化算法可以 它们对初始不要求

slgu
2011-04-25, 10:55
这个问题难度较大,内含积分形式不太好处理,若能将积分部分以原函数的形式表示,问题可相对简单一些。另外,数据文件中哪些是xdata, 哪些为ydata? 函数的似乎形式也有问题,第二个等于号难于让人看得懂。

qq437544897
2011-04-25, 13:22
这个问题难度较大,内含积分形式不太好处理,若能将积分部分以原函数的形式表示,问题可相对简单一些。另外,数据文件中哪些是xdata, 哪些为ydata? 函数的似乎形式也有问题,第二个等于号难于让人看得懂。

xdata是data的第一列,ydata是data的第二列。不好意思,没有表述清楚。

至于第二个等号,这是分数倒数模型,不管要不要系数x(4),最后一项都是一个闭合的类椭圆型。这个看着比较复杂的式子实际上是一种分数倒数的定义,当然也有离散形式。对于第四项,我上传的附件里的程序里已经体现出来了,请您过目。nihe.m是主程序。

谢谢!

qq437544897
2011-04-25, 13:27
用优化算法可以 它们对初始不要求

优化方法有不少啊 …… 我试过模拟退火法,不知道是不是我编得不对,误差竟然以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;

请不吝指教,谢谢!!

slgu
2011-04-28, 10:29
结果如图,不知能否发出,先试一下。