Задание на скорость и время С++

Есть задание:

Есть поезд, который должен пройти путь от А до В в следующем режиме - разогнаться с ускорением 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 шт):

Автор решения: MBo

Возможны два случая.

Если поезд достигает максимальной скорости 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 решаем.

→ Ссылка
Автор решения: Zhihar

такие задачи решаются аналитически (если это не школа):

Движение можно разбить на 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

→ Ссылка