gpt4 book ai didi

python - 不添加不必要的极值的插值方法

转载 作者:行者123 更新时间:2023-11-28 21:56:43 26 4
gpt4 key购买 nike

这道题一半是编程,一半是数学。我想通过曲线插入一组点,而不添加不必要的极值,保持“接近线性插值”,同时保持曲线看起来平滑。我知道这个公式是模糊的,但我希望它会通过一个例子开始更清楚。让我们看一下下面的代码和结果:

#! /usr/bin/python

import numpy as np
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.spines['left'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['bottom'].set_position('zero')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')

list_points=[(-3,0.1),(-2,0.15),(0,4),(2,-6),(4,-2),(7,-0.15),(8,-0.1)]
(xp,yp)=zip(*list_points)
fun=interp1d(xp,yp,kind='cubic')

xc=np.linspace(min(xp),max(xp),300)

plt.plot(xp,yp,'o',color='black',ms=5)
plt.plot(xc,fun(xc))
fun2=interp1d(xp,yp,kind='linear')
plt.plot(xc,fun2(xc))

plt.show()

Interpolation

我原以为插值只有两个极值(大约 x~0 和 x~2),而这里我们有 5 个极值。如果我们要求他们用手用平滑的曲线连接点,大多数人会画出它。有没有办法实现这个目标(在 python 中)。

更新:请注意,xfig 有一些接近(称为“近似样条绘图”)的东西,但不便之处在于曲线不会准确地通过指定点。我更喜欢精确通过指定点的曲线,但如果没有人知道更好的解决方案,我会欢迎 xfig 方法。

最佳答案

虽然不完全相同(?),但您的问题类似于 this one ,所以也许相同的答案会有用。您可以尝试单调插值器。 PchipInterpolator可以使用 scipy.interpolate 中的类(您可以通过其较短的别名 pchip 来引用)。这是您的脚本的一个版本,其中包含使用 pchip 创建的曲线:

import numpy as np
from scipy.interpolate import interp1d, pchip
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.spines['left'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['bottom'].set_position('zero')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')

list_points = [(-3,0.1),(-2,0.15),(0,4),(2,-6),(4,-2),(7,-0.15),(8,-0.1)]
(xp,yp) = zip(*list_points)
fun = interp1d(xp,yp,kind='cubic')

xc = np.linspace(min(xp),max(xp),300)

plt.plot(xp,yp,'o',color='black',ms=5)
plt.plot(xc,fun(xc))
fun2 = interp1d(xp,yp,kind='linear')
plt.plot(xc,fun2(xc))

p = pchip(xp, yp)
plt.plot(xc, p(xc), 'r', linewidth=3, alpha=0.6)

plt.show()

它生成的图如下所示。

  • 黑点:原始数据
  • 绿线:线性插值
  • 蓝线:三次样条插值
  • 红线:pchip插值

plot

关于python - 不添加不必要的极值的插值方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20919038/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com