подбор кривой для 3 наборов данных с одним общим параметром - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть файл Excel с разными листами (образцами). Мне нужен 2-й столбец (время) и 5-й столбец (масса влаги) каждого листа (образец). Используя curve_fit я хочу оптимизировать 3 параметра; один является общим значением (бета) между 3 образцами. Но я сталкиваюсь с некоторыми трудностями. Я попытался импортировать каждый лист отдельно и запустить для каждого образца. и поместил бета в качестве общего параметра:

def sum_4_30_2(N, t2, B, D2):
    z = 0
    for n in np.arange(N + 1):
        don1pi2= ((2 * n+1) * np.pi)**2
        #inside_expo = (-D*t) * (don1pi2) / (4 * (l**2))
        Expo_4_30 = np.exp((-D2 * t2 * (don1pi2)) / (4 * (l_2**2)))
        Makhraj_4_30 = ((don1pi2) * (1 - (don1pi2) * D2 / (4 * B * (l_2**2))))
        z = z + ((8 * Expo_4_30) / Makhraj_4_30)
    return z


def Mt_4_30_2(t2, B, D2, C02):
    turns = 100
    mt_2l_c0 = 1 - (np.exp(-B * t2) * np.sqrt(D2 / (B * (l_2**2))) * np.tan(np.sqrt((B * (l_2**2)) / D2))) - sum_4_30_2(turns, t2, B, D2)
    mt_calc = mt_2l_c0 * ha_2 * C02
    return mt_calc

t2 = time_RH20_2

def predict_2(t2,B,D2,C02):
    smt = []    
    for temp in t2:
        smt.append(Mt_4_30_2(temp, B, D2, C02))
    return smt


def sum_4_30_3(N, t3, B, D3):
    z = 0
    for n in np.arange(N + 1):
        don1pi2 = ((2 * n + 1) * np.pi)**2
        Expo_4_30 = np.exp((-D3 * t3 * (don1pi2)) / (4 * (l_3**2)))
        Makhraj_4_30 = ((don1pi2) * (1 - (don1pi2) * D3 / (4 * B * (l_3**2))))
        z = z + ((8 * Expo_4_30) / Makhraj_4_30)
    return z

def Mt_4_30_3(t3, B, D3, C03):
    turns = 100
    mt_2l_c0 = 1 -(np.exp(-B * t3) * np.sqrt(D3 / (B * (l_3**2))) * np.tan(np.sqrt((B * (l_3**2)) / D3)))- sum_4_30_3(turns, t3, B, D3)
    mt_calc = mt_2l_c0 * ha_3 * C03
    return mt_calc


t3 = time_RH20_3

def predict_3(t3,B,D3,C03):
    smt = []    
    for temp in t3:
        smt.append(Mt_4_30_3(temp, B, D3, C03))
    return smt


def sum_4_30_4(N, t4, B, D4):
    z = 0
    for n in np.arange(N + 1):
        don1pi2= ((2 * n + 1) * np.pi)**2
        Expo_4_30 = np.exp((-D4 * t4 * (don1pi2)) / (4 * (l_4**2)))
        Makhraj_4_30 = ((don1pi2) * (1 - (don1pi2) * D4/(4 * B * (l_4**2))))
        z = z + (( 8 * Expo_4_30) / Makhraj_4_30)
    return z


def Mt_4_30_4(t4, B, D4, C04):
    turns = 100
    mt_2l_c0 = 1 - (np.exp(-B * t4) * np.sqrt(D4 / (B * (l_4**2))) * np.tan(np.sqrt((B * (l_4**2)) / D4))) - sum_4_30_4(turns, t4, B, D4)
    mt_calc = mt_2l_c0 * ha_4 * C04
    return mt_calc


t4 = time_RH20_4

def predict_4(t4, B, D4, C04):
    smt = []    
    for temp in t4:
        smt.append(Mt_4_30_4(temp, B, D4, C04))
    return smt



time = [t2, t3, t4]
Mt=[Mt_RH20_2, Mt_RH20_3, Mt_RH20_4]

def func_3(t,B,D2,D3,D4,C02,C03,C04):
    my=[]
    for t in time:
        if t == t2:
            return predict_2(t2, B, D2, C02)
        if t == t3:
            return predict_3(t3, B, D3, C03)
        if t == t4:
            return predict_4(t4, B, D4, C04 )
        raise Exception('Data outside fitting range')


from scipy.optimize import curve_fit

g = [0.2, 7.53e-6, 7.53e-6, 7.53e-6, 0.045, 0.045, 0.045]

bnds = ([0, 0, 0, 0, 0, 0, 0],[np.inf, 1, 1, 1, 1, 1, 1 ])
c,cov = curve_fit(func_3, time, Mt, g, bounds=bnds )

, для этого он дает мне ошибку "установки элемента массива с последовательностью"

Я также пытался импортировать лист Excel с pandas и извлеченными столбцами 2 и 5 в качестве упорядоченного словаря, но я не могу вызвать каждый столбец к новому списку значений как времени или массы влаги. Я не знаю, как сделать для l oop, что он получает с каждого листа значение столбца 2 и столбца 5 и работает с формулой.

...