Кривизна множества точек - PullRequest
0 голосов
/ 28 мая 2018

файл данных

import matplotlib.pylab as plt
import numpy as np

#initial data
data=np.loadtxt('profile_nonoisebigd02.txt')
x=data[:,0]
y=data[:,1]

initial profile

#first derivatives 
dx= np.gradient(data[:,0])
dy = np.gradient(data[:,1])

#second derivatives 
d2x = np.gradient(dx)
d2y = np.gradient(dy)

#calculation of curvature from the typical formula
curvature = np.abs(dx * d2y - d2x * dy) / (dx * dx + dy * dy)**1.5

curvature

Может кто-нибудь помочь мне, где я?Я не так с кривизной?Множество точек дают мне параболу, но кривизна - это не то, чего я ожидаю.

1 Ответ

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

Кажется, что ваши данные недостаточно гладкие;Я использовал панд, чтобы заменить x, y, dx, dy, d2x, d2y и кривизну скользящими средними для разных размеров окна значений.По мере увеличения размера окна кривизна начинает все больше походить на то, что вы ожидаете увидеть для гладкой параболы (легенда дает размер окна):

enter image description here

Для справки приведем график исходных данных:

enter image description here

Код, использованный для создания сглаженных кадров:

def get_smooth(smoothing=10, return_df=False):
    data=np.loadtxt('profile_nonoisebigd02.txt')

    if return_df:
        return pd.DataFrame(data)

    df = pd.DataFrame(data).sort_values(by=0).reset_index(drop=True).rolling(smoothing).mean().dropna()

    # first derivatives
    df['dx'] = np.gradient(df[0])
    df['dy'] = np.gradient(df[1])

    df['dx'] = df.dx.rolling(smoothing, center=True).mean()
    df['dy'] = df.dy.rolling(smoothing, center=True).mean()

    # second derivatives
    df['d2x'] = np.gradient(df.dx)
    df['d2y'] = np.gradient(df.dy)

    df['d2x'] = df.d2x.rolling(smoothing, center=True).mean()
    df['d2y'] = df.d2y.rolling(smoothing, center=True).mean()


    # calculation of curvature from the typical formula
    df['curvature'] = df.eval('abs(dx * d2y - d2x * dy) / (dx * dx + dy * dy) ** 1.5')
    # mask = curvature < 100

    df['curvature'] = df.curvature.rolling(smoothing, center=True).mean()

    df.dropna(inplace=True)
    return df[0], df.curvature
...