Jas*_*n S 6 python matlab spline scipy
我正在使用scipy.interpolate.UnivariateSpline平滑插值大量数据.效果很好.我得到一个像函数一样的对象.
现在我想保存样条点以便稍后在Matlab中使用它们(还有Python,但这不那么紧急),而不需要原始数据.我怎样才能做到这一点?
在scipy我不知道; UnivariateSpline似乎没有提供具有先前计算的结和系数的构造函数.
在MATLAB中,我尝试了MATLAB函数spline()和pchip(),并同时兼具接近,他们看起来有点像端点附近错误吉布斯耳朵.
以下是Matlab格式的一组示例数据:
splinedata = struct('coeffs',[-0.0412739180955273 -0.0236463479425733 0.42393753107602 -1.27274336116436 0.255711720888164 1.93923263846732 -2.30438927604816 1.02078680231079 0.997156858475075 -2.35321792387215 0.667027554745454 0.777918416623834],...
'knots',[0 0.125 0.1875 0.25 0.375 0.5 0.625 0.75 0.875 0.9999],...
'y',[-0.0412739180955273 -0.191354308450615 -0.869601364377744 -0.141538578624065 0.895258135865578 -1.04292294390242 0.462652465278345 0.442550440125204 -1.03967756446455 0.777918416623834])
Run Code Online (Sandbox Code Playgroud)
系数和节点是调用get_coeffs()和get_knots()scipy UnivariateSpline的结果.'y'值是结的单变量线的值,或者更确切地说:
y = f(f.get_knots())
Run Code Online (Sandbox Code Playgroud)
其中f是我的UnivariateSpline.
如何使用此数据制作与UnivariateSpline行为匹配的样条线,而无需使用曲线拟合工具箱?我不需要在Matlab中进行任何数据拟合,我只需要知道如何根据knots/coefficient /样条值构造三次样条.
您可以通过使用函数_eval_args()和_from_tck()类来实现UnivariateSpline。第一个返回样条参数,您可以存储这些参数,然后使用第二个创建类似的样条对象。
下面是一个例子:
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline
x = np.linspace(-3, 3, 50)
y = np.exp(-x**2) + 0.1 * np.random.randn(50)
spl1 = UnivariateSpline(x, y, s=.5)
xi = np.linspace(-3, 3, 1000)
tck = spl1._eval_args
spl2 = UnivariateSpline._from_tck(tck)
plt.plot(x, y, 'ro', ms=5, label='data')
plt.plot(xi, spl1(xi), 'b', label='original spline')
plt.plot(xi, spl2(xi), 'y:', lw=4, label='recovered spline')
plt.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)
在 scipy 中,尝试scipy.interpolate.splev,它需要
tck:一个序列...包含样条的结、系数和阶数。
添加:以下 python 类创建样条函数:用 (knots, coefs, Degree) 初始化,然后像使用创建的样条函数一样使用它UnivariateSpline( x, y, s ):
from scipy.interpolate import splev
# http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.splev.html
class Splinefunc:
""" splinef = Splinefunc( knots, coefs, degree )
...
y = splinef( x ) # __call__
19june untested
"""
def __init__( self, knots, coefs, degree ):
self.knots = knots
self.coefs = coefs
self.degree = degree
def __call__( self, x ):
return splev( x, (self.knots, self.coefs, self.degree ))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1623 次 |
| 最近记录: |