24小时热门版块排行榜    

CyRhmU.jpeg
查看: 2968  |  回复: 9
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

飞鸿印雪jay

银虫 (小有名气)

[求助] 关于非线性最小二乘拟合的问题已有3人参与

我在matlab中调用这个函数LSQNONLIN,这是非线性最小二乘法,其包含两个算法,trust region reflective and Levenberg-Marquardt,但是我找到的书上是把trust region reflective法归为无约束多维极值问题,百度上还说Levenberg-Marquardt是trust region reflective法的一种?究竟是怎么样的啊?
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

飞鸿印雪jay

银虫 (小有名气)

引用回帖:
6楼: Originally posted by 月只蓝 at 2014-08-27 20:01:09
最小二乘问题,本质上是最优化问题,算法不同,找到的解不一定相同,有的算法能找到全局最优解,有的只能找到局部最优解。找出的解的优越性,可通过相关系数、决定系数来判断。Levenberg-Marquardt和trust-region- ...

function six
format long
clear all
clc
tspan = [0        5        10        15        20        25        30        35        40        45        50        60        70        80        90        100        110 120];
x0 = [0.625342136        0.4277651        0.105943812        0.025723604        0.068458848        0.024280873];
k0 = [0  0  0  0  0  0  0  0   0  0  0  0  0  0  0];   %初值影响结果和拟合曲线
lb = [0  0  0  0  0  0  0   0   0   0   0  0  0  0  0];
ub = [];
options=optimset ('MaxFunEvals',900,'MaxIter', 900,'TolFun',1e-6 ,'TolX',1e-6);% 'Algorithm','levenberg-marquardt'
data=[

0.426497671        0.497339486        0.142025477        0.035090359        0.092890445        0.029854978
0.364294441        0.531501605        0.168117836        0.043136361        0.12057094        0.04928427
0.282498683        0.547077762        0.189668188        0.048822175        0.131956864        0.046858784
0.212605727        0.514167749        0.197954862        0.052949232        0.152963586        0.087585303
0.164747872        0.505213939        0.2149634        0.059265477        0.171651807        0.069189738
0.121489746        0.498609347        0.241653892        0.068929957        0.20397071        0.083896341
0.097513728        0.477379331        0.249727987        0.07289705        0.218884281        0.092080203
0.067200762        0.446186417        0.266194438        0.080524446        0.248121593        0.116558008
0.054994421        0.439029489        0.285465434        0.089772626        0.284305489        0.129282266
0.037566506        0.379466296        0.269368897        0.086289166        0.279633537        0.133442735
0.023114503        0.339137907        0.280855057        0.094689189        0.31863228        0.160250254
0.014416665        0.298370384        0.283002041        0.099613179        0.346807226        0.190914639
0.008962296        0.252702001        0.270900503        0.099468657        0.362646478        0.211507797
0.004440918        0.205484131        0.258866251        0.100635933        0.384374958        0.233976586
0.003384414        0.17228843        0.245343436        0.100783129        0.408520669        0.270125675
0.001097832        0.126954121        0.21601133        0.094095289        0.405977951        0.287462314
0.000364687        0.104930458        0.197777161        0.090126427        0.404440384        0.275667765
];
yexp = data(:,1:6);

[k,resnorm,residual,exitflag,output,lambda,jacobian] =...
lsqnonlin(@ObjFunc,k0,lb,ub,options,tspan,x0,yexp);              %非线性最小二乘   
ci = nlparci(k,residual,jacobian);                           %参数的置信区间,置信区间越窄越好
fprintf('\n\n使用函数lsqnonlin()估计得到的参数值为:\n')
fprintf('\tk(1) = %.9f ± %.9f\n',k(1),ci(1,2)-k(1))
fprintf('\tk(2) = %.9f ± %.9f\n',k(2),ci(2,2)-k(2))
fprintf('\tk(3) = %.9f ± %.9f\n',k(3),ci(3,2)-k(3))
fprintf('\tk(4) = %.9f ± %.9f\n',k(4),ci(4,2)-k(4))
fprintf('\tk(5) = %.9f ± %.9f\n',k(5),ci(5,2)-k(5))
fprintf('\tk(6) = %.9f ± %.9f\n',k(6),ci(6,2)-k(6))
fprintf('\tk(7) = %.9f ± %.9f\n',k(7),ci(7,2)-k(7))
fprintf('\tk(8) = %.9f ± %.9f\n',k(8),ci(8,2)-k(8))
fprintf('\tk(9) = %.9f ± %.9f\n',k(9),ci(9,2)-k(9))
fprintf('\tk(10) = %.9f ± %.9f\n',k(10),ci(10,2)-k(10))
fprintf('\tk(11) = %.9f ± %.9f\n',k(11),ci(11,2)-k(11))
fprintf('\tk(12) = %.9f ± %.9f\n',k(12),ci(12,2)-k(12))
fprintf('\tk(13) = %.9f ± %.9f\n',k(13),ci(13,2)-k(13))
fprintf('\tk(14) = %.9f ± %.9f\n',k(14),ci(14,2)-k(14))
fprintf('\tk(15) = %.9f ± %.9f\n',k(15),ci(15,2)-k(15))
fprintf('The sum of the squares is: %.9e\n\n',resnorm)
fprintf('The value of the exitflag is: %.9e\n\n',exitflag)
output

function f = ObjFunc(k,tspan,x0,yexp)                            % 目标函数
[t, Xsim] = ode45(@KineticsEqs,tspan,x0,[],k); %四阶,五级Runge-Kutta单步算法
Xsim1=Xsim(:,1);
Xsim2=Xsim(:,2);
Xsim3=Xsim(:,3);
Xsim4=Xsim(:,4);
Xsim5=Xsim(:,5);
Xsim6=Xsim(:,6);

ysim(:,1) = Xsim1(2:end);
ysim(:,2) = Xsim2(2:end);
ysim(:,3) = Xsim3(2:end);
ysim(:,4) = Xsim4(2:end);
ysim(:,5) = Xsim5(2:end);
ysim(:,6) = Xsim6(2:end);

size(ysim(:,1));
size(ysim(:,2));
size(ysim(:,3));
size(ysim(:,4));
size(ysim(:,5));
size(ysim(:,6));

size(yexp(:,1));
size(yexp(:,2));
size(yexp(:,3));
size(yexp(:,4));
size(yexp(:,5));
size(yexp(:,6));

R2=1-sum((ysim-yexp).^2)./sum((mean(ysim)-yexp).^2);
fprintf('\n\t决定系数R-Square = %.6f',R2);

f = [(ysim(:,1)-yexp(:,1)) (ysim(:,2)-yexp(:,2)) (ysim(:,3)-yexp(:,3)) (ysim(:,4)-yexp(:,4)) (ysim(:,5)-yexp(:,5)) (ysim(:,6)-yexp(:,6))];%
%拟合结果标绘
plot(tspan(2:end),yexp(:,1),'bx',t,Xsim(:,1),'b-',tspan(2:end),yexp(:,2),'bx',t,Xsim(:,2),'b-',tspan(2:end),yexp(:,3),'bx',t,Xsim(:,3),'b-',tspan(2:end),yexp(:,4),'bx',t,Xsim(:,4),'b-',tspan(2:end),yexp(:,5),'bx',t,Xsim(:,5),'b-',tspan(2:end),yexp(:,6),'bx',t,Xsim(:,6),'b-')
xlabel('time(min)')
ylabel('concentration(mg/mL)')
legend('cAexp','cAcal','cBexp','cBcal') %,'cDexp','cDcal','cEexp','cEcal','cFexp','cFcal'

function dCdt = KineticsEqs(t,C,k)                                  % ODE模型方程
dCAdt =-(k(1)+k(2)+k(3)+k(4)+k(5))*C(1);                            %注意负号不能少!!!
dCBdt =k(1)*C(1)-(k(6)+k(7)+k(8)+k(9))*C(2);
dCCdt =k(2)*C(1)+k(6)*C(2)-(k(10)+k(11)+k(12))*C(3);
dCDdt =k(3)*C(1)+k(7)*C(2)+k(10)*C(3)-(k(13)+k(14))*C(4);
dCEdt =k(4)*C(1)+k(8)*C(2)+k(11)*C(3)+k(13)*C(4)-k(15)*C(5);
dCFdt = k(5)*C(1)+k(9)*C(2)+k(12)*C(3)+k(14)*C(4)+k(15)*C(5);
dCdt = [dCAdt; dCBdt;dCCdt;dCDdt;dCEdt;dCFdt]; %



我想将R2算出来,但是计算时提示维数不对,改了半天,但是还是改不出来,麻烦大神给看下。还有对我的这个程序,大神能不能帮忙看下有什么地方还能修改的?希望能提出宝贵意见。由于参数多于方程,我一直担心拟合的多值问题。不知道拟合到什么程度算是达到标准了?我试过将算出的k值带入,返算各个C的值,任有部分c值的平均误差大于10%,这是我返算后得到的相对误差。(-12.39%         -4.19%        -4.26%        -11.89%        -3.83%        -6.72%)不知道还能怎么改进了。
还有k的初值,是不是用1stop跑下才能定比较好呢?谢谢大神!!!
8楼2014-08-29 18:24:28
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 10 个回答

月只蓝

主管区长 (职业作家)

【答案】应助回帖

感谢参与,应助指数 +1
以我的了解,Levenberg-Marquardt和trust region reflective不是同一种算法。具体可参见清华大学出版社的《最优化理论与算法》。
纠结具体算法意义不大。
直接调用该函数,用默认的算法即可,如果出现算法设置不合理,MATLAB会提示你的,到时候你换另外一个就行了。
MATLAB、MS小问题、普通问题请发帖求助!时间精力有限,恕不接受无偿私信求助。
2楼2014-08-25 21:15:24
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

飞鸿印雪jay

银虫 (小有名气)

引用回帖:
2楼: Originally posted by 月只蓝 at 2014-08-25 21:15:24
以我的了解,Levenberg-Marquardt和trust region reflective不是同一种算法。具体可参见清华大学出版社的《最优化理论与算法》。
纠结具体算法意义不大。
直接调用该函数,用默认的算法即可,如果出现算法设置不合 ...

谢谢啊,我看下。主要在论文当中会写到用什么算法,所以才纠结的。
3楼2014-08-27 16:34:40
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

月只蓝

主管区长 (职业作家)

【答案】应助回帖

引用回帖:
3楼: Originally posted by 飞鸿印雪jay at 2014-08-27 16:34:40
谢谢啊,我看下。主要在论文当中会写到用什么算法,所以才纠结的。...

你用其中一种算法,看哪种能运行得通。然后说明用了该算法即可。我印象中对于参数有约束的问题,Levenberg-Marquardt不适用,trust region reflective算法适用,在MATLAB中help LSQNONLIN,即可找到相关文献,在论文中引用即可。比如trust region reflective算法的文献:
[1] Byrd, R.H., R.B. Schnabel, and G.A. Shultz, Approximate Solution of the Trust Region
Problem by Minimization  over Two-Dimensional Subspaces,  Mathematical Programming,
247-263, 1988。
[2]  Steihaug,  T ,  The  Conjugate  Gradient  Method  and  Trust  Regions  in  Large  Scale
Optimization, SIAM Journal on Numerical Analysis, 626-637, 1983。
MATLAB、MS小问题、普通问题请发帖求助!时间精力有限,恕不接受无偿私信求助。
4楼2014-08-27 16:58:17
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
信息提示
请填处理意见