티스토리 뷰
꼬앵이 체중관리표를 보다가 문득 이런 생각이 들었다.
매일 똑같이 먹고 똑같이 움직이면 체중은 수렴할까?
그래서 아래와 같은 문제를 만들어보았다.
철수네 강아지 해피가 살이 너무 쪄서 체중관리에 들어가기로 했다.
• 현재 해피 체중은 20 kg이다.
• 사료는 1 g 당 3 kcal의 열량을 갖는다.
• 현재 체중 기준, 먹은 사료 중 50%는 똥으로 나오고, 나머지 50%는 에너지로 전환 및 흡수된다.
- 사료의 에너지 전환율은 체중이 1 kg 감소할 때마다 1%씩 증가한다. 예를 들어,
- 20 kg일 때는 먹은 사료 중 50%가 에너지로 전환되지만,
- 19 kg일 때는 먹은 사료 중 51%가 에너지로 전환된다.
• 운동은 매일 1시간을 하는데, 현재 체중 기준, 300 kcal의 에너지를 소모한다.
- 운동에 의한 에너지 소모는 체중이 1 kg 감소할 때마다 10 kcal씩 감소한다. 예를 들어,
- 20 kg일 때는 300 kcal의 에너지를 소모되지만,
- 19 kg일 때는 290 kcal의 에너지를 소모한다.
• 강아지의 기초대사량은 숨만 쉬어도 소모하는 에너지이다.
• 하루 기초대사량은 아래 식으로 계산한다.
- 기초대사량(kcal) = 70 + 30 x 체중(kg)
• 해피의 일일 체중변화는 하루 중 순흡수열량 1 kcal 당 0.2 g이다. 예를 들어,
• 하루 순흡수열량이 5000 kcal이면 체중이 1 kg이 증가하고,
• 하루 순흡수열량이 -5000 kcal이면 체중이 1 kg이 감소한다.
• 모든 것은 연속함수로 가정한다.
1) 현재 체중 20 kg이 유지되고 있다면 하루에 사료를 얼마나 먹고 있는 것인가?
2) 체중이 15 kg에서 수렴하려면 사료를 매일 얼마씩 주어야 하는가?
3) 사료를 매일 400 g씩 주면 체중 몇 kg에서 감량이 멈추는가?
4) 사료를 매일 400 g씩 주면 며칠 후에 체중이 15kg이 되는가?
파라미터가 조금 복잡해 보일 뿐, 정리해보면 단순한 1차 ODE가 된다. 상세한 과정은 독자 여러분께 숙제로 남겨드리며... 아래는 매트랩 코드와 결과이다.
w0 = 20; % 초기 몸무게
x = 400; % 일일 사료 양
w_target = 15;
ef = 3; % 사료 열량, kcal/g
Er = @(w) 70 + 30*w; % 기초대사량, kcal
r = @(w) 0.5 + (20-w)*0.01; % 사료의 에너지 전환율
Ee = @(w) 300 - (20-w)*10; % 운동 에너지 소모, kcal
Em = @(w, x) ef*x*r(w); % 사료로부터 얻는 에너지, kcal
dwdE = 0.2e-3; % 순흡수열량당 체중변화, kg/kcal
daily_dE = @(w, x) Em(w, x) - Er(w) - Ee(w);
daily_dw = @(w, x) daily_dE(w, x)*dwdE;
options = odeset(MaxStep=1);
[t, w] = ode45(@(t, w) daily_dw(w, x), [0, 1000], w0, options);
plot(t, w, 'r', linewidth=2)
set(gca, 'FontSize', 14)
xlabel('days')
ylabel('weight (kg)')
fprintf('최종 몸무게: %.1f kg\n', w(end))
fprintf('15 kg 달성일: %d일\n', round(interp1(w, t, w_target)))
최종 몸무게: 12.9 kg
15 kg 달성일: 117일
'matlab' 카테고리의 다른 글
애증의 정규식... 3탄 (0) | 2024.08.22 |
---|---|
hgtransform을 이용하여 이미지 회전시키기 (0) | 2024.08.14 |
매트랩 콰인 (0) | 2024.08.06 |
자기 자신도 palindrome인 palindrome 확인 코드 (0) | 2024.08.04 |
왜 gradient가 가장 가파른 방향일까? (0) | 2024.07.16 |