登录论坛

查看完整版本 : 非线性曲线拟合并求系数的问题


chm818
2009-01-12, 17:05
函数为:y=0.1+(a-0.1).*(1-erf(x./(2.*sqrt(b.*7776000))));
erf(x)为误差函数,要求x必须为实数,
x=[0.25,0.75,1.25,1.75,2.25,2.75,3.5,4.5,5.5,7,8,10,12,14,16]
y=[2.409099672,1.565396114,0.940174982,0.605753968,0.658565222,0.622579467,...
0.253082852,0.276049767,0.221442495,0.157116236,0.102593353,0.069936958,...
0.065624737,0.075597258,0.062826299];
现在要用最小二乘法求解a和b的值来,我用cftool做的时候,用上面的函数表达式,提示input必须为实数,拟合无法进行,erf里面应该是实数啊,不知道为什么?后来我在erf()外面加了一个abs(),可以拟合了,但是拟合的结果不合适,b应该是正数,却得到了负数的结果来,搞不定,请前辈指点,在线急等回复。
再就是cftool实现的拟合好像不是最小二乘法吧?!

slgu
2009-01-12, 21:35
y=0.1+(b(1)-0.1)*(1-erf(b(2)*x));
b=[2.5503709, 0.44392804]

chm818
2009-01-12, 21:48
多谢回复,您的y表达式跟我的不一样噢!这样得到结果就会不同!

slgu
2009-01-13, 09:33
solve('1/(2*sqrt(b*7776000))-.44392804')
ans =
0.0000001631393028
不就一样了吗?!

chm818
2009-01-13, 16:37
多谢,的确是因为b值接近于零缘故,我后来将sqrt(b.*7776000)=c,函数就变成
y=0.1+(a-0.1).*(1-erf(x/(2*c))),果然没有出现上面的问题,拟合出了a和c,利用sqrt(b.*7776000)=c再求出了b,这样应该没有什么问题吧。但是b值数量级应当在e-12左右,计算结果在e-7,不知是试验数据有问题还是计算方法有误!

谢谢各位指教!

提前预祝大家新春快乐,新年有气象!

wrshl
2009-05-30, 11:32
可以看下这个,LabVIEW编的非线性曲线拟合软件,不需要初始值就可以进行拟合求出函数的系数值。

http://www.pudn.com/downloads168/sourcecode/math/detail775986.html