Elevate: Фитнес-тренд «Форма» должен основываться на вчерашних «Фитнес» и «Усталость».

Созданный на 23 апр. 2018  ·  18Комментарии  ·  Источник: thomaschampagne/elevate

Опишите свое окружение

  • Версия плагина: 6.1.2 стабильная
  • Версия Chrome / Opera / Chromium: Chrome
  • Версия ОС: Mac OS

Опишите проблему:

Прямо сейчас форма, кажется, рассчитывается как разница между Фитнесом и Усталостью того же дня. Однако может быть лучше основывать его на вчерашних показателях «Фитнес и усталость». Это, конечно, спорный вопрос. Я могу предложить только эти два момента:
а) мне это кажется более правильным субъективно, так как тренировочная усталость ощущается сильнее на следующий день
б) TrainingPeaks делает это (см. здесь , раздел «Форма»)

bug major

Самый полезный комментарий

@aprokop Спасибо за глубокий анализ! Понятно, однозначно!

Все 18 Комментарий

Форма по определению (TrainingPeaks):
Баланс тренировочного стресса (TSB) или форма представляет собой баланс тренировочного стресса.

Форма (TSB) = Вчерашний фитнес (CTL) - Вчерашняя усталость (ATL)

https://help.trainingpeaks.com/hc/en-us/articles/204071764-Form-TSB-

@aprokop Да, с используемой математической моделью. Формулы в помощнике

@thomaschampagne Не уверен, что понимаю ваш комментарий. Вы говорите, что это уже сделано?

@aprokop Да. Модель фитнеса Elevate = модель тренировочных пиков

image

@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, и видно, что большие усилия значительно влияют как на фитнес, так и на утомляемость в тот же день, а также на форму на следующий день.

screen shot 2018-10-16 at 9 33 13 am

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

  • Вы также можете протестировать сборку ниже и сравнить ее со своими TrainingPeaks, чтобы убедиться, что все в порядке, без регрессов? (Сборка включает фиксацию https://github.com/thomaschampagne/elevate/commit/ec73ee0c5a6d3c78662c41b94a4e090c70a1572b ofc)

Тестовая сборка: 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) , но это незначительно.

Попробую вечером, когда вернусь домой.

Просто попробовал, и он ведет себя так, как ожидалось. На следующий день форма упала, а физическая форма и утомляемость повысились в тот же день. Так что, думаю, теперь все хорошо.
screenshot_20181017_202434

@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 |

Так:

  1. Усталость (день) - Фитнес (день) = 69 - 102 = 33 = Форма (день + 1), поэтому у нас есть правильная формула для Формы.
  2. Усталость (день-1) + (TSS - Усталость (день-1)) x ... = 54 + (395-54) x (1-e ** (- 1/7)) = 99, поэтому примерно 102?
  3. (Усталость (день-1) + TSS (1-k)) / (2-k) = (54 + 395 (1-k)) / (2-k) = 94, так что вперед. (k = ехр (-1/7)). Я исправил вычисления фомулы здесь, так как в предыдущем комментарии неверен.
  4. Фитнес (день-1) + (TSS - Фитнес (день-1) x ... = 61 + (395-61) x (1-e ** (- 1/42) = 69, так что это правильно.
  5. (Фитнес (день-1) + TSS (1-K)) / (2-K) = (61 + 395 (1-K)) / (2-K) = 69, так что это тоже примерно правильно (здесь K = ехр (-1/42)).

Таким образом, это кажется лучшим вариантом:

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 Спасибо за глубокий анализ! Понятно, однозначно!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги