使用optimize.leastsq()在一组方程中进行最小二乘法(Python)

3
我有两个函数和一组数据。这两个函数都有相同的x数据和参数。我想通过最小二乘法来获得最优拟合我的数据的参数。
这些参数是:ex,ey,ez。
X数据是:RA,DE(大约3000个点)。
Y数据是:dRA,dDE。
我尝试过这个方法,但是得到了错误的解决方案:
def residuals(p, dRA, dDE, RA, DEC):
    ex,ey,ez = p
    f1 = dRA-(ex*sin(DEC)*cos(RA)+ey*sin(DEC)*sin(RA)-ez*cos(DEC))
    f2 = dDE-(-ex*sin(RA)+ey*cos(RA))
    err = np.concatenate((f1,f2))
    return err

from scipy.optimize import leastsq
p0 = [0, 0., 0.]
plsq_coord = leastsq(residuals, p0, args=(dRA, dDE, RA, DE))
print plsq_coord[0] 

任何形式的帮助都将不胜感激。

1个回答

1

如此测试代码所示

import numpy as np, numpy.random,scipy.optimize
def residuals(p, dRA, dDE, RA, DEC):
    ex,ey,ez = p
    f1 = dRA-(ex*np.sin(DEC)*np.cos(RA)+ey*np.sin(DEC)*np.sin(RA)-ez*np.cos(DEC))
    f2 = dDE-(-ex*np.sin(RA)+ey*np.cos(RA))
    err = np.concatenate((f1,f2))
    return err    
ex, ey, ez = 0.2, 0.3, 0.4
N = 100
err = 1e-3
ra, dec = np.random.uniform(0,1,N), np.random.uniform(0,.5,N)
dra = (ex*np.sin(dec)*np.cos(ra)+ey*np.sin(dec)*np.sin(ra)-ez*np.cos(dec))+np.random.normal(size=N)*err
ddec = (-ex*np.sin(ra)+ey*np.cos(ra))+np.random.normal(size=N)*err
print scipy.optimize.leastsq(residuals, p0, args=(dra, ddec, ra, dec))

你的代码应该没问题,除非你的函数写错了(例如,你的ra、dec是以度为单位而不是弧度)或者数据集中有一些坏数据点会影响chisq拟合。


非常感谢。所以我认为我能做的最好的事情就是估计误差。有什么想法吗? - user1404919

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接