Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Sh@dow777
16 / 16 / 6
Регистрация: 10.12.2013
Сообщений: 709
#1

Перевод аргумента в промежуток

09.12.2015, 13:13. Просмотров 897. Ответов 6
Метки нет (Все метки)

Привет всем.
Написал программу, которая сравнивает значения сумм рядов со стандартными функциями cos(x) и sin(x).
Вот код:
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
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
 
double factorial(int k){
    int i = 1;
    double fact = i;
    double f = 2 * k;
 
    if(f == 0 || f == 1)
        return 1.0;
    else{
        for(i;i <= f;i++)
            fact *= i;
        return fact;
    }
}
 
double factorial1(int k){
    int i = 1;
    double fact = i;
    double f = (2 * k) + 1;
 
    if(f == 0 || f == 1)
        return 1.0;
    else{
        for(i;i <= f;i++)
            fact *= i;
        return fact;
    }
}
 
double epsilon(){
    double curr = 1.0, prev;
 
    while(1 + curr > 1){
        prev = curr;
        curr /= 2.0;
    }
    return curr;
}
 
double summa(double x){
    int k = 0;
    double var = 1.0;
    double sum = 0;
 
    while(abs(var) > epsilon()){
        var = (pow(-1,k) * pow(x, (2 * k))) / factorial(k);
        sum += var;
        k++;
    }
    return sum;
}
 
double summa1(double x){
    int k = 0;
    double var = 1.0;
    double sum = 0;
 
    while(abs(var) > epsilon()){
        var = (pow(-1,k) * pow(x, ((2 * k) + 1))) / factorial1(k);
        sum += var;
        k++;
    }
    return sum;
}
 
void main(){
    double x = 0.0;
 
    cout << "X" << setw(15) << "S" << setw(15) << "cos" << endl;
 
    for(x;x <= 50.0;x += 5.0){
        cout << x << setw(16) << summa(x) << setw(16) << cos(x) << endl;
    }
    cout << endl << endl;
 
    cout << "X" << setw(15) << "S" << setw(18) << "sin" << endl;
 
    for(x = 0.0;x <= 50.0;x += 5.0){
        cout << x << setw(16) << summa1(x) << setw(16) << sin(x) << endl;
    }
 
    system("pause");
}
Но когда увеличивается икс, увеличивается и погрешность в вычислениях. И в задании написано, что нужно икс перевести в промежуток http://www.cyberforum.ru/cgi-bin/latex.cgi?[0, 2\pi ]. Как это сделать?
Заранее спасибо.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2015, 13:13
Ответы с готовыми решениями:

Создать функцию, имеющую два аргумента и возвращающую в качестве аргумента число из отрезка [a,b]
Создать функцию, которая будет иметь два целочисленных параметра a и b, и в...

Напишите функцию, принимающую два аргумента, изменяющую значение второго аргумента и возвращающую void
Помогите, пожалуйста:( Напишите функцию add_tax типа void. У нее два...

Промежуток рандомных чисел
Здравствуйте. Подскажите пожалуйсто где я тут напортачил. Нужно вывести 10...

Промежуток {000000 - 999999}
Засел на последней задаче по теме :) Необходимо посчитать кол-во счастливых...

Вычислить промежуток времени
линейные алгоритмы Заданы моменты начала и конца некоторого периода времени в...

6
Lensato
49 / 49 / 31
Регистрация: 07.10.2015
Сообщений: 170
09.12.2015, 17:29 #2
Промежуток [0, 2PI] это от 0 до 360 градусов.
Значит
C++
1
2
while(x >= 360)
x -= 360;
1
Sh@dow777
16 / 16 / 6
Регистрация: 10.12.2013
Сообщений: 709
09.12.2015, 17:50  [ТС] #3
Lensato, Не понял.
После перевода аргумента в этот промежуток у меня должны получиться такие же 2 таблицы, как и до перевода, только без погрешности.
То есть, x должен быть равен 0, 5, 10, ..., 50. И вычисляются две суммы ряда, косинус и синус от икса. Результаты в виде таблиц выводятся.
0
Lensato
49 / 49 / 31
Регистрация: 07.10.2015
Сообщений: 170
10.12.2015, 09:07 #4
Sh@dow777, какой бы икс ни был, погрешность будет в любом случае.
Не знаю текста всего задания и исхожу из вашего поста.
Я понимаю так:
Если x = 40, то будет некая погрешность
если x = 400, то будет чуть большая погрешность
если x = 760, то будет еще большая погрешность

Следовательно приводим 400 и 760 к промежутку от 0 до 2Пи и получаем 40 и 40 соответственно, сводя погрешность к минимальной.
1
Sh@dow777
16 / 16 / 6
Регистрация: 10.12.2013
Сообщений: 709
10.12.2015, 15:53  [ТС] #5
Lensato, " Провести расчёты для x = 0, 5,10, …., 50.

Результат вычисления cos(x), sin(x) сравнить со значением, вычисленным для заданных x с помощью стандартных соответствующих функций .

Оценить относительную погрешность результата и объяснить неудовлетворительную точность для некоторых значений x. Для устранения проблемы воспользоваться периодичностью рассматриваемых функций. Для этого перевести аргумент в промежуток [ 0, 2π ]. Сравнить полученные результаты и объяснить причину неудовлетворительной точности в первом варианте."

Вот задание.

А вот формулы, по которым идет сравнение обычных функций косинуса и синуса с суммами рядов(изображение).
0
Миниатюры
Перевод аргумента в промежуток  
Lensato
49 / 49 / 31
Регистрация: 07.10.2015
Сообщений: 170
10.12.2015, 17:42 #6
Лучший ответ Сообщение было отмечено Sh@dow777 как решение

Решение

PI = 3.14 радиан
cos(x) = cos(радиан)

cos(10) = cos(10 радиан) = cos(3 * PI радиан + 0.5752 радиан) = cos(3.14 + 3.14 + 3.14 + 0.5752 радиан) =
= cos(3.14 + 0.5752 радиан) = cos(180 градусов + 32.9 градусов) = cos(213 градусов)

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
const double PI = 3.14159265358979323846;
 
void main()
{
    double x = 0.0;
 
    cout << "X" << setw(15) << "S" << setw(15) << "cos" << endl;
 
    for (x; x <= 50.0; x += 5.0)
    {
        double mod_x = x;
        while (mod_x >= PI + PI)
            mod_x -= PI + PI;
 
        cout << x << setw(16) << summa(mod_x) << setw(16) << cos(x) << endl;
    }
 
    cout << endl << endl;
    cout << "X" << setw(15) << "S" << setw(18) << "sin" << endl;
 
    for (x = 0.0; x <= 50.0; x += 5.0)
    {
        double mod_x = x;
        while (mod_x >= PI + PI)
            mod_x -= PI + PI;
 
        cout << x << setw(16) << summa1(mod_x) << setw(16) << sin(x) << endl;
    }
 
    system("pause");
}
1
Sh@dow777
16 / 16 / 6
Регистрация: 10.12.2013
Сообщений: 709
11.12.2015, 03:30  [ТС] #7
Lensato, Спасибо вам большое! То, что надо.
0
11.12.2015, 03:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2015, 03:30

Скопировать промежуток в TCHAR
Всем привет. Делаю программу в WinApi на Visual Studio 10. Такой вопрос. Если я...

Почему 1 входит в промежуток?
#include &lt;stdio.h&gt; #include &lt;locale&gt; int main() {...

Определить промежуток времени
Добрый вечер, уважаемые форумчане. Никак не могу сдвинуться с места со свое...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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