이 질문은 절반은 프로그래밍이지만 절반은 수학입니다. 부드러운 곡선을 유지하면서 "선형 보간에 가깝게"머무르는 불필요한 극값을 추가하지 않고 곡선으로 점 집합을 보간하고 싶습니다.이 공식이 모호하다는 것을 알고 있지만 예제를 통해 더 명확하게 시작하기를 바랍니다. 다음 코드와 결과를 살펴 보겠습니다.
#! /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()
여기서 우리는 5 개의 극값이있는 동안 두 개의 극값 (약 x ~ 0 및 x ~ 2) 만있는 보간을 예상했을 것입니다. 손으로 부드러운 곡선으로 포인트를 연결하도록 요청하면 대부분의 사람들이 그릴 것입니다. 이 목표를 달성하는 방법이 있습니까 (파이썬에서).
업데이트 : xfig에는 곡선이 지정된 지점을 정확히 통과하지 못하는 불편 함과 함께 가까운 것 ( "대략적인 스플라인 그리기"라고 함)이 있습니다. 지정된 점을 정확히 통과하는 곡선을 선호하지만 더 나은 솔루션을 모르는 사람이 있으면 xfig 방법을 환영합니다.
정확히 같지는 않지만 (?) 귀하의 질문은 this 와 유사 하므로 동일한 답변이 유용 할 것입니다. 단조 보간기를 사용해 볼 수 있습니다. PchipInterpolator의 클래스는 (당신이 짧은 별명으로 참조 할 수있는 pchip
)에서 scipy.interpolate
사용할 수 있습니다. 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()
생성되는 플롯은 다음과 같습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다