Кубическая подгонка к графику. Как создать лучшее соответствие моим данным и извлечь значения из этого соответствия?

Я построил некоторые экспериментальные данные в Python, и мне нужно найти кубическую подгонку к данным. Причина, по которой мне нужно это сделать, заключается в том, что кубическая подгонка будет использоваться для удаления фона (в данном случае сопротивления в диоде), и у вас останутся очевидные особенности. Вот код, который я сейчас использую для подгонки куба в первую очередь, где Vnew и yone представляют массивы экспериментальных данных.

answer1=raw_input ('Cubic Plot attempt?\n ')

    if answer1 in['y','Y','Yes']:


        def cubic(x,A):
            return A*x**3

        cubic_guess=array([40])               
        popt,pcov=curve_fit(cubic,Vnew,yone,cubic_guess)

        plot(Vnew,cubic(Vnew,*popt),'r-',label='Cubic Fit: curve_fit')
        #ylim(-0.05,0.05)   
        legend(loc='best')
        print 'Cubic plotted'
    else:
        print 'No Cubic Removal done'

У меня есть знания о сглаживании кривых, но только в теории. Я не знаю, как это реализовать. Буду очень признателен за любую помощь.

Вот график, созданный на данный момент:


person SmallBarracoder    schedule 30.11.2014    source источник
comment
То, как вы это делаете, правильно. в чем именно проблема?: Вы получаете наилучшее соответствие (в определении методом наименьших квадратов) вашей модели с одним параметром. Это будет в popt (что будет отличаться от вашего первоначального предположения 40). Вы можете извлечь новые значения y-данных, как и на графике, с помощью cubic(Vnew,*popt).   -  person Oliver W.    schedule 02.12.2014
comment
Как я могу заставить кубическую подгонку стать шире, чтобы вместить части данных, которые пересекает куб? Я чувствую, что должен попробовать метод, который скрывает видимые особенности (например, около 0,25 В) и делает подгонку к тому, что я считаю ТОЛЬКО фоном?   -  person SmallBarracoder    schedule 04.12.2014


Ответы (1)


Чтобы сделать подобранную кривую «шире», вы ищете экстраполяцию. Хотя в этом случае вы могли бы просто сделать так, чтобы Vnew покрывала больший интервал, и в этом случае вы бы поместили это перед своей командой plot:

Vnew = numpy.linspace(-1,1, 256)  # min and max are merely an example, based on your graph
plot(Vnew,cubic(Vnew,*popt),'r-',label='Cubic Fit: curve_fit')

«Скрыть» видимую функцию можно с помощью замаскированных массивов numpy но также просто удалив те элементы, которые вам не нужны, как из вашего исходного Vnew (которое я назову xone), так и из yone:

mask = (xone > 0.1) & (xone < 0.35)  # values between these voltages (?) need to be removed
xone = xone[numpy.logical_not(mask)]
yone = yone[numpy.logical_not(mask)]

Затем повторите подгонку кривой:

popt,_ = curve_fit(cubic, xone, yone, cubic_guess)

Это будет соответствовать только тем данным, которые были на самом деле (которые, судя по всему, не так уж много точек в вашем наборе данных, так что будьте осторожны!).

person Oliver W.    schedule 03.12.2014