ํ•จ์ˆ˜ fitting ์ฝ”๋“œ

์ˆ˜์ • ๋ชฉ๋ก
์•„๋ž˜๋Š” ํŒŒ์ด์ฌ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ผ๊ฐํ•จ์ˆ˜๋กœ ๊ทผ์‚ฌ์‹œํ‚ค๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
ํŒŒ์ด์ฌ ๋‹ค๋ฃฐ ์ค„ ์•„์‹œ๋Š” ์„ ์ƒ๋‹˜์ด ๊ณ„์‹œ๊ฑฐ๋‚˜ ํ•™์ƒ์ด ์žˆ์œผ๋ฉด ์ด์šฉํ•˜์‹œ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค. (์ €์ž‘๊ถŒ์€ ์ฐจํŽญ๊ท„์—๊ฒŒ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต์œ  ์‹œ ์ด ์›นํŽ˜์ด์ง€ ๋งํฌ๋กœ ๊ณต์œ ํ•ด์ฃผ์„ธ์š”)

import numpy as np
import matplotlib.pyplot as plt

# ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ
xv = np.array([n for n in range(1,61)])
yv = np.array([
57, 70, 82, 68, 52, 47, 42, 40,40,40,40,30.9, 40, 40, 43,
58, 70, 82, 67, 52, 45, 42, 40,40,40,40,30.9, 40, 40, 42,
56.5, 70, 82, 68, 52, 45, 42, 40,40,40,39,30.9, 40, 40, 43,
57, 70, 82, 68, 52, 45, 42, 40,40,38,39,30.9, 40, 40, 44
])

# ์ฃผ์–ด์ง„ ํ•จ์ˆ˜ ํ˜•ํƒœ๋กœ fittingํ•˜๊ธฐ ์œ„ํ•ด sin(x) ๊ฐ’์„ ๊ตฌํ•จ
sin_xv = np.sin(xv)

# ์ฃผ์–ด์ง„ ํ•จ์ˆ˜ ํ˜•ํƒœ๋กœ fitting์„ ์œ„ํ•œ ํ–‰๋ ฌ ์ƒ์„ฑ (range(1,32) : sinx(x)์— ๋Œ€ํ•œ 31์ฐจ ๋‹คํ•ญ์‹์œผ๋กœ ๊ทผ์‚ฌํ•œ๋‹ค๋Š” ๋œป)
X = np.column_stack([sin_xv**n for n in range(1, 32)])

# ๋‹คํ•ญ์‹ ๊ณ„์ˆ˜ ๊ณ„์‚ฐ
coeff_fitting= np.linalg.lstsq(X, yv, rcond=None)[0]

print("Fitted coefficients:", coeff_fitting)

# fitting๋œ ํ•จ์ˆ˜ ์ƒ์„ฑ
def custom_function(x):
return sum(coeff * np.sin(x)**n for n, coeff in enumerate(coeff_fitting, start=1))

# ๋ฐ์ดํ„ฐ์™€ fitting๋œ ํ•จ์ˆ˜ ์‹œ๊ฐํ™”
plt.scatter(xv, yv, label='Data')
x_vals = np.linspace(1, 59, 30) # ๊ทธ๋ž˜ํ”„๋ฅผ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด x ๊ฐ’ ๋ฒ”์œ„ ์ง€์ •
plt.plot(x_vals, custom_function(x_vals), color='red', label='Fitted Sine Curve')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.title('Height of Wave according to Time')
plt.grid(True)
plt.show()