我的一大毛病就是实用主义。实用主义的好处是短期效率较高,而坏处是没有足够的灵活性,也容易出错。
我的工作中的一个重要操作是拟合曲线,这在IDL中是比较容易的,按格式写好表达式,比如
expr='P[0]*exp(-((x-P[1])/P[2])^2/2.0)+P[3]'
然后再猜个初值
start=[max13co,center,0.3,0.0]
然后就可以对数据(下面的例子中z13co,spec13co分别是数据的横、纵坐标值,rerr是误差值)进行拟合了,
result=MPFITEXPR(expr,z13co,spec13co,rerr,start)
通常这样就可以,不过,和其他迭代方法一样,这样的数据拟合也是依赖于初值的选取的,初值选得够好,计算速度就快,也能得到正确的结果。一般来说,随便选
个初值也能得出正确结果,只是慢一些。但是偶尔也会出现无论怎么选初值也无法得到正确结果的情况。这个时候就需要额外的处理了,那就是给拟合加一些限制,
对于MPFITEXPR函数来说,就是加一个参数PARINFO,如下
result=MPFITEXPR(expr,z13co,spec13co,rerr,start,PARINFO=pc)
其中
pc=replicate({fixed:0,limited:[0,0],limits:[0.D,0.D]},4)
是一个结构体,其中记录了对拟合参数的要求。一些例子如下
pc(0).fixed=1
表面固定第一个参数;
pc(1).limited(0)=1
表示对第二个参数加下限,
pc(1).limits(0)=center-0.1
表示对第二个参数的下限值;
pc(1).limited(1)=1
表示对第二个参数加上限,
pc(1).limits(1)=center+0.1
表示对第二个参数的下限值;
加了足够好的对参数的限制之后,通常就能得到正确的拟合结果了。但是根据我的实践,仍然有例外,这个时候,除了手动干预,好像就没什么更好的办法了。
https://blog.sciencenet.cn/blog-117333-670583.html
上一篇:
天文塔木德(一)谱线基本公式下一篇:
IDL中曲线拟合的一个注意事项 (外一篇:以谱线拟合为例)