νμ¬ Formμ κ°μ λ μ Fitnessμ Fatigueμ μ°¨μ΄λ‘ κ³μ°λλ κ² κ°μ΅λλ€. κ·Έλ¬λ μ΄μ μ νΌνΈλμ€ λ° νΌλ‘λ₯Ό κΈ°λ°μΌλ‘νλ κ²μ΄ λ λμ μ μμ΅λλ€. λ¬Όλ‘ μ΄κ²μ λ
Όμμ μ¬μ§κ° μμ΅λλ€. λ€μ λ κ°μ§ μ¬ν λ§ μ μ ν μ μμ΅λλ€.
a) νλ ¨ νΌλ‘κ° λ€μλ λ λ§μ΄ λκ»΄μ§λ―λ‘ μ£Όκ΄μ μΌλ‘ λ μ ννλ€κ³ λλλλ€.
b) TrainingPeaks κ·Έ μΌλλ€ ( μ¬κΈ°μμ , "νΌ"λΆ)
μ μμ λ°λ₯Έ νμμ (TrainingPeaks)μ
λλ€.
νλ ¨ μ€νΈλ μ€ κ· ν (TSB) λλ μμμ νλ ¨ μ€νΈλ μ€μ κ· νμ λνλ
λλ€.
μμ (TSB) = μ΄μ νΌνΈλμ€ (CTL)-μ΄μ νΌλ‘ (ATL)
https://help.trainingpeaks.com/hc/en-us/articles/204071764-Form-TSB-
@aprokop μ, μ¬μ© λ μν λͺ¨λΈμ μ¬μ©ν΄μΌν©λλ€. μμμ΄ λμ°λ―Έμ μμ΅λλ€.
@thomaschampagne κ·νμ μ견μ μ΄ν΄νμ§
@aprokop μ. νΌνΈλμ€ λͺ¨λΈ λμ΄κΈ° = νλ ¨ νΌν¬ λͺ¨λΈ
@thomaschampagne κ·Έλ κ² μκ°νμ§ μμ΅λλ€. TrainingPeaks λͺ¨λΈμ
Form(day+1) = Fitness(day) - Fatigue(day)
λ€λ₯Έ λ 곡μμ΄ μ ννμ§ μμ κ² κ°μ΅λλ€.
Fitness(day+1) = Fitness(day) + (StressScore(day+1)-Fitness(day)) x ...
Fatigue(day+1) = Fatigue(day) + (StressScore(day+1)-Fatigue(day)) x ...
λ΄ TrainingPeaks 곑μ μ 보면 ν° λ Έλ ₯μ΄ κ°μ λ μλ 체λ ₯κ³Ό νΌλ‘, λ€μ λ μλ ννμ μλΉν μν₯μ λ―ΈμΉ©λλ€.
λ΄ μμ μ΄κΈ°λν©λλ€.
@thomaschampagne κ·Έλ κ² μκ°νμ§ μμ΅λλ€. TrainingPeaks λͺ¨λΈμ
νν (μΌ +1) = 체λ ₯ (μΌ)-νΌλ‘ (μΌ)
μκ² μ΅λλ€. μ΄ν΄νμ§ λͺ»νμ΅λλ€. ν°μΌμ λ€μ μ΄μμ΅λλ€. λ°κ΅΄ ν΄μ£Όμ μ κ°μ¬ν©λλ€. FYI μ½λλ λ€μκ³Ό κ°μ΅λλ€. https://github.com/thomaschampagne/elevate/blob/990b5d0fc11113b2c4d120e6aec9f0ba3dc0e844/plugin/app/src/app/fitness-trend/shared/services/fitness.service.ts#L243
PRμ λ§λλ κ²μ΄ λΉμ μκ² κ°λ₯ν μΌμ λκΉ, μλλ©΄ μ κ° μ§μ μ²λ¦¬ν©λκΉ?
μ΄ νλ‘κ·Έλλ° μΈμ΄λ‘ μμ ν μ μ μμ§λ§ μΆ©λΆν μ½λ€κ³ μκ°νλ€λ©΄ μλν΄ λ³Ό μ μμ΅λλ€. λ΄ μ£Όμ κ΄μ¬μ¬λ μν₯μλ°λ μ½λμ λ²μμ μ¬κ΅¬μ±μ΄ νμνμ§ μ¬λΆμ λλ€.
@aprokop λ²μλ https://github.com/thomaschampagne/elevate/blob/990b5d0fc11113b2c4d120e6aec9f0ba3dc0e844/plugin/app/src/app/fitness-trend/shared/services/fitness.service.ts#L226
νμ§λ§ κ±±μ νμ§ λ§μΈμ. λ³κ²½ μ¬νμ ν μ€νΈνκ³ κ²μ¦νλ €λ©΄ λμμ΄ νμν©λλ€.
@aprokop μλμ λν΄ 100 % νμ νμλκΉ?
Fitness(day+1) = Fitness(day) + (StressScore(day+1)-Fitness(day)) x ...
Fatigue(day+1) = Fatigue(day) + (StressScore(day+1)-Fatigue(day)) x ...
κΆμ₯ μ¬νμΌλ‘ μ½λλ₯Ό μμ νμ΅λλ€ (μ»€λ° https://github.com/thomaschampagne/elevate/commit/ec73ee0c5a6d3c78662c41b94a4e090c70a1572bλ₯Ό ν΅ν΄). κΈ°μ‘΄ μ½λμ ꡬνμ λ¨μννκΈ° μν΄ λ€μκ³Ό κ°μ μμμ ꡬννμ΅λλ€.
Fitness(day) = Fitness(day-1) + (StressScore(day)-Fitness(day-1)) x ...
Fatigue(day) = Fatigue(day-1) + (StressScore(day)-Fatigue(day-1)) x ...
Form(day) = Fitness(day-1) - Fatigue(day-1)
νΈμ λ΄μ κ°κΈ°
ν μ€νΈ λΉλ : v6.6.0_stable_ec73ee0_2018-10-17-16-05.zip
λΉμ μ λμμ μ£Όμ μ κ°μ¬ν©λλ€ :)
μλ νμΈμ.
μλμ λν΄ 100 % νμ νμλκΉ?
μ, μλμ€. μ, κ°μ λ μ λ Έλ ₯μ΄ κ°μ λ μ νΌνΈλμ€ / νΌλ‘μ μν₯μ λ―ΈμΉμ§ μμΌλ―λ‘ TrainingPeaksμ μΌμΉνμ§ μλλ€λ μ μμ μλͺ»λ κ²μ λλ€. λ°λμ StressScore (day)λ₯Ό StressScore (day + 1)λ‘ λ³κ²½ν΄μΌν©λλ€. κ·Έλ¬λ κ·Έκ²μ΄ μ νν 곡μμΈμ§ νμ€νμ§ μμ΅λλ€. κ·Έ 곡μμ
Fitness(day+1) = Fitness(day) + (StressScore(day+1)-Fitness(day+1)) x ...
μλ―Έκ°μμ μλ μμ΅λλ€ (κ·Έλ¬λ©΄ Fitness (day + 1)μ λν΄ ν΄κ²°ν΄μΌν©λλ€). νμ§λ§ κ·Έλλ‘ μ’λ€κ³ μκ°ν©λλ€.
컀λ°μ μ μ λ 곡μμ μ¬λ°λ₯΄κ² ꡬνν©λλ€. prevCtl
λ° μΉκ΅¬μ μ
λ°μ΄νΈλ₯Ό if (isPreStartDay)
μ μμ μ κ±° ν μ μμ§λ§ μ΄λ μ¬μν κ²μ
λλ€.
μ§μ λμ°©νλ©΄ μ λ μ ν μ€νΈ ν΄ λ³Όκ²μ.
μλν΄ λ³΄μκ³ μμλλ‘ μλν©λλ€. 체λ ₯κ³Ό νΌλ‘κ° κ°μ λ κΉμ§κ°λ λμ ννλ, λ€μ λ λ¨μ΄μ‘λ€. κ·Έλμ μ§κΈμ λ€ μ’λ€κ³ μκ°ν©λλ€.
@aprokop ν μ€νΈμ κ²ν μ κ°μ¬λ립λλ€! λ°λΌμ λ κ°μ§ 곡μμ΄ μμ΅λλ€.
Fitness(day+1) = Fitness(day) + (StressScore(day+1)-Fitness(day+1)) x ...
-- or --
Fitness(day+1) = Fitness(day) + (StressScore(day+1)-Fitness(day)) x ...
νμ§λ§ 첫 λ²μ§Έ λ¬Έμ κ° μλ€κ³ μκ°ν©λλ€. Fitness(day+1)
λ ννμμ μΌλΆμΈ κ²½μ° Fitness(day+1)
μ κ³μ°νλ κ²μ΄ μ΄μν©λλ€ ... μ΄κ²μ΄ μ°λ¦¬κ° μ°Ύκ³ μνλ κ²μ
λλ€.
κ·Έλ¦¬κ³ ννμ νλ©΄
Fitness(day+1) = (Fitness(day) - k * StressScore(day+1)) /(1 - k) where k = exp(-1/42)
... λ§μ΄ λΌ?!
TrainingPeaksμμ λ§€μΌ CSV λ°μ΄ν°λ₯Ό λ΄λ³΄λ΄λ λ°©λ²μ΄ μμ΅λκΉ? μλλ©΄ TrainingPeaks κ·Έλν μ€ν¬λ¦° μ·μμ λ λ§μ μ 보λ₯Ό μ»μΌμκ² μ΅λκΉ?
TrainingPeaks κ·Έλν μ€ν¬λ¦° μ·μμ λΉ¨κ°μ μ μ΄ λ Έλ ₯μ λ μ λκΉ? μ΄λνλ λ 체λ ₯κ³Ό νΌλ‘ 곑μ μ΄ μ¬λΌκ°λ€λ κ²μ νμΈν©λκΉ?
λΉμ μ λμμ μ£Όμ μ κ°μ¬ν©λλ€ :)
@thomaschampagne Fitness(day+1) = Fitness(day) + (StressScore(day+1)-Fitness(day+1)) x ...
μ΄ μ΄μνλ€λ λ° λμν©λλ€. 100 % νμ€νμ§ μκΈ° λλ¬Έμ μΈκΈνμ΅λλ€.
TrainingPeaksμμ λ§€μΌ CSV λ°μ΄ν°λ₯Ό λ΄λ³΄λ΄λ λ°©λ²μ΄ μμ΅λκΉ? μλλ©΄ TrainingPeaks κ·Έλν μ€ν¬λ¦° μ·μμ λ λ§μ μ 보λ₯Ό μ»μΌμκ² μ΅λκΉ?
μ΄κ²μ μ λ§ μ’μ μκ°μ λλ€. λλ κ·Έκ²μ΄ κ°λ₯νλ€κ³ λ―ΏμΌλ©° κ³Όκ±°μ κ·Έλ κ²νμ΅λλ€. μ΅κ·Ό λ°μ΄ν°λ₯Ό κ°μ Έ μ€κ² μ΅λλ€.
TrainingPeaks κ·Έλν μ€ν¬λ¦° μ·μμ λΉ¨κ°μ μ μ΄ λ Έλ ₯μ λ μ λκΉ? μ΄λνλ λ 체λ ₯κ³Ό νΌλ‘ 곑μ μ΄ μ¬λΌκ°λ€λ κ²μ νμΈν©λκΉ?
μ, λΉ¨κ°μ μ μ λ§€μΌ TSS κ°μ΄κ³ νλμ μ μ κ°λμ λλ€.
μ΄λνλ λ 체λ ₯κ³Ό νΌλ‘ 곑μ μ΄ μ¬λΌκ°λ€λ κ²μ νμΈν©λκΉ?
μ.
μ’μ΅λλ€. μ΄λμ λ΄λ³΄λΌ μ μμ§λ§ 곑μ κ°μ λ΄λ³΄λΌ μ μμ΅λλ€. μ’μ. ν μ€νΈ ν΄ λ³΄κ² μ΅λλ€.
μ΅κ·Όμ μ΄λ €μ΄ κ²½μ£Ό ( -
μ€μνμ§ μμ λ°μ΄ν°λ‘ νμ)λ₯Ό μ΄ν΄ λ³΄κ² μ΅λλ€. λ°μ΄ν°λ κ·Έλνμμ κ°μ ΈμμΌνκ³ TrainingPeaksμ μν΄ κ°μ₯ κ°κΉμ΄ μ μλ‘ λ°μ¬λ¦Όλμμ΅λλ€.
| | κ²½κΈ° μ | λ μ΄μ€ λ°μ΄ | κ²½κΈ° ν |
|-|-|-|-|
| TSS | -| 395 | -|
| νΌλ‘ | 54 | 102 | -|
| νΌνΈλμ€ | 61 | 69 | -|
| μμ | -| 8 | -33 |
κ·Έλμ:
μμ½νλ©΄ λ€μκ³Ό κ°μ κ²μ΄ μ΅μ μ μ νμ λλ€.
Form(day) = Fitness(day-1) - Fatigue(day-1)
Fitness(day) = Fitness(day-1) + (StressScore(day)-Fitness(day-1)) x (1-exp(-1/42))
Fatigue(day) = Fatigue(day-1) + (StressScore(day)-Fatigue(day-1)) x (1-exp(-1/7))
μΆμ : 2μμ μ μ°λ¦¬λ 102κ° μλλΌ 99λ₯Ό μ»μ΅λλ€.
GoldenCheetah μ΄ν΄λ³΄κΈ° :
double lte = (double)exp(-1.0/ltsDays_);
double ste = (double)exp(-1.0/stsDays_);
...
// LTS
if (day) lastLTS = lts_[day-1];
lts_[day] = (stress_[day] * (1.0 - lte)) + (lastLTS * lte);
// STS
if (day) lastSTS = sts_[day-1];
sts_[day] = (stress_[day] * (1.0 - ste)) + (lastSTS * ste);
μ΄κ²λ μμ΅λλ€.
κ·Έλμ μ λ μ°λ¦¬κ° μ’λ€κ³ μκ°ν©λλ€.
@aprokop μ΄ μ¬μΈ΅ λΆμμ κ°μ¬λ립λλ€! λͺ ννκ³ λͺ¨νΈνμ§ μμ΅λλ€!
κ°μ₯ μ μ©ν λκΈ
@aprokop μ΄ μ¬μΈ΅ λΆμμ κ°μ¬λ립λλ€! λͺ ννκ³ λͺ¨νΈνμ§ μμ΅λλ€!