본문 바로가기

데이터 피팅 & 보간

파이썬 여러 개의 함수 데이터 한 번에 보간 - 1차 보간법 예제

반응형

** 지난포스팅 참고: 

https://hexa-coding.tistory.com/55

 

파이썬 1차원 보간법 완벽정리!! - 측정 데이터 보간

파이썬 1차원 데이터 보간 아래와 같이 데이터를 측정했다 치자. 그리고 이 데이터의 모함수가 어떤 함수인지 모른다고 가정하자. 모함수를 모르기 때문에 피팅(Fitting)은 불가능하므로 보간을

hexa-coding.tistory.com

 

 

    지난 포스팅에 이어 1차 보간으로 여러 개의 함수를 동시에 보간 진행하는 법을 알아보자. 

방법은 지난 1차 보간을 할 때와 거의 유사하고 매우 쉽다! 

 

파이썬 1차 보간 - 여러 개  함수 동시 진행

 

 

1. 측정 데이터 준비 

    측정 데이터가 아래와 같이 판다스 형태로 제공되었다고 치자. 

테이블에는 각 x값에 대해 y1, y2, y3 세 가지 측정 결과들이 있다. 

측정결과값 ( x vs y1,y2,y3)

 

이 결과들을 한 번에 보간해버릴 것이다. 

일단 위 데이터프레임은 아래와 같이 얻었다. 

반응형
# 측정데이터 준비 
x = np.array([-100.0,  -89.47368421052632,  -78.94736842105263,
               -68.42105263157895,  -57.89473684210526, -47.368421052631575,
               -36.84210526315789, -26.315789473684205,  -15.78947368421052,
               -5.263157894736835,    5.26315789473685,  15.789473684210535,
                26.31578947368422,   36.84210526315792,   47.36842105263159,
                57.89473684210526,   68.42105263157896,   78.94736842105266,
                89.47368421052633,               100.0])
# 실측값 y1, y2, y3 (각 열)
Y = np.array([[ -11999.        , -151340.        ,  -20200.        ],
               [ -10004.5401662 , -123427.53462604,  -13906.37119114],
               [  -8231.68698061,  -98174.34903047,   -8499.16897507],
               [  -6680.44044321,  -75580.4432133 ,   -3978.3933518 ],
               [  -5350.80055402,  -55645.81717452,    -344.04432133],
               [  -4242.76731302,  -38370.47091413,    2403.87811634],
               [  -3356.34072022,  -23754.40443213,    4265.37396122],
               [  -2691.52077562,  -11797.61772853,    5240.4432133 ],
               [  -2248.30747922,   -2500.11080332,    5329.08587258],
               [  -2026.70083102,    4138.11634349,    4531.30193906],
               [  -2026.70083102,    8117.06371191,    2847.09141274],
               [  -2248.30747922,    9436.73130194,     276.45429363],
               [  -2691.52077562,    8097.11911357,   -3180.60941828],
               [  -3356.34072022,    4098.22714681,   -7524.09972299],
               [  -4242.76731302,   -2559.94459834,  -12754.0166205 ],
               [  -5350.80055402,  -11877.39612188,  -18870.3601108 ],
               [  -6680.44044321,  -23854.12742382,  -25873.13019391],
               [  -8231.68698061,  -38490.13850416,  -33762.32686981],
               [ -10004.5401662 ,  -55785.42936288,  -42537.9501385 ],
               [ -11999.        ,  -75740.        ,  -52200.        ]])
# 측정값 데이터프레임
df = pd.DataFrame(Y, columns=['y1','y2','y3'], index=x)

 

 

    이제 보간을 진행하기 위해 x와 Y를 정의한다. x는 df의 인덱스 값이고, Y는 df의 각 열에 해당하는 데이터이다. interp1d를 이용해 보간을 바로 진행하면 된다. new_Y는 y1, y2, y3를 각 열로 가지는 넘파이 배열이다. 

# y1, y2, y3 동시 보간 진행 
x = df.index
Y = df
interp_functions = interp1d(x,Y, axis=0, kind='quadratic')

# 데이터 플로팅을 위한 new_x 
new_x = np.linspace(-100,100,200) # 간격을 기존보다 10배 촘촘하게 했다. (20->200)
new_Y = interp_functions(new_x) # new_x에 맞게 new_Y값을 뽑아준다.

   

    보간이 잘 되었는지 원본 측정데이터(y1,y2,y3)와 보간된 데이터 (new_Y)를 각각 플로팅 해 보자. 

# 실측 데이터 y1, y2, y3 플롯
plt.scatter(x,df.y1, label="y=f1(x)")
plt.scatter(x,df.y2, label="y=f2(x)")
plt.scatter(x,df.y3, label="y=f3(x)")

# 보간 데이터 new_Y 플롯
plt.plot(new_x,new_Y, label=['interp_f1(x)','interp_f2(x)','interp_f3(x)'])
plt.ylim(-30000,20000)
plt.legend()
ax = plt.gca()
plt.text(x=0.5,y=0.2,s="Interpolation of f1,f2,f3", fontdict={'fontsize':20, 'fontweight':'bold'}, ha='center', transform=ax.transAxes)

 

    보간이 잘 된 것 같다. ㅎㅎ 

한 번에 여러 개 함수 보간하기 끝!

반응형