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

Математический маятник - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.85
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 635
08.09.2012, 22:36     Математический маятник #1
Доброго время суток. Нужно написать программу. Математический маятник совершает колебания по закону http://www.cyberforum.ru/cgi-bin/latex.cgi?x(t) = A* sin(\omega *t + {\omega }_{0}). Частота http://www.cyberforum.ru/cgi-bin/latex.cgi?\omega маятника известна. В начальный момент координата x в k раз меньше амплитуды A. В какой момент времени T отклонение маятника максимально? Написать программу для определения параметра T при условии, что параметры http://www.cyberforum.ru/cgi-bin/latex.cgi?\omega и k вводятся пользователем. При составлении программы воспользоваться соотношениями http://www.cyberforum.ru/cgi-bin/latex.cgi?{\varphi }_{0}=\arcsin (1/k) и http://www.cyberforum.ru/cgi-bin/latex.cgi?T = (\pi /2 - {\varphi }_{0})/\omega. Вот код программы, но он работает не правильно:
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
#include <iostream>
#include <cmath>
#include <iostream> 
using namespace std;
int main()
{
       setlocale( LC_ALL,"Russian" );
        double omega, k; 
        double T, A, phi0, x;
        const double g = 9.78;
        const double PI = 3.1415;
       cout << "Введите частоту: ";
       cin >> omega;
       if( omega =0 ) // контроль введенных данных
    {
        cout<<"Такого момента времени не существует\n";
        system("pause");
        return 1;
    }
       cout << "Введите амплитуду: ";
       cin >> A;
       cout << "Введите k: ";
       cin >> k;
if( k=0 ) // контроль введенных данных
    {
        cout<<"Такого угла не существует\n";
        system("pause");
        return 1;
    }
 phi0 = asin(1/k);
T= ((PI/2) - phi0)/omega;
x = A*sin (((omega*T ) + phi0 )*PI/180);
cout << "phi0 =  "<<phi0<<"\n "; 
cout << "T =  "<<T<<"\n ";
cout << "x =  "<<x<<"\n ";   
 
 system("pause");
        return 0;
}
Подскажите пожалуйста как правильно написать программу???? заранее огромное спасибо!!!!
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Psilon
Master of Orion
 Аватар для Psilon
5743 / 4691 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
08.09.2012, 23:02     Математический маятник #2
isaak, элементарно же
x(t_max) = A =>
=>sin(omega*t + phi)== 1 =>
=>omega*t+phi = pi/2
=>t = (pi/2-phi)/omega
Так что с точки зрения теории все правильно.
бред, но может попробовать написать
C++
1
x = A*sin (((omega*T ) + phi0 )*PI/180.0);
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 635
08.09.2012, 23:47  [ТС]     Математический маятник #3
При вводе значений выводит следующий результат. Не понимаю в чем ошибка?????
Миниатюры
Математический маятник  
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6176 / 2905 / 284
Регистрация: 04.12.2011
Сообщений: 7,735
Записей в блоге: 3
09.09.2012, 00:17     Математический маятник #4
Хм... извините не вчитался сразу.
Psilon
Master of Orion
 Аватар для Psilon
5743 / 4691 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
09.09.2012, 00:21     Математический маятник #5
isaak, мб угол больше pi/2?
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6176 / 2905 / 284
Регистрация: 04.12.2011
Сообщений: 7,735
Записей в блоге: 3
09.09.2012, 00:31     Математический маятник #6
isaak, if(omega=0) и if(omega==0) разные вещи.
Забавно Ваша main реагирует на череду return'ов, не видел такого раньше. Есть же и другие способы организации ввода. )

Не по теме:

А сейчас бокс! Кличко vs Чар! Что-то волнуюсь...

Psilon
Master of Orion
 Аватар для Psilon
5743 / 4691 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
09.09.2012, 00:36     Математический маятник #7
C++
1
2
3
4
5
6
if(!omega) // контроль введенных данных
    {
        cout<<"Такого момента времени не существует\n";
        system("pause");
        return 1;
    }
так попробуй
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 635
09.09.2012, 13:42  [ТС]     Математический маятник #8
Цитата Сообщение от Psilon Посмотреть сообщение
isaak, мб угол больше pi/2?
Psilon спасибо за подсказку угол не может быть больше PI/2 так как из выражения T = (PI/2-phi0)/omega получается, что T < 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
#include <iostream>
#include <cmath>
#include <iostream> 
using namespace std;
int main()
{
       setlocale( LC_ALL,"Russian" );
        double omega, k; 
        double T, A, phi0, x;
        const double g = 9.78;
        const double PI = 3.1415;
       cout << "Введите частоту: ";
       cin >> omega;
      if(!omega) // контроль введенных данных
    {
        cout<<"Такого момента времени не существует\n";
        system("pause");
        return 1;
    }
       
       cout << "Введите амплитуду: ";
       cin >> A;
       cout << "Введите k: ";
       cin >> k;
if( k=0 ) // контроль введенных данных
    {
        cout<<"Такого угла не существует\n";
        system("pause");
        return 1;
    }
 phi0 = asin(1/k);
 
 if(phi0 > (PI/2)) // контроль введенных данных
    {
        cout<<"Такого момента времени не существует\n";
 }
 else
 {
     T= ((PI/2) - phi0)/omega;
    }
 
x = A*sin (((omega*T ) + phi0 )*PI/180.0);
cout << "phi0 =  "<<phi0<<"\n "; 
cout << "T =  "<<T<<"\n ";
cout << "x =  "<<x<<"\n ";   
 
 system("pause");
        return 0;
}
???????? Помогите пожалуйста!!!! Заранее огромное спасибо!!!!
Psilon
Master of Orion
 Аватар для Psilon
5743 / 4691 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
09.09.2012, 14:12     Математический маятник #9
isaak, а вы в каком компиляторе работаете?

Добавлено через 5 минут
Ну мне кажется как-то так
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
#include <iostream>
using namespace std;
int main()
{
       setlocale( LC_ALL,"Russian" );
        double omega, k;
        double T, A, phi0, x;
        const double g = 9.78;
        const double PI = 3.1415;
       cout << "Введите частоту: ";
       cin >> omega;
      if(!omega) // контроль введенных данных
    {
        cout<<"Такого момента времени не существует\n";
        system("pause");
        return 1;
    }
 
       cout << "Введите амплитуду: ";
       cin >> A;
       cout << "Введите k: ";
       cin >> k;
    if(!k) // контроль введенных данных
    {
        cout<<"Такого угла не существует\n";
        system("pause");
        return 1;
    }
phi0 = asin(1/k);
T= abs((PI/2) - phi0)/omega;
x = A*sin ((omega*T ) + phi0 );
cout << "phi0 =  "<<phi0<<"\n ";
cout << "T =  "<<T<<"\n ";
cout << "x =  "<<x<<"\n ";
 
 system("pause");
        return 0;
}
Кстати, вот эта строчка была совершенно зря
x = A*sin (((omega*T ) + phi0 )*PI/180.0);
там и так все в радианах.

p.s. займитесь на досуге форматированием исходных текстов
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6176 / 2905 / 284
Регистрация: 04.12.2011
Сообщений: 7,735
Записей в блоге: 3
09.09.2012, 14:14     Математический маятник #10
C++
1
2
3
4
5
6
7
8
9
10
if( k=0 ) // k=0 возвращеет k(целое 0 )  в if() преобразуется к false поэтому тело if не выполнятся (слава богу) 
    {
        cout<<"Такого угла не существует\n";
        system("pause");
        return 1;
 
//*************************************
phi0 = asin(1/k); //тут должно быть деление на ноль. Почему не вылетает? :pardon:
    }
:wall::cry:???????? Помогите пожалуйста!!!! Заранее огромное спасибо!!!!
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 635
09.09.2012, 14:23  [ТС]     Математический маятник #11
Psilon спасибо огромное!!!! У меня компилятор Visual Studio 2010. Скорей всего вы правы, чтобы T > 0 нужно брать абсолютное значение выражения.
Psilon
Master of Orion
 Аватар для Psilon
5743 / 4691 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
09.09.2012, 14:25     Математический маятник #12
isaak, всегда пожалуйста
-=ЮрА=-
Заблокирован
Автор FAQ
10.09.2012, 12:46     Математический маятник #13
Цитата Сообщение от isaak Посмотреть сообщение
какой момент времени T отклонение маятника максимально?
http://www.cyberforum.ru/cgi-bin/latex.cgi?x(t) = A*sin(\omega *t + {\varphi }_{0})
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{d}{dt}x(t) = A*\omega*cos(\omega *t + {\varphi }_{0})
Определяем экстремум функции т.е x'(t) = 0
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{d}{dt}x(t) = 0 = cos(\omega *t + {\varphi }_{0})
http://www.cyberforum.ru/cgi-bin/latex.cgi?\omega *t + {\varphi }_{0} = arccos(0) =\frac{ \pi }{2}
http://www.cyberforum.ru/cgi-bin/latex.cgi?t = \frac{\frac{ \pi }{2} - {\varphi }_{0}}{\omega }
Ответ : максимальное отклонение маятника соответсвует моменту времени http://www.cyberforum.ru/cgi-bin/latex.cgi?t = \frac{\frac{ \pi }{2} - {\varphi }_{0}}{\omega }
Psilon
Master of Orion
 Аватар для Psilon
5743 / 4691 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
10.09.2012, 15:39     Математический маятник #14
-=ЮрА=-, вы смотрите вообще? У него в выложенных исходниках и так формула присутствует
C++
1
T= ((PI/2) - phi0)/omega;
Проблема была немного в другом (потрудились бы посмотреть код прежде чем срывать покровы )
-=ЮрА=-
Заблокирован
Автор FAQ
10.09.2012, 18:12     Математический маятник #15
Psilon, я что-то недопонял тебя,кто что срывал и с кого?Ты вобще знаком с понятием производная?
Psilon
Master of Orion
 Аватар для Psilon
5743 / 4691 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
10.09.2012, 18:59     Математический маятник #16
-=ЮрА=-, Оу, мы уже на ты. Ну ладно. Вы советуете выразить автору формулу, которая у него уже присутствует в коде, значит ты вообще не глядя "сказанул". Круто че
-=ЮрА=-
Заблокирован
Автор FAQ
10.09.2012, 19:39     Математический маятник #17
isaak, ниже по твоей просьбе привожу решение (я дам расклад всех формул из условия чтобы было ясно откуда они взялись)
http://www.cyberforum.ru/cgi-bin/latex.cgi?\begin{cases}  <br />
x(t) = A*sin(\omega *t + {\varphi }_{0})  \\   <br />
x(T) = A*sin(\omega *T + {\varphi }_{0})  \\  <br />
\frac{x(T)}{x(t)} = k \end{cases}
Теперь как я показал выше да и в условии сказано период колебаний составляет:
http://www.cyberforum.ru/cgi-bin/latex.cgi?T = \frac{\frac{\pi}{2} -{ \varphi }_{0}}{\omega}
Таким образом наша система преобразуется к виду:
http://www.cyberforum.ru/cgi-bin/latex.cgi?\begin{cases}   <br />
x(t) = A*sin(\omega *t + {\varphi }_{0})  \\    <br />
x(T) = A*sin(\omega *(\frac{\frac{\pi}{2} -{ \varphi }_{0}}{\omega}) + {\varphi }_{0}) = A \\   \frac{x(T)}{x(t)} = k \end{cases}
В принципе преобразования можно было и не делать, ведь и так ясно что x(t) = A но я показал для наглядности что это так и есть
Так вот имеем
http://www.cyberforum.ru/cgi-bin/latex.cgi?\begin{cases}   <br />
x(t) = A*sin(\omega *t + {\varphi }_{0})  \\    <br />
x(T) = A \\   <br />
\frac{x(T)}{x(t)} = k \end{cases}
Т.е получаем http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{1}{k}  = sin(\omega *t + {\varphi }_{0})
Откуда легко получить уже известное нам соотношение для начальной фазы колебаний (правда в условии автор с целью упрощения подал arcsin(1/k) как соотношение для начальной фазы колебаний, хотя это соотношение для полной фазы которая связана с начальной вот таким соотношением http://www.cyberforum.ru/cgi-bin/latex.cgi?\varphi = \omega *t +{ \varphi }_{0})

Ну а теперь касательно основного задания программы:
Цитата Сообщение от isaak Посмотреть сообщение
Написать программу для определения параметра T при условии, что параметры и k вводятся пользователем.
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
#include <cmath>
#include <iostream>
using namespace std;
 
int main()
{
    double k = 0;
    double w = 0;
    double phi0 = 0;
    double pi_2 = asin(1.0);//arcsin(1) = Пи/2
    double t    = 0;
    setlocale(LC_ALL,"RUS");
    while(true)
    {
        cout<<"k = ";cin>>k;
        cout<<"w = ";cin>>w;
        if(w == 0)
            cout<<"Некорректный ввод пользователя (w == 0) - тело покоится\n";
        else
        if(k < 1)
            cout<<"Отклонение не может иметь отношение больше амплитудного\n";
        else
        if(pi_2 < (phi0 = asin(1/k)) - 1E-12)//1E-12 - та фишка с даблами о которой рассказывал
            //у чисел с плавающей точкой всегда есть погрешность
            cout<<"Данное отношение 1/k недопустимо\n";
        else
        if((t = (pi_2 - phi0)/w) == 0)
            cout<<"Маятник уже досиг амплитудного отклонения\n";
        else
            cout<<"Маятник досигнет амплитудного отклонения через :"<<t<<" сек\n";
    }
    return 0;
}
PS:Psilon вот скажи я тебя трогаю?!Мало того что твоё решение негодится, так ты ещё грубишь!

Не по теме:

Ты лучше бы глаза разул и увидел что автор той книги из которой задача ввёл упрошение дляначальной фазы подразумевая под ней полную фазу

Миниатюры
Математический маятник  
Вложения
Тип файла: rar CalcTime.exe.rar (72.4 Кб, 16 просмотров)
-=ЮрА=-
10.09.2012, 19:43
  #18

Не по теме:

Цитата Сообщение от Psilon Посмотреть сообщение
Оу, мы уже на ты.
- хороше вам за 30-гик?Если нет то нечего вообще тут просить меня выкать - я сам как бы не маленький (уже детей воспитываю), ещё выкать кому то буду, кто кому ещё вы должен говорить!

isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 635
11.09.2012, 21:32  [ТС]     Математический маятник #19
-=ЮрА=- от души огромное спасибо, все по полочкам разложил и про экстремум, производную и раскладка всех формул. А то в книге у автора ни хрена не понятно откуда че берется, у меня в голове каша была. Сейчас все стало проясняться.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2012, 21:39     Математический маятник
Еще ссылки по теме:

Объекты класса (математика, физика, программирование, линейная алгебра, математический анализ, теоретическая механика)) C++
Математический анализ кода программы. Как работает rand()? C++
C++ Неправильный математический расчёт

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
11.09.2012, 21:39     Математический маятник #20
Сообщение было отмечено автором темы, экспертом или модератором как ответ
isaak, всегда пожалуйста!Скажу, что книга та очень интересная в плане задачек и изложенного материала Просто излагать физику в книге по математике не принято, обычно подают готовые формулы с весьма и весьма лаконичным разъяснениями, я бы тебе советовал вооружится ещё учебником по физике с разделом механика и кинематика и тогда бы разбираться было бы легче
Yandex
Объявления
11.09.2012, 21:39     Математический маятник
Ответ Создать тему
Опции темы

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