import numpy as np
import matplotlib.pyplot as plt
# 1. 시간 설정 (0~4일)
t = np.linspace(0, 4, 401)
# 2. 가상의 식물 생장량 함수
# N(t) = 10 + ((t-2)^3 + 8)/3 + t
def growth(t):
return 10 + ((t - 2)**3 + 8) / 3 + t
# 3. 순간 생장 속도 함수: N'(t)
def growth_rate(t):
return (t - 2)**2 + 1
# 4. 비교할 두 시점
t1 = 1
t2 = 3
N1 = growth(t1)
N2 = growth(t2)
R1 = growth_rate(t1)
R2 = growth_rate(t2)
# 5. 결과 출력
print("===== 생장 상태 비교 =====")
print(f"{t1}일째 생장량: {N1:.2f}")
print(f"{t2}일째 생장량: {N2:.2f}")
print()
print(f"{t1}일째 순간 생장 속도: {R1:.2f}")
print(f"{t2}일째 순간 생장 속도: {R2:.2f}")
print()
print(f"생장량 차이: {abs(N2 - N1):.2f}")
print(f"생장 속도 차이: {abs(R2 - R1):.2f}")
# 6. 그래프 그리기
fig, axes = plt.subplots(1, 2, figsize=(12, 4.5))
# 생장량 그래프
axes[0].plot(t, growth(t), label="Growth amount N(t)")
axes[0].scatter([t1, t2], [N1, N2], color="red", zorder=3)
axes[0].annotate(f"t=1, N={N1:.2f}", (t1, N1),
xytext=(5, 10), textcoords="offset points")
axes[0].annotate(f"t=3, N={N2:.2f}", (t2, N2),
xytext=(5, 10), textcoords="offset points")
axes[0].set_title("Plant Growth Amount")
axes[0].set_xlabel("Time (days)")
axes[0].set_ylabel("Growth amount (arbitrary units)")
axes[0].grid(True)
axes[0].legend()
# 순간 생장 속도 그래프
axes[1].plot(t, growth_rate(t), label="Growth rate N'(t)")
axes[1].scatter([t1, t2], [R1, R2], color="red", zorder=3)
axes[1].annotate(f"t=1, rate={R1:.1f}", (t1, R1),
xytext=(5, 10), textcoords="offset points")
axes[1].annotate(f"t=3, rate={R2:.1f}", (t2, R2),
xytext=(5, 10), textcoords="offset points")
axes[1].set_title("Instantaneous Growth Rate")
axes[1].set_xlabel("Time (days)")
axes[1].set_ylabel("Growth rate (units/day)")
axes[1].grid(True)
axes[1].legend()
plt.tight_layout()
plt.show()
CmltcG9ydCBudW1weSBhcyBucAppbXBvcnQgbWF0cGxvdGxpYi5weXBsb3QgYXMgcGx0CgojIDEuIOyLnOqwhCDshKTsoJUgKDB+NOydvCkKdCA9IG5wLmxpbnNwYWNlKDAsIDQsIDQwMSkKCiMgMi4g6rCA7IOB7J2YIOyLneusvCDsg53snqXrn4kg7ZWo7IiYCiMgTih0KSA9IDEwICsgKCh0LTIpXjMgKyA4KS8zICsgdApkZWYgZ3Jvd3RoKHQpOgogICAgcmV0dXJuIDEwICsgKCh0IC0gMikqKjMgKyA4KSAvIDMgKyB0CgojIDMuIOyInOqwhCDsg53snqUg7IaN64+EIO2VqOyImDogTicodCkKZGVmIGdyb3d0aF9yYXRlKHQpOgogICAgcmV0dXJuICh0IC0gMikqKjIgKyAxCgojIDQuIOu5hOq1kO2VoCDrkZAg7Iuc7KCQCnQxID0gMQp0MiA9IDMKCk4xID0gZ3Jvd3RoKHQxKQpOMiA9IGdyb3d0aCh0MikKClIxID0gZ3Jvd3RoX3JhdGUodDEpClIyID0gZ3Jvd3RoX3JhdGUodDIpCgojIDUuIOqysOqzvCDstpzroKUKcHJpbnQoIj09PT09IOyDneyepSDsg4Htg5wg67mE6rWQID09PT09IikKcHJpbnQoZiJ7dDF97J287Ke4IOyDneyepeufiToge04xOi4yZn0iKQpwcmludChmInt0Mn3snbzsp7gg7IOd7J6l65+JOiB7TjI6LjJmfSIpCnByaW50KCkKcHJpbnQoZiJ7dDF97J287Ke4IOyInOqwhCDsg53snqUg7IaN64+EOiB7UjE6LjJmfSIpCnByaW50KGYie3QyfeydvOynuCDsiJzqsIQg7IOd7J6lIOyGjeuPhDoge1IyOi4yZn0iKQpwcmludCgpCnByaW50KGYi7IOd7J6l65+JIOywqOydtDoge2FicyhOMiAtIE4xKTouMmZ9IikKcHJpbnQoZiLsg53snqUg7IaN64+EIOywqOydtDoge2FicyhSMiAtIFIxKTouMmZ9IikKCiMgNi4g6re4656Y7ZSEIOq3uOumrOq4sApmaWcsIGF4ZXMgPSBwbHQuc3VicGxvdHMoMSwgMiwgZmlnc2l6ZT0oMTIsIDQuNSkpCgojIOyDneyepeufiSDqt7jrnpjtlIQKYXhlc1swXS5wbG90KHQsIGdyb3d0aCh0KSwgbGFiZWw9Ikdyb3d0aCBhbW91bnQgTih0KSIpCmF4ZXNbMF0uc2NhdHRlcihbdDEsIHQyXSwgW04xLCBOMl0sIGNvbG9yPSJyZWQiLCB6b3JkZXI9MykKYXhlc1swXS5hbm5vdGF0ZShmInQ9MSwgTj17TjE6LjJmfSIsICh0MSwgTjEpLAogICAgICAgICAgICAgICAgIHh5dGV4dD0oNSwgMTApLCB0ZXh0Y29vcmRzPSJvZmZzZXQgcG9pbnRzIikKYXhlc1swXS5hbm5vdGF0ZShmInQ9MywgTj17TjI6LjJmfSIsICh0MiwgTjIpLAogICAgICAgICAgICAgICAgIHh5dGV4dD0oNSwgMTApLCB0ZXh0Y29vcmRzPSJvZmZzZXQgcG9pbnRzIikKYXhlc1swXS5zZXRfdGl0bGUoIlBsYW50IEdyb3d0aCBBbW91bnQiKQpheGVzWzBdLnNldF94bGFiZWwoIlRpbWUgKGRheXMpIikKYXhlc1swXS5zZXRfeWxhYmVsKCJHcm93dGggYW1vdW50IChhcmJpdHJhcnkgdW5pdHMpIikKYXhlc1swXS5ncmlkKFRydWUpCmF4ZXNbMF0ubGVnZW5kKCkKCiMg7Iic6rCEIOyDneyepSDsho3rj4Qg6re4656Y7ZSECmF4ZXNbMV0ucGxvdCh0LCBncm93dGhfcmF0ZSh0KSwgbGFiZWw9Ikdyb3d0aCByYXRlIE4nKHQpIikKYXhlc1sxXS5zY2F0dGVyKFt0MSwgdDJdLCBbUjEsIFIyXSwgY29sb3I9InJlZCIsIHpvcmRlcj0zKQpheGVzWzFdLmFubm90YXRlKGYidD0xLCByYXRlPXtSMTouMWZ9IiwgKHQxLCBSMSksCiAgICAgICAgICAgICAgICAgeHl0ZXh0PSg1LCAxMCksIHRleHRjb29yZHM9Im9mZnNldCBwb2ludHMiKQpheGVzWzFdLmFubm90YXRlKGYidD0zLCByYXRlPXtSMjouMWZ9IiwgKHQyLCBSMiksCiAgICAgICAgICAgICAgICAgeHl0ZXh0PSg1LCAxMCksIHRleHRjb29yZHM9Im9mZnNldCBwb2ludHMiKQpheGVzWzFdLnNldF90aXRsZSgiSW5zdGFudGFuZW91cyBHcm93dGggUmF0ZSIpCmF4ZXNbMV0uc2V0X3hsYWJlbCgiVGltZSAoZGF5cykiKQpheGVzWzFdLnNldF95bGFiZWwoIkdyb3d0aCByYXRlICh1bml0cy9kYXkpIikKYXhlc1sxXS5ncmlkKFRydWUpCmF4ZXNbMV0ubGVnZW5kKCkKCnBsdC50aWdodF9sYXlvdXQoKQpwbHQuc2hvdygpCg==