Форум программистов, компьютерный форум CyberForum.ru

Время, через которое встретятся два тела - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.77
Soft
4 / 4 / 1
Регистрация: 20.09.2010
Сообщений: 102
29.09.2010, 21:51     Время, через которое встретятся два тела #1
Определить время, через которое встретятся два тела, равноускоренно движущиеся навстречу друг другу, если известны их начальные скорости, ускорения и начальное расстояние между ними.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.09.2010, 21:51     Время, через которое встретятся два тела
Посмотрите здесь:

Определить наименьшее время, которое должно пройти до того момента, когда часовая и минутная стрелки совпадут C++
время за которое сортируется массив C++
Определить время, через которое встретятся два тела, равноускоренно движущиеся навстречу друг другу C++
Алгоритм(Найти максимальное совершенное число, которое в то же время меньше введенного N) C++
Файлы. Программа, которая определяет если такой момент, что два раза вошли по одному пропуску или два раза вышли по одному (выводит все время истину) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,817
Завершенные тесты: 2
30.09.2010, 06:36     Время, через которое встретятся два тела #2

Не по теме:

По-моему эту тему нужно перенести в форум "Математика" или "Физика".



Пишу что пришло в голову.

Пусть t - время, когда тела встретятся.
Пусть первый прошел путь x. Тогда второй прошел S-x, где S - начальное расстояние.
В этот момент времени скорость первого был равен http://www.cyberforum.ru/cgi-bin/latex.cgi?a_1 t + V_{01}, второго http://www.cyberforum.ru/cgi-bin/latex.cgi?a_2 t + V_{02}, где http://www.cyberforum.ru/cgi-bin/latex.cgi?V_{01}; V_{02} - соответствующие начальные скорости.
Тогда справедливы соотношения:
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{x}{t}=a_1 t + V_{01} \\ \frac{S-x}{t}=a_2 t + V_{02}
Первое выражение подставим во второе получим:
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{S}{t}=(a_1 + a_2) t + V_{01} + V_{02}
http://www.cyberforum.ru/cgi-bin/latex.cgi?(a_1 + a_2) t^2 + (V_{01} + V_{02}) t - S = 0
Получили квадратное уравнение. И почему-то в нем будут два решения.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
30.09.2010, 11:39     Время, через которое встретятся два тела #3
Soft, при чем тут раздел C/C++ для начинающих?
Johnny_D
30.09.2010, 11:47
  #4

Не по теме:

Это была только вершина айсберга

Mr.X
Эксперт С++
 Аватар для Mr.X
2800 / 1576 / 246
Регистрация: 03.05.2010
Сообщений: 3,658
30.09.2010, 14:07     Время, через которое встретятся два тела #5
Цитата Сообщение от Евгений М. Посмотреть сообщение

Не по теме:

По-моему эту тему нужно перенести в форум "Математика" или "Физика".



Пишу что пришло в голову.

Пусть t - время, когда тела встретятся.
Пусть первый прошел путь x. Тогда второй прошел S-x, где S - начальное расстояние.
В этот момент времени скорость первого был равен http://www.cyberforum.ru/cgi-bin/latex.cgi?a_1 t + V_{01}, второго http://www.cyberforum.ru/cgi-bin/latex.cgi?a_2 t + V_{02}, где http://www.cyberforum.ru/cgi-bin/latex.cgi?V_{01}; V_{02} - соответствующие начальные скорости.
Тогда справедливы соотношения:
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{x}{t}=a_1 t + V_{01} \\ \frac{S-x}{t}=a_2 t + V_{02}
Первое выражение подставим во второе получим:
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{S}{t}=(a_1 + a_2) t + V_{01} + V_{02}
http://www.cyberforum.ru/cgi-bin/latex.cgi?(a_1 + a_2) t^2 + (V_{01} + V_{02}) t - S = 0
Получили квадратное уравнение. И почему-то в нем будут два решения.
Что же это вы, батенька, интегрирование заменяете простым умножением? Ну а второй корень отрицательный. Это означает, что если ускорения ненулевые, и телам суждено встретиться, то они уже встречались раньше. Т.е. если тело движется равноускоренно, то оно движется туда, где уже когда-то двигалось равнозамедленно. Впрочем, если тела двигаются равнозамедленно, то они могут встретиться, остановиться, полететь назад, и снова встретиться.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
////////////////////////////////////////////////////////////////////////////////////
//Определить время, через которое встретятся два тела, равноускоренно 
//движущиеся навстречу друг другу, если известны их начальные скорости, 
//ускорения и начальное расстояние между ними. 
////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <cmath>
////////////////////////////////////////////////////////////////////////////////////
bool  successfully_get_t
    (
        double  s, 
        double  v1, 
        double  v2, 
        double  a1, 
        double  a2,
        double& t
    )
{
    //Из физики известно, что:
    //s = v0 * t + a * t * t / 2,
    //откуда при
    //v0 = v1 + v2
    //a = a1 + a2
    //s = (v1 + v2) * t + (a1 + a2) * t * t / 2
    //т.е. имеем квадратное уравнение относительно t:
    //(a1 + a2)/2 * sqr(t) + (v1 + v2) * t - s = 0,
    //т.е. 
    //  a * sqr(t) + b * t + c = 0,                           (1)
    //где:
    //a = (a1 + a2)/2,
    //b = v1 + v2,
    //c = -s.
    //Если в (1) a = 0, т.е. a1 + a2 = 0, то
    if(a1 + a2 == 0)
    {
        // b * t + c = 0, откуда
        // b * t  = -c                                        (2)
        //Если b = 0, т.е. v1 + v2 = 0, то:
        if(v1 + v2 == 0)
        {
            //0 = -c                                          (3)
            //Если c = 0, т.е. s = 0, то:
            if(s == 0)
            {
                //Тела уже встретились в начальный момент, следовательно
                t = 0;
                return true;
            }
            else
            {
                //При c != 0 уравнение (3) не  имеет решения, следовательно:
                return false;
            }
        }
        else
        {
            //При b != 0 из (2) получим:
            //t  = -c / b, т.е.            
            t = s /(v1 + v2); 
            return t >= 0;
        }
    }
    else
    {
        //Дискриминант равен: D = sqr(b) - 4*a*c = sqr(v1 + v2) - 4 * (a1 + a2)/2 * (-s)
        //= sqr(v1 + v2) + 2 * (a1 + a2) * s
        double D = (v1 + v2) * (v1 + v2) + 2 * (a1 + a2) * s;
        if(D < 0)
        {
            return false;
        }
        //тогда t1,t2 = (-b ± sqrt(D)) / 2a = (-v1 - v2 ± sqrt(D)) / (a1 + a2).        
        double t1 = (-v1 - v2 - pow(D, 0.5)) / (a1 + a2);
        double t2 = (-v1 - v2 + pow(D, 0.5)) / (a1 + a2);
        if(t1 < 0 && t2 < 0)
        {
            return false;
        }
        if(t1 >= 0 && t2 >= 0)
        {
            t = t1 < t2 ? t1 : t2;
            return true;               
        }
        t = t1 >= 0 ? t1 : t2;
        return true;               
    }
}
////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
 
    double s;
    do
    {
        std::cout << "Введите начальное расстояние между телами >= 0: ";
        std::cin >> s;    
    }while(s < 0);
 
    std::cout << "Введите скорости v1 и v2 и ускорения a1 и a2 тел."
              << std::endl
              << "Скорость и ускорение считается положительным, "
              << std::endl
              << "если оно направлено в сторону другого тела."
              << std::endl;
    double v1;
    std::cout << "v1 = ";
    std::cin >> v1;
 
    double v2;
    std::cout << "v2 = ";
    std::cin >> v2;
 
    double a1;
    std::cout << "a1 = ";
    std::cin >> a1;
 
    double a2;
    std::cout << "a2 = ";
    std::cin >> a2;
 
    double t = 0;
    if(successfully_get_t(s, v1, v2, a1, a2, t))
    {
        std::cout << std::endl
                  << "Тела встретятся чере время t = "
                  << t
                  << std::endl;    
    }
    else
    {
        std::cout << std::endl
                  << "Тела не встретятся никода!"
                  << std::endl;
    }
}
Yandex
Объявления
30.09.2010, 14:07     Время, через которое встретятся два тела
Ответ Создать тему
Опции темы

Текущее время: 23:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru