fork download
  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3.  
  4. # 1. 그래프 한글 폰트 및 마이너스 기호 설정
  5. plt.rcParams['font.family'] = 'sans-serif'
  6. plt.rcParams['axes.unicode_minus'] = False
  7.  
  8. # ---------------------------------------------------------
  9. # [사용자 입력 부분]
  10. # 직접 입력받고 싶다면 아래 input_data의 주석(#)을 해제하고 사용하세요.
  11. # ---------------------------------------------------------
  12. # print("날짜(t)와 측정값(y)을 공백으로 구분하여 입력하세요 (예: 0, 1, 2, 3...)")
  13. # t_input = list(map(float, input("시간 t (일): ").split()))
  14. # y_input = list(map(float, input("식물 높이 y (cm): ").split()))
  15.  
  16. # 예시용 샘플 데이터 (사용자가 임의로 수치만 바꾸어 넣으셔도 됩니다)
  17. t_input = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8]) # 경과 시간 (일)
  18. y_input = np.array([2.0, 3.5, 7.0, 15.0, 26.0, 37.0, 45.0, 49.0, 50.0]) # 식물 높이 (cm)
  19.  
  20. t_data = np.array(t_input)
  21. y_data = np.array(y_input)
  22.  
  23. # 2. 수2 3차 다항함수로 데이터 피팅 (f(t) = a*t^3 + b*t^2 + c*t + d)
  24. # numpy.polyfit을 사용하여 가장 잘 맞는 3차 다항식 계수를 추정합니다.
  25. coefficients = np.polyfit(t_data, y_data, 3)
  26. a, b, c, d = coefficients
  27.  
  28. # 3. 도함수 f'(t) 계수 구하기 (미분: f'(t) = 3a*t^2 + 2b*t + c)
  29. a_prime = 3 * a
  30. b_prime = 2 * b
  31. c_prime = c
  32.  
  33. # 4. 연속적인 x축(시간) 구간 생성
  34. t_dense = np.linspace(min(t_data), max(t_data), 500)
  35.  
  36. # 3차 생장 함수 f(t) 및 2차 도함수 f'(t) 계산
  37. f_t = a * (t_dense**3) + b * (t_dense**2) + c * t_dense + d
  38. f_prime_t = a_prime * (t_dense**2) + b_prime * t_dense + c_prime
  39.  
  40. # 5. 최대 성장 속도 시점(도함수의 극대점 / 원함수의 변곡점) 수치적 계산
  41. # 2차함수 꼭짓점 축의 방정식: t = -b_prime / (2 * a_prime)
  42. if a_prime != 0:
  43. t_max_growth = -b_prime / (2 * a_prime)
  44. else:
  45. t_max_growth = t_dense[np.argmax(f_prime_t)]
  46.  
  47. # 범위 내에 있는지 확인 후 최대 속도 및 그때의 높이 계산
  48. if min(t_data) <= t_max_growth <= max(t_data):
  49. max_rate = a_prime * (t_max_growth**2) + b_prime * t_max_growth + c_prime
  50. height_at_max_rate = (
  51. a * (t_max_growth**3)
  52. + b * (t_max_growth**2)
  53. + c * t_max_growth
  54. + d
  55. )
  56. else:
  57. # 관측 범위 밖일 경우 가장 큰 값 선택
  58. idx_max = np.argmax(f_prime_t)
  59. t_max_growth = t_dense[idx_max]
  60. max_rate = f_prime_t[idx_max]
  61. height_at_max_rate = f_t[idx_max]
  62.  
  63. # 결과 출력
  64. print('==================================================')
  65. print(f'추정된 3차 생장 함수: f(t) = {a:.4f}t³ + {b:.4f}t² + {c:.4f}t + {d:.4f}')
  66. print(f'도함수 (성장 속도 함수): f\'(t) = {a_prime:.4f}t² + {b_prime:.4f}t + {c_prime:.4f}')
  67. print('--------------------------------------------------')
  68. print(f'🌱 최대 성장 속도 발생 시점 : t = {t_max_growth:.2f} 일째')
  69. print(f'⚡ 이때의 순간 성장 속도 : {max_rate:.2f} cm/일')
  70. print(f'📏 이때의 식물 높이 : {height_at_max_rate:.2f} cm')
  71. print('==================================================')
  72.  
  73. # 6. 시각화 (입력 데이터 점 + 모델링 곡선 + 도함수 곡선)
  74. fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8), sharex=True)
  75.  
  76. # [그래프 1] 원함수 f(t) & 실제 측정 데이터
  77. ax1.scatter(
  78. t_data,
  79. y_data,
  80. color='black',
  81. s=50,
  82. zorder=5,
  83. label='Measured Data (입력 데이터)',
  84. )
  85. ax1.plot(
  86. t_dense,
  87. f_t,
  88. color='forestgreen',
  89. linewidth=2.5,
  90. label=f'Fitted Model f(t)',
  91. )
  92. ax1.axvline(
  93. x=t_max_growth,
  94. color='orange',
  95. linestyle='--',
  96. label=f'Max Growth Point (t={t_max_growth:.2f})',
  97. )
  98. ax1.set_ylabel('Plant Height (cm)', fontsize=12)
  99. ax1.set_title(
  100. 'Math II Modeling: User Data Fitting & Growth Rate Analysis', fontsize=14
  101. )
  102. ax1.grid(True, linestyle=':', alpha=0.7)
  103. ax1.legend(loc='upper left')
  104.  
  105. # [그래프 2] 도함수 f'(t) (순간 성장 속도)
  106. ax2.plot(
  107. t_dense,
  108. f_prime_t,
  109. color='dodgerblue',
  110. linewidth=2.5,
  111. label="Growth Rate f'(t)",
  112. )
  113. ax2.scatter(
  114. [t_max_growth],
  115. [max_rate],
  116. color='red',
  117. s=80,
  118. zorder=5,
  119. label=f'Max Rate ({max_rate:.2f} cm/day)',
  120. )
  121. ax2.axvline(x=t_max_growth, color='orange', linestyle='--')
  122. ax2.set_xlabel('Time t (days)', fontsize=12)
  123. ax2.set_ylabel('Growth Rate (cm/day)', fontsize=12)
  124. ax2.grid(True, linestyle=':', alpha=0.7)
  125. ax2.legend(loc='upper right')
  126.  
  127. plt.tight_layout()
  128. plt.show()
  129.  
Success #stdin #stdout 0.98s 55368KB
stdin
Standard input is empty
stdout
==================================================
추정된 3차 생장 함수: f(t) = -0.2849t³ + 3.4230t² + -3.2365t + 2.4444
도함수 (성장 속도 함수): f'(t) = -0.8548t² + 6.8460t + -3.2365
--------------------------------------------------
🌱 최대 성장 속도 발생 시점 : t = 4.00 일째
⚡ 이때의 순간 성장 속도     : 10.47 cm/일
📏 이때의 식물 높이         : 26.08 cm
==================================================