Прямо сейчас форма, кажется, рассчитывается как разница между Фитнесом и Усталостью того же дня. Однако может быть лучше основывать его на вчерашних показателях «Фитнес и усталость». Это, конечно, спорный вопрос. Я могу предложить только эти два момента:
а) мне это кажется более правильным субъективно, так как тренировочная усталость ощущается сильнее на следующий день
б) TrainingPeaks делает это (см. здесь , раздел «Форма»)
Форма по определению (TrainingPeaks):
Баланс тренировочного стресса (TSB) или форма представляет собой баланс тренировочного стресса.
Форма (TSB) = Вчерашний фитнес (CTL) - Вчерашняя усталость (ATL)
https://help.trainingpeaks.com/hc/en-us/articles/204071764-Form-TSB-
@aprokop Да, с используемой математической моделью. Формулы в помощнике
@thomaschampagne Не уверен, что понимаю ваш комментарий. Вы говорите, что это уже сделано?
@aprokop Да. Модель фитнеса Elevate = модель тренировочных пиков
@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, и видно, что большие усилия значительно влияют как на фитнес, так и на утомляемость в тот же день, а также на форму на следующий день.
yupp это тоже моя точка зрения:
@thomaschampagne Я так не думаю. Модель TrainingPeaks
Форма (день + 1) = Фитнес (день) - Усталость (день)
Хорошо, я не понял. Я повторно открыл билет. Спасибо за копание. Код FYI находится здесь: https://github.com/thomaschampagne/elevate/blob/990b5d0fc11113b2c4d120e6aec9f0ba3dc0e844/plugin/app/src/app/fitness-trend/shared/services/fitness.service3
Вы можете устроить пиар или я справлюсь сам?
Никогда не работал с этим языком программирования, но могу попробовать, если вы думаете, что это достаточно просто. Думаю, меня больше всего беспокоит объем затронутого кода и необходимость его реорганизации.
@aprokop В области видимости должен быть только этот метод https://github.com/thomaschampagne/elevate/blob/990b5d0fc11113b2c4d120e6aec9f0ba3dc0e844/plugin/app/src/app/fitness-trend/sharedness.service.fitness-trend/sharedness.service.fitness-trend/sharedness.service.fitness
Но не волнуйтесь, я сделаю это. Просто нужна ваша помощь, чтобы протестировать и подтвердить изменения.
@aprokop Вы уверены на 100% в этом ниже?
Fitness(day+1) = Fitness(day) + (StressScore(day+1)-Fitness(day)) x ...
Fatigue(day+1) = Fatigue(day) + (StressScore(day+1)-Fatigue(day)) x ...
Я исправил код с вашими рекомендациями (через commit 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)
@aprokop @ jayti74
Тестовая сборка: v6.6.0_stable_ec73ee0_2018-10-17-16-05.zip
Спасибо за вашу помощь :)
@thomaschampagne
Вы уверены на 100% в этом ниже?
И да и нет. Да, я уверен, что это неправильно в том смысле, что он не соответствует TrainingPeaks, поскольку усилия в один и тот же день не повлияют на фитнес / усталость в тот же день. Разумеется, необходимо изменить StressScore (день) на StressScore (день + 1). Однако я не уверен, что это точная формула. Можно было подумать, что формула похожа на
Fitness(day+1) = Fitness(day) + (StressScore(day+1)-Fitness(day+1)) x ...
также может иметь смысл (тогда нужно будет решить для Фитнес (день + 1)). Но я думаю, что это хорошо и так.
Коммит правильно реализует предложенные формулы. Вы можете убрать обновления prevCtl
и друзей из предложений if (isPreStartDay)
, но это незначительно.
Попробую вечером, когда вернусь домой.
Просто попробовал, и он ведет себя так, как ожидалось. На следующий день форма упала, а физическая форма и утомляемость повысились в тот же день. Так что, думаю, теперь все хорошо.
@aprokop Спасибо за ваши тесты и обзор! Итак, у нас есть 2 формулы:
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)
... Имеет ли это смысл?!
Есть ли способ ежедневно экспортировать данные csv из TrainingPeaks? Или получить дополнительную информацию на снимке экрана с графиком TrainingPeaks?
На скриншоте с графиком TrainingPeaks красные точки - это день усилий? Вы подтверждаете, что кривая фитнеса и усталости растет в день ваших усилий?
Спасибо за вашу помощь :)
@thomaschampagne Я согласен с вами, что Fitness(day+1) = Fitness(day) + (StressScore(day+1)-Fitness(day+1)) x ...
- странный вариант . Я упомянул об этом только потому, что не уверен на 100%.
Есть ли способ ежедневно экспортировать данные csv из TrainingPeaks? Или получить дополнительную информацию на снимке экрана с графиком 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))
PS Я до сих пор не понимаю, почему в 2. Мы получаем только 99, а не 102.
Взглянул на
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 Спасибо за глубокий анализ! Понятно, однозначно!