使用Numpy最小二乘方法同时进行两个方程的数值拟合

时间:2018-09-29 22:32:55

标签: python numpy scipy curve-fitting least-squares

我正在尝试使用python minimumsq方法拟合下面提到的两个方程,但是不确定这是否是正确的方法。第一个方程具有不完整的伽马函数,而第二个方程则稍有复杂,并且与指数函数一起包含通过使用单独的拟合公式获得的项。

J_mg = T_incomplete(hw/T_mag)
J_nmg = e^(-hw/T)*g(w,T)

此处g是w和T的函数,并使用给定的拟合公式进行计算。 我正在按照this问题中概述的步骤进行操作。

这是我所做的

import numpy as np
from scipy.optimize import leastsq
from scipy.special import gammaincc
from scipy.special import gamma
from matplotlib.pyplot import plot


# generating data

NPTS = 10
hw = np.linspace(0.5, 10, NPTS)
j1 = np.linspace(0.001,10,NPTS)
j2 = np.linspace(0.003,10,NPTS)
T_mag = np.linspace(0.3,0.5,NPTS)

#defining functions

def calc_gaunt_factor(hw,T):
    fitting_coeff= np.loadtxt('fitting_coeff.txt', skiprows=1)
    #T is in KeV
    #K_b = 8.6173303(50)e−5 ev/K

    g = 0
    gamma = 0.0136/T
    theta= hw/T
    A= (np.log10(gamma**2) +0.5)*0.4
    B= (np.log10(theta)+1.5)*0.4
    for i in range(11):
        for j in range(11):
            g_ij = fitting_coeff[i][j]*(A**i)*(B**j)
            g = g_ij+g        
    return g

def j_w_mag(hw,T_mag):
    order= 0.001
    return np.sqrt(1/T_mag)*gamma(order)*gammaincc(order,hw/T_mag)

def j_w_nonmag(hw,T):
    gamma = 0.0136/T
    theta= hw/T
    return np.sqrt(1/T)*np.exp((-hw)/T)*calc_gaunt_factor(hw,T)

def residual_func(T,T_mag,hw,j1,j2):
    err_unmag = np.nan_to_num(j1 - j_w_nonmag(hw,T))
    err_mag = np.nan_to_num(j2 - j_w_mag(hw,T_mag))
    err= np.concatenate((err_unmag, err_mag))
    return err


par_init = np.array([.35])

best, cov, info, message, ler = leastsq(residual_func,par_init,args=(T_mag,hw,j1,j2),full_output=True)

print("Best-Fit Parameters:")
print("T=%s" %(best[0]))

我的拟合参数T越来越奇怪。这是正确的方法吗?谢谢。

0 个答案:

没有答案