import matplotlib.pyplot as plt
import numpy as np
# 한글 폰트 및 마이너스 기호 깨짐 방지 설정
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['axes.unicode_minus'] = False
# 1. 시간 범위 설정 (예: 0일부터 8일까지)
t = np.linspace(0, 8, 400)
# 2. 식물의 생장량 함수 f(t) 정의 (3차 함수 모델)
# f(t) = -t^3 + 9t^2 + 12t (단위: cm)
# 초기에는 천천히 자라다가 속도가 붙은 뒤 완만해지는 S자 곡선의 형태를 일부 모사합니다.
f_t = -(t**3) + 9 * (t**2) + 12 * t
# 3. 도함수 f'(t) 정의 (순간 성장 속도, 2차 함수)
# f'(t) = -3t^2 + 18t + 12
f_prime_t = -3 * (t**2) + 18 * t + 12
# 4. 성장이 가장 빠른 시점(도함수의 꼭짓점, 즉 2차함수 대칭축 공식 t = -b / 2a) 계산
# -3t^2 + 18t + 12 에서 a = -3, b = 18 이므로 t = -18 / (2 * -3) = 3
t_max_growth = 3.0
max_growth_rate = -3 * (t_max_growth**2) + 18 * t_max_growth + 12
max_height = -(t_max_growth**3) + 9 * (t_max_growth**2) + 12 * t_max_growth
# 결과 출력
print(
f'[수학적 모델링 분석 결과]\n'
f'- 식물이 가장 폭발적으로 자라는 시점: t = {t_max_growth}일\n'
f'- 이때의 최대 순간 성장 속도: {max_growth_rate} cm/일\n'
f'- 이때의 식물 높이: {max_height} cm'
)
# 5. 그래프 시각화 (위: 원함수 / 아래: 도함수)
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8), sharex=True)
# (1) 원함수 그래프: 시간(t)에 따른 식물의 높이 f(t)
ax1.plot(
t, f_t, label='Plant Height f(t)', color='forestgreen', linewidth=2.5
)
ax1.axvline(
x=t_max_growth,
color='orange',
linestyle='--',
label=f'Max Growth Time (t={t_max_growth})',
)
ax1.set_ylabel('Plant Height (cm)', fontsize=12)
ax1.set_title(
"Math II Application: Plant Growth & Derivative Model", fontsize=14
)
ax1.grid(True, linestyle=':', alpha=0.7)
ax1.legend(loc='upper left')
# (2) 도함수 그래프: 시간(t)에 따른 순간 성장 속도 f'(t)
ax2.plot(
t,
f_prime_t,
label="Growth Rate f'(t)",
color='dodgerblue',
linewidth=2.5,
)
ax2.scatter(
[t_max_growth],
[max_growth_rate],
color='red',
zorder=5,
s=80,
label=f'Max Growth Rate ({max_growth_rate} cm/day)',
)
ax2.axvline(x=t_max_growth, color='orange', linestyle='--')
ax2.set_xlabel('Time t (days)', fontsize=12)
ax2.set_ylabel('Growth Rate (cm/day)', fontsize=12)
ax2.grid(True, linestyle=':', alpha=0.7)
ax2.legend(loc='upper right')
plt.tight_layout()
plt.show()
aW1wb3J0IG1hdHBsb3RsaWIucHlwbG90IGFzIHBsdAppbXBvcnQgbnVtcHkgYXMgbnAKCiMg7ZWc6riAIO2PsO2KuCDrsI8g66eI7J2064SI7IqkIOq4sO2YuCDquajsp5Ag67Cp7KeAIOyEpOyglQpwbHQucmNQYXJhbXNbJ2ZvbnQuZmFtaWx5J10gPSAnc2Fucy1zZXJpZicKcGx0LnJjUGFyYW1zWydheGVzLnVuaWNvZGVfbWludXMnXSA9IEZhbHNlCgojIDEuIOyLnOqwhCDrspTsnIQg7ISk7KCVICjsmIg6IDDsnbzrtoDthLAgOOydvOq5jOyngCkKdCA9IG5wLmxpbnNwYWNlKDAsIDgsIDQwMCkKCiMgMi4g7Iud66y87J2YIOyDneyepeufiSDtlajsiJggZih0KSDsoJXsnZggKDPssKgg7ZWo7IiYIOuqqOuNuCkKIyBmKHQpID0gLXReMyArIDl0XjIgKyAxMnQgKOuLqOychDogY20pCiMg7LSI6riw7JeQ64qUIOyynOyynO2eiCDsnpDrnbzri6TqsIAg7IaN64+E6rCAIOu2meydgCDrkqQg7JmE66eM7ZW07KeA64qUIFPsnpAg6rOh7ISg7J2YIO2Yle2DnOulvCDsnbzrtoAg66qo7IKs7ZWp64uI64ukLgpmX3QgPSAtKHQqKjMpICsgOSAqICh0KioyKSArIDEyICogdAoKIyAzLiDrj4TtlajsiJggZicodCkg7KCV7J2YICjsiJzqsIQg7ISx7J6lIOyGjeuPhCwgMuywqCDtlajsiJgpCiMgZicodCkgPSAtM3ReMiArIDE4dCArIDEyCmZfcHJpbWVfdCA9IC0zICogKHQqKjIpICsgMTggKiB0ICsgMTIKCiMgNC4g7ISx7J6l7J20IOqwgOyepSDruaDrpbgg7Iuc7KCQKOuPhO2VqOyImOydmCDqvK3sp5PsoJAsIOymiSAy7LCo7ZWo7IiYIOuMgOy5rey2lSDqs7Xsi50gdCA9IC1iIC8gMmEpIOqzhOyCsAojIC0zdF4yICsgMTh0ICsgMTIg7JeQ7IScIGEgPSAtMywgYiA9IDE4IOydtOuvgOuhnCB0ID0gLTE4IC8gKDIgKiAtMykgPSAzCnRfbWF4X2dyb3d0aCA9IDMuMAptYXhfZ3Jvd3RoX3JhdGUgPSAtMyAqICh0X21heF9ncm93dGgqKjIpICsgMTggKiB0X21heF9ncm93dGggKyAxMgptYXhfaGVpZ2h0ID0gLSh0X21heF9ncm93dGgqKjMpICsgOSAqICh0X21heF9ncm93dGgqKjIpICsgMTIgKiB0X21heF9ncm93dGgKCiMg6rKw6rO8IOy2nOugpQpwcmludCgKICAgIGYnW+yImO2VmeyggSDrqqjrjbjrp4Eg67aE7ISdIOqysOqzvF1cbicKICAgIGYnLSDsi53rrLzsnbQg6rCA7J6lIO2PreuwnOyggeycvOuhnCDsnpDrnbzripQg7Iuc7KCQOiB0ID0ge3RfbWF4X2dyb3d0aH3snbxcbicKICAgIGYnLSDsnbTrlYzsnZgg7LWc64yAIOyInOqwhCDshLHsnqUg7IaN64+EOiB7bWF4X2dyb3d0aF9yYXRlfSBjbS/snbxcbicKICAgIGYnLSDsnbTrlYzsnZgg7Iud66y8IOuGkuydtDoge21heF9oZWlnaHR9IGNtJwopCgojIDUuIOq3uOuemO2UhCDsi5zqsIHtmZQgKOychDog7JuQ7ZWo7IiYIC8g7JWE656YOiDrj4TtlajsiJgpCmZpZywgKGF4MSwgYXgyKSA9IHBsdC5zdWJwbG90cygyLCAxLCBmaWdzaXplPSgxMCwgOCksIHNoYXJleD1UcnVlKQoKIyAoMSkg7JuQ7ZWo7IiYIOq3uOuemO2UhDog7Iuc6rCEKHQp7JeQIOuUsOuluCDsi53rrLzsnZgg64aS7J20IGYodCkKYXgxLnBsb3QoCiAgICB0LCBmX3QsIGxhYmVsPSdQbGFudCBIZWlnaHQgZih0KScsIGNvbG9yPSdmb3Jlc3RncmVlbicsIGxpbmV3aWR0aD0yLjUKKQpheDEuYXh2bGluZSgKICAgIHg9dF9tYXhfZ3Jvd3RoLAogICAgY29sb3I9J29yYW5nZScsCiAgICBsaW5lc3R5bGU9Jy0tJywKICAgIGxhYmVsPWYnTWF4IEdyb3d0aCBUaW1lICh0PXt0X21heF9ncm93dGh9KScsCikKYXgxLnNldF95bGFiZWwoJ1BsYW50IEhlaWdodCAoY20pJywgZm9udHNpemU9MTIpCmF4MS5zZXRfdGl0bGUoCiAgICAiTWF0aCBJSSBBcHBsaWNhdGlvbjogUGxhbnQgR3Jvd3RoICYgRGVyaXZhdGl2ZSBNb2RlbCIsIGZvbnRzaXplPTE0CikKYXgxLmdyaWQoVHJ1ZSwgbGluZXN0eWxlPSc6JywgYWxwaGE9MC43KQpheDEubGVnZW5kKGxvYz0ndXBwZXIgbGVmdCcpCgojICgyKSDrj4TtlajsiJgg6re4656Y7ZSEOiDsi5zqsIQodCnsl5Ag65Sw66W4IOyInOqwhCDshLHsnqUg7IaN64+EIGYnKHQpCmF4Mi5wbG90KAogICAgdCwKICAgIGZfcHJpbWVfdCwKICAgIGxhYmVsPSJHcm93dGggUmF0ZSBmJyh0KSIsCiAgICBjb2xvcj0nZG9kZ2VyYmx1ZScsCiAgICBsaW5ld2lkdGg9Mi41LAopCmF4Mi5zY2F0dGVyKAogICAgW3RfbWF4X2dyb3d0aF0sCiAgICBbbWF4X2dyb3d0aF9yYXRlXSwKICAgIGNvbG9yPSdyZWQnLAogICAgem9yZGVyPTUsCiAgICBzPTgwLAogICAgbGFiZWw9ZidNYXggR3Jvd3RoIFJhdGUgKHttYXhfZ3Jvd3RoX3JhdGV9IGNtL2RheSknLAopCmF4Mi5heHZsaW5lKHg9dF9tYXhfZ3Jvd3RoLCBjb2xvcj0nb3JhbmdlJywgbGluZXN0eWxlPSctLScpCmF4Mi5zZXRfeGxhYmVsKCdUaW1lIHQgKGRheXMpJywgZm9udHNpemU9MTIpCmF4Mi5zZXRfeWxhYmVsKCdHcm93dGggUmF0ZSAoY20vZGF5KScsIGZvbnRzaXplPTEyKQpheDIuZ3JpZChUcnVlLCBsaW5lc3R5bGU9JzonLCBhbHBoYT0wLjcpCmF4Mi5sZWdlbmQobG9jPSd1cHBlciByaWdodCcpCgpwbHQudGlnaHRfbGF5b3V0KCkKcGx0LnNob3coKQo=