查看: 578|回复: 19|关注: 0

[已解决] lsqcurvefit 初值问题,拟合的参量值就是自己设置的初值,不知道是否有问题

[复制链接]

新手

7 麦片

财富积分


050


3

主题

21

帖子

0

最佳答案
各位大神好,初用matlab进行参数拟合,使用的是lsqcurvefit函数,发现初值的设置对于拟合结果具有挺大影响,重点是不知道为什么拟合的参数就是自己设置的初值,求各位大佬解答一下,感激不尽。下面是程序和原始数据。这个是根据特定公式拟合,所以不能换公式,谢啦。

A=importdata('20190815.txt');
xdata=A(:,1); %导入txt第一列数据
ydata=A(:,2); %导入txt第二列数据

a=1.22981181501736e-05;%  a b d t g是一些常数
b=1.64775102019828e-16;
d=0.0308799383749013;
t=3.87489375000000e-14;
g=0.03;
f=@(c,xdata)(g.*a.*(psi(0.5+b./(d.*c(1).*abs(xdata)))-psi(0.5+b./(d.*t.*abs(xdata)))-log(t./c(1))));
c=lsqcurvefit(f,c0,xdata,ydata);

plot(xdata,ydata,xdata,f(c,xdata),'color',[rand rand rand])


(其实g也是未知参量,但是由于两个参数拟合我能力有限,烦请大佬帮忙看看单个参量拟合,如何有空的话顺便看看两个参量拟合,感激不尽感激不尽!!!)

20190815.txt

28.3 KB, 下载次数: 3

论坛优秀回答者

中级

1040 麦片

财富积分


5001500


0

主题

2544

帖子

225

最佳答案
  • 关注者: 146
发表于 2019-8-15 21:44:51 | 显示全部楼层
参考下1stOpt的计算结果:

均方差(RMSE): 8.60800528044435E-9
残差平方和(SSR): 1.17815430303971E-13
相关系数(R): 0.99821409475324
相关系数之平方(R^2): 0.996431378964031
修正R平方(Adj. R^2): 0.996426881647035
确定系数(DC): 0.996421617771949
卡方系数(Chi-Square): 1.94993749963995E-7
F统计(F-Statistic): 444820.083545817

参数        最佳估算
----------        -------------
g        0.0225081863559333
c1        5.08590244555317E-13

t1.jpg

入门

63 麦片

财富积分


50500


0

主题

152

帖子

11

最佳答案
发表于 2019-8-16 06:40:49 | 显示全部楼层
SSy =   3.2924e-11
fx=@(b,x)b(1)*(psi(0.5+b(2)./abs(x))-psi(0.5+b(2)./abs(x)+b(3)));
b =[0.00141612118  0.06287620264  -0.0001000179417];
RSS = 1.11767804864e-13
MSe = 7.0472e-17
R^2 =   0.99661

新手

7 麦片

财富积分


050


3

主题

21

帖子

0

最佳答案
 楼主| 发表于 2019-8-16 13:42:48 | 显示全部楼层
shihe 发表于 2019-8-15 21:44
参考下1stOpt的计算结果:

均方差(RMSE): 8.60800528044435E-9

谢谢,谢谢。不知道您有没有1stOpt的安装包啊,可以发我一个吗?我的邮箱是476702269@qq.com
可以把 代码顺便粘贴上来吗?万分感谢!

新手

7 麦片

财富积分


050


3

主题

21

帖子

0

最佳答案
 楼主| 发表于 2019-8-16 13:44:35 | 显示全部楼层
顾世梁 发表于 2019-8-16 06:40
SSy =   3.2924e-11
fx=@(b,x)b(1)*(psi(0.5+b(2)./abs(x))-psi(0.5+b(2)./abs(x)+b(3)));
b =[0.001416121 ...

我有点看不明白,您这是把我的公式修改了吗?代码是什么,是matlab编写的程序吗?

入门

63 麦片

财富积分


50500


0

主题

152

帖子

11

最佳答案
发表于 2019-8-17 06:06:47 | 显示全部楼层
取个名字吧 发表于 2019-8-16 13:44
我有点看不明白,您这是把我的公式修改了吗?代码是什么,是matlab编写的程序吗? ...

只是对原来的公式简并而已,有些参数实属多余。

新手

7 麦片

财富积分


050


3

主题

21

帖子

0

最佳答案
 楼主| 发表于 2019-8-17 13:24:30 | 显示全部楼层
顾世梁 发表于 2019-8-17 06:06
只是对原来的公式简并而已,有些参数实属多余。

不好意思,请问一下您的初值是怎么确定的?您编的代码可否附上来?

新手

7 麦片

财富积分


050


3

主题

21

帖子

0

最佳答案
 楼主| 发表于 2019-8-17 13:35:21 | 显示全部楼层
顾世梁 发表于 2019-8-17 06:06
只是对原来的公式简并而已,有些参数实属多余。

fx=@(b,x)b(1)*(psi(0.5+b(2)./abs(x))-psi(0.5+b(2)./abs(x)+b(3)));
f=@(c,xdata)(g.*a.*(psi(0.5+b./(d.*c(1).*abs(xdata)))-psi(0.5+b./(d.*t.*abs(xdata)))-log(t./c(1))));
您好,我两个psi函数里的系数是不一样的,不能都用b(2)表示,我大概明白您的意思,将系数都简化到一起,但是我想直接的出来参数测c(1),这是一个需要提取的参量。不知道您初值是怎么确定的,代码是什么,方便的话麻烦您贴上来,万分感谢,麻烦了!

入门

63 麦片

财富积分


50500


0

主题

152

帖子

11

最佳答案
发表于 2019-8-17 20:41:33 | 显示全部楼层
取个名字吧 发表于 2019-8-17 13:35
fx=@(b,x)b(1)*(psi(0.5+b(2)./abs(x))-psi(0.5+b(2)./abs(x)+b(3)));
f=@(c,xdata)(g.*a.*(psi(0.5+b./( ...

用不同的系数,效果似更好一些:
clear,clc
x=xlsread('nh1597');
y=x(:,2);x(:,2)=[];
fx=@(b,x)b(1)*(psi(0.5+b(2)./abs(x))-psi(0.5+b(3)./abs(x)+b(4)));
b=[2.1e-06  0.055  0.055  -0.06];
for l=1:5
    b=lsqcurvefit(fx,b,x,y);
    b=nlinfit(x,y,fx,b);
end
figure(1),clf
plot(x,y,'o');
hold on
x1=linspace(min(x),max(x),300);
y1=fx(b,x1);
plot(x1,y1,'r-','linewidth',2)
n=length(y);
SSy=var(y)*(n-1)
y1=fx(b,x);
RSS=(y-y1)'*(y-y1)
MSe=RSS/(n-4)
Rsqure=(SSy-RSS)/SSy

新手

7 麦片

财富积分


050


3

主题

21

帖子

0

最佳答案
 楼主| 发表于 2019-8-17 21:05:16 | 显示全部楼层
我先消化一下,先行谢过,万分感谢:handshake
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

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