找回密码
 注册
Simdroid-非首页
查看: 127|回复: 3

lsqnonlin拟合时遇到的问题

[复制链接]
发表于 2007-4-22 21:13:59 | 显示全部楼层 |阅读模式 来自 浙江杭州
解一个关于非线性最小二乘的问题,函数是一个积分式:

function F=linestrength(k,linenumber)
for i=1:4
switch linenumber(i)
    case 1
        E=38.4481;
        refS=1.313E-23;
    case 2
        E=57.6704;
        refS=1.476E-23;
    case 3
        E=80.7354;
        refS=1.565E-23;
    case 4
        E=107.6424;
        refS=1.582E-23;
    otherwise
        E=0;
        refS=0;
end

str1=['',num2str(refS),'*(0.27758+0.3629*296-7.4669E-6*296*296+1.4896E-8*296*296*296)./(9.0723+0.33263.*(',num2str(k(1)),'+',num2str(k(2)),'.*x)+1.1806E-5.*(',num2str(k(1)),'+',num2str(k(2)),'.*x).*(',num2str(k(1)),'+',num2str(k(2)),'.*x)+2.7035E-8.*(',num2str(k(1)),'+',num2str(k(2)),'.*x).*(',num2str(k(1)),'+',num2str(k(2)),'.*x).*(',num2str(k(1)),'+',num2str(k(2)),'.*x)).*exp(6.62618E-27.*29979245800.*',num2str(E),'./1.38066E-16.*(1./296-1./(',num2str(k(1)),'+',num2str(k(2)),'.*x))).*7.34E+21./(',num2str(k(1)),'+',num2str(k(2)),'.*x).*((',num2str(k(1)),'+',num2str(k(2)),'.*x)<1500&(',num2str(k(1)),'+',num2str(k(2)),'.*x)>500)+',num2str(refS),'*(0.27758+0.3629*296-7.4669E-6*296*296+1.4896E-8*296*296*296)./(0.27758+0.3629.*(',num2str(k(1)),'+',num2str(k(2)),'.*x)-7.4669E-6.*(',num2str(k(1)),'+',num2str(k(2)),'.*x).*(',num2str(k(1)),'+',num2str(k(2)),'.*x)+1.4896E-8.*(',num2str(k(1)),'+',num2str(k(2)),'.*x).*(',num2str(k(1)),'+',num2str(k(2)),'.*x).*(',num2str(k(1)),'+',num2str(k(2)),'.*x)).*exp(6.62618E-27.*29979245800.*',num2str(E),'./1.38066E-16.*(1./296-1./(',num2str(k(1)),'+',num2str(k(2)),'.*x))).*7.34E+21./(',num2str(k(1)),'+',num2str(k(2)),'.*x).*((',num2str(k(1)),'+',num2str(k(2)),'.*x)<=500&(',num2str(k(1)),'+',num2str(k(2)),'.*x)>70)'];
f=inline(str1,'x');
F(i)=quadl(f,0,55)*1000;
end    (不好意思,str1过多了,写的很乱,不过这个应该没有错误)

然后利用lsqnonlin拟合
[x,resnorm] = lsqnonlin(@parameter1,x0)

可是无论初始值怎么改,得到的x和x0都是一样的,结果总是:
Optimization terminated: first-order optimality less than OPTIONS.TolFun,
and no negative/zero curvature detected in trust region model.

修改了TolFun也不行,这是什么原因呢?

[ 本帖最后由 phoenixkyo 于 2007-4-22 21:15 编辑 ]
发表于 2007-4-22 22:39:52 | 显示全部楼层 来自 陕西西安
Simdroid开发平台
子函数循环是什么意思,主函数是怎么调用的,没有给出具体值,没法帮你调试啊
 楼主| 发表于 2007-4-22 22:49:16 | 显示全部楼层 来自 浙江杭州
子函数就是上面的给出的那个函数,是一个积分式。其实就是在linenumber分别为1234的时候得到四个关于x的积分式。

然后我设定:
xdata=[1 2 3 4];
ydata=[1.0e+003 *
    3.1787    3.7072    4.1096    4.3779];
主函数用的[x,resnorm] = lsqcurvefit(@linstrength,k,xdata,ydata);

无论怎么设置初始值k,都不行。ydata的值就是在k=[300,10];的时候得到的,可是却不能迭代,不知道怎么搞的啊

[ 本帖最后由 phoenixkyo 于 2007-4-22 22:55 编辑 ]
 楼主| 发表于 2007-4-23 11:46:51 | 显示全部楼层 来自 浙江杭州
无论初始值设成多少,运行都是这样的:
x =
   360    15

resnorm =
  1.7034e+006

residual =
  528.0188  620.7661  694.2688  746.4709

exitflag =
     1

output =
    firstorderopt: 0
       iterations: 0
        funcCount: 3
     cgiterations: 0
        algorithm: 'large-scale: trust-region reflective Newton'
          message: [1x137 char]

lambda =
    lower: [2x1 double]
    upper: [2x1 double]

jacobian =
   All zero sparse: 4-by-2

[ 本帖最后由 phoenixkyo 于 2007-4-23 13:13 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-6 23:26 , Processed in 0.032538 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表