2017-10-02 12 views
1

2つのリストxとyから数値微分(dy/dx)を計算してプロットしようとしています。私はscipy.interpolate.UnivariateSplinescipy.interpolate.UnivariateSpline.derivativeを使用して勾配を計算しています。 y vs xのプロットはC1連続しているように見え、xに対してプロットしたときのスロープdy/dxも滑らかであると予想していました。しかし、何がここにプロットの小さなバンプを引き起こしている?また、私はそれをC1にするためにコードをマッサージする方法についての任意の提案?補間式3次スプラインの数値微分の不連続

import numpy as np 
from matplotlib import pyplot as plt 
from scipy.interpolate import UnivariateSpline 
x=[20.14141131550861, 20.29161104293003, 20.458574567775457, 20.653802880772922, 20.910446090013004, 21.404599384233677, 21.427939384233678, 21.451279384233676, 21.474619384233677, 21.497959384233678, 21.52129938423368, 21.52130038423368, 21.54463938423368, 21.56797938423368, 21.59131938423368, 21.61465938423368, 21.63799938423368, 22.132152678454354, 22.388795887694435, 22.5840242006919] 
y=[-1.6629252348586834, -1.7625046339166028, -1.875358801338162, -2.01040013818419, -2.193327440415778, -2.5538174545988306, -2.571799827167608, -2.5896274995868005, -2.607298426787476, -2.624811539182082, -2.642165776735291, -2.642165776735291, -2.659360089028171, -2.6763934353217587, -2.693264784620056, -2.7099731157324367, -2.7265165368570314, -3.0965791078676754, -3.290845721407758, -3.440799238587583] 
spl1 = UnivariateSpline(x,y,s=0) 
dydx = spl1.derivative(n=1) 
T = dydx(x) 
plt.plot(x,y,'-x') 
plt.plot(x,T,'-') 
plt.show() 

enter image description here

+0

途中にいくつかの非線形の点がある必要があります – DJK

答えて

2

彼らは素敵なC1-滑らかな曲線を定義するように与えられたデータポイントが見えますが、そうではありません。彼らは近くにいくつかのも、所属していないように見える配列中のYの一部重複する値があります

plt.plot(np.diff(y)/np.diff(x)) 

slopes

:斜面(xの違い以上のyの差)をプロットすると、このことを示してい - xの値を複製する(重複しない)。スプラインを修正する最も簡単な方法は、平滑化のほんの少しをできるようにすることです

spl1 = UnivariateSpline(x, y, s=1e-5) 

は、あなたが期待したもの微分を行います

も「悪いりんご」を削除

smoothed

しかし、それほど助けにはならない。

spl1 = UnivariateSpline(x[:10] + x[11:], y[:10] + y[11:], s=0)