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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Написать программу нахождения суммы чисел по правилу (n-нечетно): a1+a3+a5+…+an. http://www.cyberforum.ru/cpp-beginners/thread170675.html
Написать программу нахождения суммы чисел по правилу (n-нечетно): a1+a3+a5+…+an.
C++ В матрице удалить строки, в которых встречается 3 и более одинаковых элементов Задана матрица размером m на n. Удалить те строки в которых встречается 3 и более подряд идуших элементов. http://www.cyberforum.ru/cpp-beginners/thread170674.html
C++ Перевод из одной системы счисления в другую
Осуществить перевод введенного с клавиатуры числа в двоичной, шестнадцатерич-ной, восьмеричной или десятичной системах счисления в другие системы счисления. Система счисления введенного с клавиатуры числа определяется литерой в конце числа (B – двоичная, H – шестнадцатеричная, O – восьмеричная, D – десятичная). может у кого то есть какие то наброски?например ,перевод из любой системы счисления...
Сравнение чисел в трёхзначном числе C++
Нужно определить какая из цифр в трёхзначном числе больше первая или последняя?
C++ как сделать аналог split(с#) на с++ http://www.cyberforum.ru/cpp-beginners/thread170633.html
помогите разбить строковую ячейку содержащую значение "4 8" на 2 элемента в c# это делает функция split
C++ В С++ программа по вычислению функций Задали в универе сделать В С++ программу, а я никогда с ним не сталкивался, но так вот,напишите,кто может: "написать программі на языке С++ для расчёта значений х и y по заданным формулам.В первой прогр. использовать для ввода фун-ю scanf, для вывода - printf. Во второй использовать ввод-вывод cin и cout. Определить разность между y и x." Функции: 1-я: y=1-2sin^2*A/1+sin3A 2-я: z=1-tgA/1+tgA... подробнее

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

Не по теме:

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



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

Пусть 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;
    }
}
 
Текущее время: 21:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru