[Python] fitting theory with experimental data

Discussão em 'Python' iniciado por Stack, Março 20, 2025.

  1. Stack

    Stack Membro Participativo

    [​IMG]

    I want to do fitting on experimental data and my theory I want to try to find the parameters that fit the same as the theory and experiment do I have to make an algorithm? what algorithm do I use to get a good fitting and mse for each parameter which is very small

    I avoid using modules to do my fitting as much as possible trying to understand how the code works.

    I use this mse

    N = len(y)
    error = (np.sum(y**2) - 2 * np.sum(y * y_t_fit) + np.sum(y_t_fit**2)) / N


    this my code

    import numpy as np
    import matplotlib.pyplot as plt


    #data
    time = np.array([
    0.000,
    0.034,
    0.068,
    0.101,
    0.135,
    0.169,
    0.203,
    0.236,
    0.270,
    0.304,
    0.338,
    0.372,
    0.405,
    0.439,
    0.473,
    0.507,
    0.541,
    0.574,
    0.608,
    0.642,
    0.676,
    0.709,
    0.743,
    0.777,
    0.811,
    0.845,
    0.878,
    0.912,
    0.946,
    0.980,
    1.013,
    1.047,
    1.081,
    1.115,
    1.149,
    1.182,
    1.216,
    1.250,
    1.284,
    1.317,
    1.351,
    1.385,
    1.419,
    1.453,
    1.486,
    1.520,
    1.554,
    1.588,
    1.622,
    1.655,
    1.689,
    1.723,
    1.757,
    1.790,
    1.824,
    1.858,
    1.892,
    1.926,
    1.959,
    1.993,
    2.027,
    2.061,
    2.094,
    2.128,
    2.162,
    2.196,
    2.230,
    2.263,
    2.297,
    2.331,
    2.365,
    2.398,
    2.432,
    2.466,
    2.500,
    2.534,
    2.567,
    2.601,
    2.635,
    2.669,
    2.703,
    2.736,
    2.770,
    2.804,
    2.838,
    2.871,
    2.905,
    2.939,
    2.973,
    3.007,
    3.040,
    3.074,
    3.108,
    3.142,
    3.145
    ])

    y = np.array([
    0.827,
    0.828,
    0.827,
    0.817,
    0.798,
    0.769,
    0.731,
    0.692,
    0.651,
    0.607,
    0.561,
    0.510,
    0.469,
    0.435,
    0.397,
    0.368,
    0.344,
    0.325,
    0.316,
    0.314,
    0.324,
    0.333,
    0.346,
    0.372,
    0.399,
    0.429,
    0.457,
    0.485,
    0.519,
    0.545,
    0.566,
    0.585,
    0.602,
    0.618,
    0.628,
    0.650,
    0.636,
    0.619,
    0.608,
    0.592,
    0.576,
    0.559,
    0.538,
    0.513,
    0.493,
    0.478,
    0.460,
    0.444,
    0.429,
    0.422,
    0.415,
    0.413,
    0.413,
    0.417,
    0.430,
    0.441,
    0.450,
    0.465,
    0.478,
    0.493,
    0.506,
    0.518,
    0.529,
    0.536,
    0.543,
    0.550,
    0.548,
    0.546,
    0.544,
    0.539,
    0.530,
    0.520,
    0.510,
    0.504,
    0.496,
    0.486,
    0.476,
    0.471,
    0.469,
    0.463,
    0.457,
    0.456,
    0.458,
    0.459,
    0.464,
    0.471,
    0.479,
    0.484,
    0.489,
    0.497,
    0.505,
    0.507,
    0.511,
    0.517,
    0.516
    ])

    y -= 0.5

    # find the max
    def max_p (y):
    result = []
    for i in range(1,len(y)-1):
    if y[i-1] < y > y[i+1]:
    result.append(i)
    return result
    max = max_p(y)

    #T1
    y0 = y[max[0]]
    yT = y[max[1]]
    T = time[max[1]] - time[max[0]]

    #T2
    y1 = y[max[1]]
    yT1 = y[max[2]]
    T = time[max[2]] - time[max[1]]

    max = max_p(y)

    peak_values = [y for i in max]



    #Parameter
    A = 0.32
    b = 0.5
    k = 4
    m = 1

    w = np.sqrt(k/m - (b/2*m)**2)
    T = 2*np.pi/w

    y_t = np.exp((-b/(2*m))*t) * (A*np.cos(w*t))


    plt.plot(time,y,label='experiment',linestyle='-')
    plt.scatter(time[max], peak_values, color='red', marker='o', s=100, label="Max")
    plt.plot(t,y_t,"r--")
    plt.legend()
    plt.grid()
    plt.show()

    Continue reading...

Compartilhe esta Página