楼主: 胡烨1992
13275 3

[问答] matlab中关于nlinfit函数初始值的选定 [推广有奖]

  • 0关注
  • 17粉丝

硕士生

78%

还不是VIP/贵宾

-

威望
0
论坛币
1374 个
通用积分
2.4336
学术水平
15 点
热心指数
25 点
信用等级
17 点
经验
4296 点
帖子
189
精华
0
在线时间
200 小时
注册时间
2013-2-28
最后登录
2020-6-5

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
本人是matlab的菜鸟啊,问大神们一个问题啊,做非线性拟合时选取的初值不同,系数拟合的结果往往也不同,到底什么样的结果才是最好的呢?本人想在真实值附近找一个区间,通过一个较小的步长来穷举,最后选残差最小的那组系数。。。无奈程序老是报错,求大神们看看啊!!!

主程序:
A=[33.35                      1854 34.78                      1857 36.22                      1948 37.66                      201739.09                      209240.53                      2197 41.76                      2608 42.81                      2937 43.9                      311944.94                      3654];process=A(:,1);  %自变量price=A(:,2);  %因变量aa=0.0001:0.0001:0.5;  %穷举第一个系数bb=0.001:0.001:0.5;  %穷举第二个系数cc=1701:1900;  %穷举第三个系数rr=[];  %设定一个三维空矩阵放残差low=[1e-008,1e-008,1500];  %系数beta的下线up=[2,2,2500];  %系数beta的上限for i=1:5000;    for m=1:500;        for k=1:200;beta0=[aa(1,i),bb(1,m),cc(1,k)]';  %初值[beta,r]=nlinfit(process,price,@myfun,beta0);  %调用myfun函数if beta<low | beta>up;  %系数返回值不符合要求的话,残差就定义为0    flag=0;else    flag=r'*r;  %计算残差end;rr(i,m,k)=flag;  %得出三维残差阵        end;    end;end;rmin=nanmin(nanmin(nanmin(rr)))   %找出最小的残差[ii,mm,kk]=find(rr==rmin)  %找出最小残差的位置
函数:function yy=myfun(beta,x)a=beta(1);b=beta(2);c=beta(3);yy=a*exp(b*x)+c;
此程序一直报错:??? Error using ==> nlinfit>checkFunVals at 356MODELFUN has returned Inf or NaN values.
Error in ==> nlinfit>LMfit at 303    if funValCheck && ~isfinite(sse),    checkFunVals(r); end
Error in ==> nlinfit at 166    [beta,J,lsiter,cause] = LMfit(X,y,    model,beta,options,verbose,maxiter);
Error in ==> fangjia at 24[beta,r]=nlinfit(process,price,@myfun,beta0);
我看不懂啊,怎样才能在函数不收敛的时候跳过去接着计算下一个啊,大神们快帮我看看!!!



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:nlinfit MATLAB matla atlab Nlin matlab nlinfit 初值设置 穷举

沙发
胡烨1992 发表于 2013-3-29 14:56:09 |只看作者 |坛友微信交流群
第一次发帖,编辑的时候明明是分行的,怎么发出来就全堆一起了?

使用道具

藤椅
胡烨1992 发表于 2013-3-29 15:16:27 |只看作者 |坛友微信交流群
再发一遍:
A=[33.35    1854
34.78      1857
36.22      1948
37.66      2017
39.09       2092
40.53       2197
41.76      2608
42.81      2937
43.9       3119
44.94        3654
];
process=A(:,1);%自变量
price=A(:,2); %因变量
aa=0.0001:0.0001:0.5;  %穷举第一个系数
bb=0.001:0.001:0.5; %穷举第二个系数
cc=1701:1900; %穷举第三个系数
rr=[]; %设定一个三维空矩阵放残差
low=[1e-008,1e-008,1500];  %系数beta的下线
up=[2,2,2500]; %系数beta的上限
for i=1:5000;
    for m=1:500;
        for k=1:200;
beta0=[aa(1,i),bb(1,m),cc(1,k)]';  %初值
[beta,r]=nlinfit(process,price,@myfun,beta0); %调用myfun函数
if beta<low | beta>up; %系数返回值不符合要求的话,残差就定义为0
    flag=0;
else
    flag=r'*r;  %计算残差的平方和
end;
rr(i,m,k)=flag;%得出三维残差阵
        end;
    end;
end;
rmin=nanmin(nanmin(nanmin(rr))) %找出最小的残差
[ii,mm,kk]=find(rr==rmin) %找出最小残差的位置

函数:

function yy=myfun(beta,x)
a=beta(1);
b=beta(2);
c=beta(3);
yy=a*exp(b*x)+c;

报错:
??? Error using ==> nlinfit>checkFunVals at 356
MODELFUN has returned Inf or NaN values.

Error in ==> nlinfit>LMfit at 303
    if funValCheck && ~isfinite(sse),
    checkFunVals(r); end

Error in ==> nlinfit at 166
    [beta,J,lsiter,cause] = LMfit(X,y,
    model,beta,options,verbose,maxiter);

Error in ==> fangjia at 24
[beta,r]=nlinfit(process,price,@myfun,beta0);

我看不懂啊,怎样才能在函数不收敛的时候跳过去接着计算下一个啊,大神们快帮我看看!!!

使用道具

板凳
xingpeng 在职认证  发表于 2018-8-4 17:53:12 |只看作者 |坛友微信交流群
楼主  最后解决了吗?能否把代码贴出来呀

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-11-10 02:12