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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.61
isaak
102 / 39 / 9
Регистрация: 17.10.2010
Сообщений: 658
#1

Решения тригонометрического уравнения - C++

24.10.2012, 23:43. Просмотров 3427. Ответов 26
Метки нет (Все метки)

Всем доброго время суток. Написать программу для решения уравнения
http://www.cyberforum.ru/cgi-bin/latex.cgi?a*\sin(x) + b*\cos(x) = c. Параметры a, b и c вводятся пользователем. Предусмотреть ситуацию, когда уравнение решений не имеет (например http://www.cyberforum.ru/cgi-bin/latex.cgi?|c| > \sqrt{{a}^{2} + {b}^{2}}).
При условии, что http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}^{2} + {b}^{2}\neq 0 делим обе части уравнения на http://www.cyberforum.ru/cgi-bin/latex.cgi?\sqrt{{a}^{2} + {b}^{2}} получаем
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{a}{\sqrt{{a}^{2} + {b}^{2}}}*\sin(x) + \frac{a}{\sqrt{{a}^{2} + {b}^{2}}}*\cos(x)= \frac{c}{\sqrt{{a}^{2} + {b}^{2}}}
http://www.cyberforum.ru/cgi-bin/latex.cgi?\sin(x)*\cos(\alpha) + \cos(x)*\sin(\alpha) = \frac{c}{\sqrt{{a}^{2} + {b}^{2}}}
В итоге приводится к следующему виду http://www.cyberforum.ru/cgi-bin/latex.cgi?\sin(x + \alpha) = \frac{c}{\sqrt{{a}^{2} + {b}^{2}}} Откуда получается:
http://www.cyberforum.ru/cgi-bin/latex.cgi?x + \alpha ={(-1)}^{n}*\arcsin(\frac{c}{\sqrt{{a}^{2} + {b}^{2}}}) + \pi * n \Rightarrow x = {(-1)}^{n}*\arcsin(\frac{c}{\sqrt{{a}^{2} + {b}^{2}}}) + \pi * n - \alpha
Для определения угла http://www.cyberforum.ru/cgi-bin/latex.cgi?\alpha я использовал следующее соотношение:
http://www.cyberforum.ru/cgi-bin/latex.cgi?\sin(\alpha)= \frac{b}{\sqrt{{a}^{2} + {b}^{2}}} и http://www.cyberforum.ru/cgi-bin/latex.cgi?\cos (\alpha)= \frac{a}{\sqrt{{a}^{2} + {b}^{2}}}
http://www.cyberforum.ru/cgi-bin/latex.cgi?\tan(\alpha)=\frac{\sin(\alpha )}{\cos(\alpha)} = \frac{b}{a}
http://www.cyberforum.ru/cgi-bin/latex.cgi?\alpha = \arctan(\frac{b}{a})
Вот что мне удалось сделать самому
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
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <locale>
using namespace std;
int main ()
{
   setlocale( LC_ALL,"Russian" );
    int n;
    double  a, b, c;
    double x, alpha;
    cout<<"a = "; cin>>a;
    cout<<"b = "; cin>>b;
    cout<<"c = "; cin>>c;
    cout<<"n = "; cin>>n;
     if (fabs(c) > pow(a*a + b*b,(1/2)) || a*a + b*b == 0 ) // контроль введенных данных
{
 cout<<"Уравнение решений не имеет \n";
}
 else
{
    alpha = atan2(b,a);
   x = pow((-1.0),n)*asin(c/pow(a*a + b*b,(1/2))) + n*asin(-1.0) - atan2(b,a);
   cout<<"x = "<<x;
    }
system("pause");
    return 0;
}
Но программа не совсем верно считает. Подскажите пожалуйста в чем ошибка??????? Заранее огромное спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2012, 23:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Решения тригонометрического уравнения (C++):

Написать код для решения системы тригонометрического неравенства с двумя неизвестными - C++
Написать консольное приложение, в котором пользователь вводит с клавиатуры две переменных - x и y, затем производятся вычисления по...

Написать код для решения системы тригонометрического неравенства с двумя неизвестными - C++
Ссори, что морочу голову повторно, но там была ошипка которую я ещё до этого не заметил (ну бывает) :\ Извините конечно не могли бы ещё...

Решения уравнения - C++
1. (a+b)^2-(a^2+2ab)/a^2 b^2 +4ab^3 +b^4 при a=100 и b=0.001 2. (a+b)^3-(a^3)/3ab^2+b^3+3a^2 b при a=1000 и b=0,0001 ...

Нуждаюсь в решения уравнения 2A+3B+4C+5D в с++ - C++
Помогите пожалуйста, записать и решить уравнение 2A+3B+4C+5D в с++. Очень надо, но к сожалению сам в С++ не силён((( Добавлено...

Программа решения квадратного уравнения - C++
Написать программу которая будет решать квадратное уравнение (любое). Помогите пожалуйста написать.

Код решения кубического уравнения - C++
Нужно написать в С++ код решения уравнения типа: A*x^3+B*x^2+C*x+D, кто знает, пожалуйста напишите, мне сказали, что нужно решать по схеме...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
NoMasters
Псевдослучайный
1753 / 1096 / 72
Регистрация: 13.09.2011
Сообщений: 3,127
24.10.2012, 23:46 #2
Цитата Сообщение от isaak Посмотреть сообщение
1/2
Будет ноль, ибо деление целочисленное. Логику не смотрел.
doctor_lecter
280 / 153 / 8
Регистрация: 22.09.2012
Сообщений: 283
24.10.2012, 23:52 #3
n не инициализировано.

Извиняюсь, не заметил.
Psilon
Master of Orion
Эксперт .NET
5887 / 4784 / 633
Регистрация: 10.07.2011
Сообщений: 14,405
Записей в блоге: 5
Завершенные тесты: 4
25.10.2012, 00:08 #4
isaak, замените все pow на sqrt, мб поможет
isaak
102 / 39 / 9
Регистрация: 17.10.2010
Сообщений: 658
25.10.2012, 02:06  [ТС] #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
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <locale>
using namespace std;
int main ()
{
   setlocale( LC_ALL,"Russian" );
    int n;
    double  a, b, c;
    double x, alpha;
    cout<<"a = "; cin>>a;
    cout<<"b = "; cin>>b;
    cout<<"c = "; cin>>c;
    cout<<"n = "; cin>>n;
     if (fabs(c) > sqrt(a*a + b*b) || a*a + b*b == 0 ) // контроль введенных данных
{
 cout<<"Уравнение решений не имеет \n";
}
 else
{
    alpha = atan2(b,a);
   x = pow((-1.0),n)*asin(c/sqrt(a*a + b*b)) + n*asin(-1.0) - atan2(b,a);
   cout<<"x = "<<x;
    }
system("pause");
    return 0;
}
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
25.10.2012, 08:29 #6
Цитата Сообщение от isaak Посмотреть сообщение
asin(-1.0)
Надо acos.
isaak
102 / 39 / 9
Регистрация: 17.10.2010
Сообщений: 658
25.10.2012, 15:46  [ТС] #7
Спасибо за ответ вот переделал как советуете:
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
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <locale>
using namespace std;
int main ()
{
   setlocale( LC_ALL,"Russian" );
    int n;
    double  a, b, c;
    double x, alpha;
    cout<<"a = "; cin>>a;
    cout<<"b = "; cin>>b;
    cout<<"c = "; cin>>c;
    cout<<"n = "; cin>>n;
     if (fabs(c) > sqrt(a*a + b*b) || a*a + b*b == 0 ) // контроль введенных данных
{
 cout<<"Уравнение решений не имеет \n";
}
 else
{
    alpha = atan2(b,a);
   x = pow((-1.0),n)*asin(c/sqrt(a*a + b*b)) + n*acos(-1.0) - atan2(b,a);
   cout<<"x = "<<x;
    }
system("pause");
    return 0;
}
Проверьте пожалуйста логику работы программы, правильно ли я записал формулу для вычисления тангенса угла
C++
1
alpha = atan2(b,a);
и формулу для вычисления x:
C++
1
x = pow((-1.0),n)*asin(c/sqrt(a*a + b*b)) + n*asin(-1.0) - atan2(b,a);
Заранее огромное спасибо.

Добавлено через 2 часа 36 минут
А может еще ввести:
C++
1
double Pi = acos(-1.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
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <locale>
using namespace std;
int main ()
{
   setlocale( LC_ALL,"Russian" );
    int n;
    double  a, b, c;
    double x, alpha;
    double Pi = acos(-1.0);
    cout<<"a = "; cin>>a;
    cout<<"b = "; cin>>b;
    cout<<"c = "; cin>>c;
    cout<<"n = "; cin>>n;
     if (fabs(c) > sqrt(a*a + b*b) || a*a + b*b == 0 ) // контроль введенных данных
{
 cout<<"Уравнение решений не имеет \n";
}
 else
{
    alpha = atan2(b,a);
   x = pow((-1.0),n)*asin(c/sqrt(a*a + b*b)) + n*Pi - atan2(b,a);
   cout<<"x = "<<x;
    }
system("pause");
    return 0;
}
Че то я совсем запутался помогите пожалуйста???? Заранее огромное спасибо.
doctor_lecter
280 / 153 / 8
Регистрация: 22.09.2012
Сообщений: 283
25.10.2012, 16:23 #8
isaak, А в чем проблема? Щас проверил на входных данных 1 1 1 1 и 4 5 6 1 и корень определен верно.
И еще случай a^2+b^2=0 это не верно что не имеет решений. Если при этом c=0, то решений наоборот очень много.
isaak
102 / 39 / 9
Регистрация: 17.10.2010
Сообщений: 658
25.10.2012, 16:38  [ТС] #9
doctor_lecter при a^2+b^2=0 и при c=0 получается бесконечность а синус принимает значения от -1 до 1.
Миниатюры
Решения тригонометрического уравнения  
doctor_lecter
280 / 153 / 8
Регистрация: 22.09.2012
Сообщений: 283
25.10.2012, 16:43 #10
isaak, А вы посчитайте 0*cos(-17,5) + 0*sin(-17,5) и посмотрите что получится.
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
25.10.2012, 16:43 #11
Цитата Сообщение от isaak Посмотреть сообщение
a*a + b*b
Лучше вычислить это выражение один раз. Дублирование кода недопустимо.
isaak
102 / 39 / 9
Регистрация: 17.10.2010
Сообщений: 658
25.10.2012, 22:19  [ТС] #12
doctor_lecter здесь нужно вводить не градусы и радианы, а числовые значения, так как при решении данного тригонометрического уравнения http://www.cyberforum.ru/cgi-bin/latex.cgi?\sin(\alpha ) и http://www.cyberforum.ru/cgi-bin/latex.cgi?\cos (\alpha ) выразили через
http://www.cyberforum.ru/cgi-bin/latex.cgi?\sin(\alpha ) = \frac{{b}^{2}}{\sqrt{{a}^{2} + {b}^{2}}}

http://www.cyberforum.ru/cgi-bin/latex.cgi?\cos (\alpha ) = \frac{{a}^{2}}{\sqrt{{a}^{2} + {b}^{2}}}
И в формуле у меня стоят арксинус и арккосинус, а не синус и косинус, а вы вводите градусы, что не верно нужно найти по введенным числовым значениям угол, а так как синус и косинус принимать значения -1 до 1 включительно. Если a^2+b^2 - это знаменатель дроби, то арксинус уходит на бесконечность, что противоречит тригонометрическому определению.

Mr.X я записал a^2+b^2 несколько раз так как это требует условие задачи.
doctor_lecter
280 / 153 / 8
Регистрация: 22.09.2012
Сообщений: 283
25.10.2012, 22:50 #13
Цитата Сообщение от isaak Посмотреть сообщение
здесь нужно вводить не градусы и радианы, а числовые значения
А что же тогда нужно вводить? Что вы понимаете под числовым значением? И почему радианы это не числовое значение?
Цитата Сообщение от isaak Посмотреть сообщение
a^2+b^2 - это знаменатель дроби, то арксинус уходит на бесконечность, что противоречит тригонометрическому определению
Тогда по вашей логике уравнение a*x^2 - x + 1 = 0 тоже не имеет решений при a=0, т.к. a уходит в знаменатель.
Попробуйте в ваше уравнение подставить a=b=c=0 и посмотреть что получится.

Когда решая уравнение совершаете какие-либо преобразования, нужно всегда смотреть особые случаи, как например деление на 0, и проверять что будет если подставить параметры, которые эти случаи вызывают (до этого преобразования).
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
26.10.2012, 04:24 #14
Цитата Сообщение от isaak Посмотреть сообщение
Mr.X я записал a^2+b^2 несколько раз так как это требует условие задачи.
Не надо путать алгебраическую запись решения задачи и программный код этого решения. Если в алгебраической записи повторения допустимы, то в программном коде дублирование не допускается.
А вот пробелы между лексемами нужно ставить с той же необходимостью, как и между словами в обычном тексте.
Логика программы такая более правильна:
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
/////////////////////////////////////////////////////////////////////////////////////////
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <locale>
/////////////////////////////////////////////////////////////////////////////////////////
int main ()
{
    std::locale::global(std::locale(""));
    const double  PI    =   acos(-1.0);
 
    double  a   =   0;
    double  b   =   0;
    double  c   =   0;
    int     n   =   0;
    
    std::cout   <<  "a = ";     std::cin    >>  a;
    std::cout   <<  "b = ";     std::cin    >>  b;
    std::cout   <<  "c = ";     std::cin    >>  c;
    std::cout   <<  "n = ";     std::cin    >>  n;
 
    double  abs_a_b    =   sqrt(a * a + b * b);
 
    if ( abs(c) > abs_a_b )
    {
        std::cout   <<  "Уравнение решений не имеет."
                    <<  std::endl;
    }
    else
    {
        if( abs_a_b == 0 )
        {
            std::cout   <<  "x - любое действительное число."
                        <<  std::endl;
        }
        else
        {
            double  alpha   =   atan2(b, a);
 
            double  x       =           pow     ( -1.0, n       )
                                    *   asin    ( c / abs_a_b   ) 
                                -   alpha
                                +   n * PI;
 
            std::cout   <<  "x = "
                        <<  x
                        <<  std::endl;
        }
    }
    system("pause");
}
isaak
102 / 39 / 9
Регистрация: 17.10.2010
Сообщений: 658
26.10.2012, 14:10  [ТС] #15
Цитата Сообщение от doctor_lecter Посмотреть сообщение
А что же тогда нужно вводить? Что вы понимаете под числовым значением? И почему радианы это не числовое значение?

Тогда по вашей логике уравнение a*x^2 - x + 1 = 0 тоже не имеет решений при a=0, т.к. a уходит в знаменатель.
Попробуйте в ваше уравнение подставить a=b=c=0 и посмотреть что получится.

Когда решая уравнение совершаете какие-либо преобразования, нужно всегда смотреть особые случаи, как например деление на 0, и проверять что будет если подставить параметры, которые эти случаи вызывают (до этого преобразования).
Может быть вы так и решаете уравнение a*x^2 - x + 1 = 0 при a=0 решается квадратное уравнение через дискриминант, но правильное решение при a=0 следующее - x + 1 = 0, откуда x = 1. Что касается данного тригонометрического уравнения, то как я уже указал при создании этой темы
http://www.cyberforum.ru/cgi-bin/latex.cgi?\sin(\alpha)= \frac{{b}^{2}}{\sqrt{{a}^{2} + {b}^{2}}}
и
http://www.cyberforum.ru/cgi-bin/latex.cgi?\cos(\alpha)= \frac{{a}^{2}}{\sqrt{{a}^{2} + {b}^{2}}}
Если к примеру http://www.cyberforum.ru/cgi-bin/latex.cgi?\sin(\alpha)= \frac{{b}^{2}}{\sqrt{{a}^{2} + {b}^{2}}}= 0 отсюда
http://www.cyberforum.ru/cgi-bin/latex.cgi?\arcsin(\frac{b}{\sqrt{{a}^{2} + {b}^{2}}}) = \arcsin(0) = {0}^{0}
http://www.cyberforum.ru/cgi-bin/latex.cgi?\alpha ={0}^{0},
при http://www.cyberforum.ru/cgi-bin/latex.cgi?\sin(\alpha)= \frac{{b}^{2}}{\sqrt{{a}^{2} + {b}^{2}}} = 1 отсюда
http://www.cyberforum.ru/cgi-bin/latex.cgi?\arcsin(\frac{b}{\sqrt{{a}^{2} + {b}^{2}}}) = \arcsin(1) = {90}^{0}
http://www.cyberforum.ru/cgi-bin/latex.cgi?\alpha = {90}^{0}

http://www.cyberforum.ru/cgi-bin/latex.cgi?\cos(\alpha)= \frac{{a}^{2}}{\sqrt{{a}^{2} + {b}^{2}}}= 0  отсюда
http://www.cyberforum.ru/cgi-bin/latex.cgi?\arccos(\frac{a}{\sqrt{{a}^{2} + {b}^{2}}}) = \arccos(0) = {90}^{0}
http://www.cyberforum.ru/cgi-bin/latex.cgi?\alpha = {90}^{0},
при http://www.cyberforum.ru/cgi-bin/latex.cgi?\cos(\alpha)= \frac{{a}^{2}}{\sqrt{{a}^{2} + {b}^{2}}}= 1 отсюда
http://www.cyberforum.ru/cgi-bin/latex.cgi?\arccos(\frac{a}{\sqrt{{a}^{2} + {b}^{2}}}) = \arccos(0) = {90}^{0}
http://www.cyberforum.ru/cgi-bin/latex.cgi?\alpha = {360}^{0}
Я и учел эти особые случае деление на 0 a^2 + b^ 2 = 0 то есть знаменатель у нас равен 0
C++
1
a*a + b*b == 0
и
C++
1
fabs(c) > sqrt(a*a + b*b)
И у меня при a = 0, b = 0 и c = 0 получается не определенность, что я тоже показал на скрине выше. Не знаю откуда вы взяли, что программа будет выдавать конкретные значения, когда и числитель и знаменатель равен 0 или знаменатель равен 0. Вы наверное спутали с арктангенсом и арккотангенсом.


Mr.X спасибо огромное за ваш код, но нужно внести одно исправление при a^2 + b^ 2 = 0
C++
1
2
3
4
5
if( abs_a_b == 0 )
        {
            std::cout   <<  "Уравнение решений не имеет."
                        <<  std::endl;
        }
Так косинус и синус ограниченные функции.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2012, 14:10
Привет! Вот еще темы с ответами:

Функция решения квадратного уравнения - C++
Помогите пожалуйста составить программу в С++. Функции. Написать функцию решения квадратного уравнения. Исходными данными для...

Как подредактировать? (решения уравнения) - C++
#include &lt;stdio.h&gt; int main() { int x,y,k; scanf(&quot;%d&quot;,&amp;k); printf(&quot;X Y\n&quot;); for...

Составить алгоритм решения уравнения |a+5x|/(b-x)=2c - C++
Пожалуйста помогите составить алгоритм решения уравнения |a+5x|/(b-x)=2c буду очень благодарен.

Написать программу решения уравнения - C++
X (x+a) (x+b) (x+a+b) =c написать программу решения этого уравнения.


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.10.2012, 14:10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru