Задание на скорость и время С++
Есть задание:
Есть поезд, который должен пройти путь от А до В в следующем режиме - разогнаться с ускорением a1 до скорости, не более V, проехать с этой скоростью время, не менее t, остановиться на станции В, тормозя с ускорением по модулю А2. Рассчитайте минимальное время движения поезда.
Мой код:
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
double l,a1,a2,v,t,t1,t2,t3, l1,l2,l3;
cin >> l >> a1 >> a2 >> v >> t; //40.5 0.5 0.6 3 7.5 пример
t1 = v / a1;
l1 = (a1 * pow(t1,2)) / 2;
t3 = v / a2;
l3 = (a2 * pow(t3,2)) / 2;
// l2 = l - (l1 + l3);
// cout << l1 << " " << l2 << " " << l3 << endl;
// cout << t1 << " " << t2 << " " << t3 << endl;
if (l1+l2+l3 <= l)
{
l2 = l - (l1 + l3);
t2 = l2 / v;
cout << t1 + t2 + t3 << endl;
}
else if (l1+l2+l3 > l)
{
v = ???? ; /// на сколько уменьшить скорость?
t1 = v / a1;
l1 = (a1 * pow(t1,2)) / 2;
t3 = v / a2;
l3 = (a2 * pow(t3,2)) / 2;
l2 = l - (l1 + l3);
t2 = l2 / v;
cout << t1 + t2 + t3 << endl;
}
return 0;
}
Ответы (2 шт):
Возможны два случая.
Если поезд достигает максимальной скорости V, то первый этап проходится за время t1 = V/a1, третий за t3 = V/a2, а время второго можно найти из соотношения для пути
L = V^2/(2*a1) + V^2/(2*a2) + t2*V
t2 = L/V - V/(2*a1) + V/(2*a2)
Если время t2>=t, то именно этот случай даёт минимальное время t1+t2+t3
Иначе время второго этапа t2=t. Если время первого t1, то достигается скорость v=t1*a1, время третьего этапа t3=t1*a1/a2, и соотношение для пути
L = a1*t1^2/2 + a1*t1*t + t1^2*a1^2/(2*a2)
Решается квадратное уравнение относительно t1, находится t1, из него t3 и общее время
Вариант - за базовое неизвестное возьмём скорость v:
L = v^2/(2*a1) + v*t + v^2/(2*a2)
и квадратное уравнение относительно v решаем.
такие задачи решаются аналитически (если это не школа):
Движение можно разбить на 3 этапа:
этап 1 - разгон
v = a1 * t1
s1 = a1 * t1^2 / 2
этап 2 - равномерное движение
s2 = v * t2 = a1 * t1 * t2
этап 3 - торможение
t3 = v / a2 = a1 / a2 * t1
s3 = a2 * t3^2 / 2
Итого:
S = s1 + s2 + s3 = a1 * t1^2 / 2 + a1 * t1 * t2 + a2 * t3^2 / 2 = a1 * t1^2 / 2 + a1 * t1 * t2 + a2 * (a1 / a2 * t1)^2 / 2
T = t1 + t2 + t3 = t1 + t2 + a1 / a2 * t1
откуда:
S = a1 * t1^2 / 2 + a1 * t1 * t2 + a1^2 / a2 * t1^2 / 2
t2 = (S - a1 * t1^2 / 2 - a1^2 / a2 * t1^2 / 2) / (a1 * t1)
Итоговое время:
T = t1 + (S - a1 * t1^2 / 2 - a1^2 / a2 * t1^2 / 2) / (a1 * t1) + a1 / a2 * t1
Надо найти такое t, чтобы T было минимальным, т.е. надо найти
T' = 0
T' = 0.5 * (a1 / a2 - 2S / (a1 * t1^2) + 1)
откуда
t1 = sqrt(2s / (a1 * (a1 / a2 + 1)))
Дальше надо проверить - входит ли t1 в ограничение, т.е. a1*t1 <= v,
если входит - то это искомый ответ
если не входит - то t1 = a1 / v