2017-12-26 36 views
1

私はプロットしているデータセットを持っています。結果は以下の画像のようになります。 enter image description hereプロットの曲率を検出する

は、ここに私のpythonのコードです:私は主プロットの曲率をトレースし、追加のプロットを追加して達成しようとしています何

import numpy as np 

# Extra plotly bits 
import plotly 
import plotly.plotly as py 
import plotly.graph_objs as go 

a = np.array([[1, 0.00617329], [24, 0.133699], [48, 0.130072], [72, 0.0166202], [96, -0.187917], [120, -0.445023], [144, -0.698984], 
    [168, -0.942063], [192, -1.15151], [216, -1.30742], [240, -1.36852], [264, -1.33541], [288, -1.18194], [312, -0.982113], 
    [336, -0.772301], [360, -0.562501], [384, -0.3764], [408, -0.219537], [432, -0.106257], [456, -0.0369356], [480, -0.000313192]]) 


trace_a = go.Scatter(
     x = a[:,0], 
     y = a[:,1], 
     mode = 'lines+markers', 
     name = 'a', 
     line = dict(
      shape='line', 
      color = ('rgb(205, 12, 24)'), 
      width = 1) 
     ) 

data = [trace_a] 

# Edit the layout 
layout = dict(title = 'Curvature Test', 
    xaxis = dict(title = 'Data'), 
    yaxis = dict(title = 'Value'), 
    ) 

# Prepare Figure 
fig = go.Figure(data=data, layout=layout) 

# Plot 
plotly.offline.plot(fig, filename='curvature.html') 

おそらく次の画像のように見えるであろう

enter image description here

(これはプロトタイプであり、黄色のマーキングが第2のプロットは、最初のものの曲率を表していることを証明するだけである。)

私は正しいnumpy/maths解を見つけることができなかったので、データポイントごとに前と次の接線の内積計算を使って、これを他の環境で試作しました。

enter image description here

がどのように私はかつて、主1の曲率を表しますプロットされた第二のデータセットを作成することができますので、これは私の「悪い-Man's曲率」ソリューションはありますか?

免責事項: 私は以前この質問をしました。しかし、エレガントなソリューションを練習することはできませんでした。私は曲率の話題についても研究しており、私は曲率の計算を知っています。しかし、私はまだpython/numpyと適切な数学的手法を使ってこれをまとめるのに苦労しています。私はまた、次の時間を費やしましたpostしかし、私の問題を解決するために提供された情報を完全に移植することができませんでした。ここ

--- EDIT(1)---

は私の解決策の結果である:

enter image description here
+0

関数の導関数をとり、与えられたθでJ(θ)に接する接線の傾きを計算し、傾きが正の場合は次の反復で最小に近づき、傾きそれは正接に触れると少し負の増加です、私はあなたが探しているものだと思いますか? –

答えて

0

曲率がそれほど二次導関数として解釈することができる。

def derivative(x_data, y_data): 
    N = len(x_data) 
    delta_x = [x_data[i+1] - x_data[i] for i in range(N - 1)] 
    x_prim = [(x_data[i+1] + x_data[i])/2. for i in range(N - 1)] 
    y_prim = [(y_data[i+1] - y_data[i])/delta_x[i] for i in range(N - 1)] 
    return x_prim, y_prim 

x, y = zip(*a) # a in an array you defined above 
x_bis, y_bis = derivative(*derivative(x, y)) 

しかし、平面上の2Dラインの曲率(関数の曲率ではない)として曲率を取得したい場合は、の3乗の平方根プラススカラーで除算する必要がありますyのデータの赤誘導体((1+y'^2)^(3/2)):)だけのように:

https://en.wikipedia.org/wiki/Curvature#Curvature_of_a_graph

おそらくあなたには、いくつかの補間を行う必要がありますが、x座標がequdistantある場合 - それははるかに容易になるだろう。

+0

ありがとうございます。私の場合、曲線は価格データを表しています。したがって(Y)の値は浮動小数点数ですが、(X)は日、時間または分です。私は記事を見て、曲率計算の多くの異なる形があります。どちらを実装すべきかわからない。 – symbolix

+0

Xが時間の場合、実際には平面上の2D曲線ではなく、1変数関数のグラフです。私はあなたが一番簡単に取るべきだと思う - 二次微分だけ。 –

+0

ありがとうございます。上記の機能はこれで何をしていますか? - > https://wikimedia.org/api/rest_v1/media/math/render/svg/c92d581fd7b8a66308bde64d64dcd8d71cc66ce0 – symbolix

関連する問題