Как подобрать ответный график с использованием прямоугольной волны - PullRequest
0 голосов
/ 29 апреля 2018

Я ищу способ / метод, чтобы соответствовать моим ответным данным (изображение показано ниже). Таким образом, используя f(t) = (square(2*pi*f*t)+1) для фильтрации моих необработанных данных. Тем не менее, cftool не распознает такого рода функции. Пожалуйста, помогите мне, спасибо!

enter image description here

1 Ответ

0 голосов
/ 16 мая 2018

Приведенная ниже функция может позволить подогнать данные. Это непрерывно, но не дифференцируемо везде. Шаги имеют тенденцию падать вправо, в то время как данные OP не делают. Это может потребовать дополнительной работы. Кроме того, шаги должны быть равноудалены, что, однако, кажется, имеет место.

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np

def f( x, a, b ): # test function (that would be the one to fit, actually + a shift of edge position)
    return a + b * x**3

def f_step( x, l, func, args=None ):
    y = ( x - l / 2. ) % l - l / 2.
    y = y / l * 2.
    p = np.floor( ( x-l/2.) / (l) ) + 1
    centre = p * l
    left = centre - l / 2.
    right = centre + l / 2.
    fL = func( left, *args )
    fR = func( right, *args )
    fC = func( centre, *args )
    out = fC + sharp( y , fL - fC, fR - fC , 5 )
    return out

def sharp( x, a, b , p, epsilon=1e-1 ):
    out = a * ( 1. / abs( x + 1 + epsilon )**p - ( 2 + epsilon)**( -p ) ) / ( epsilon**( -p ) - ( 2 + epsilon )**( -p ) ) 
    out += b * ( 1. /abs( x - 1 - epsilon )**p - ( 2 + epsilon)**( -p ) ) / ( epsilon**( -p ) - ( 2 + epsilon )**( -p ) ) 
    return out

l=0.57
xList = np.linspace( -1, 1.75, 500 )
yList = [ f_step( x, l, f, args=(2, -.3 ) ) for x in xList ] 

fig1 = plt.figure( 1 )
ax = fig1.add_subplot( 1, 1, 1 )
ax.plot( xList, yList )
ax.plot( xList, f(xList, 2,-.3) )
plt.show()

выглядит как:

Steps with varying height

...