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

Циклы: вычисление синуса - C++

Восстановить пароль Регистрация
 
Senarist
32 / 32 / 10
Регистрация: 14.03.2014
Сообщений: 509
26.07.2014, 21:51     Циклы: вычисление синуса #1
Приступил к циклам.
Задание такое:
Как известно, функция sin(x) может может быть вычислена в виде ряда
sin(x)=http://www.cyberforum.ru/cgi-bin/latex.cgi?x-x^3/3!+x^5/5!-...=\sum_{n=0}^{\propto }(-1)^n*(x^(2n+1))/(2n+1)!
На практике при вычислении значения функции sin(x) соответствующий ряд ограничивают, т.е. рассматривают приближенное выражение sin(x)= http://www.cyberforum.ru/cgi-bin/latex.cgi?x-x^3/3!+x^5/5!-x^7/7!+...+ (-1)^N*x^2N+1/(2N+1)!=\sum_{n=0}^{N}(-1)^n*x^2n+1/(2n+1)!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
using namespace std;
const int N=100;
int main()
{
    double x,q,s=0;
    int n;
    cout<<"Enter x=";
    cin>>x;
    q=x;
    //Âû÷èñëåГ*ГЁГҐ Г±ГЁГ*ГіГ±Г*
    for (n=1;n<=N;n++)
    {
    s+=q;
    q*=(-1)*x*x/(2*n)/(2*n+1);
    }
    cout<<"sin("<<x<<") = "<<s<<endl;
    system("PAUSE");
    return 0;
}
Не понял тот момент как происходят действия в теле цикла. Обязательна ли последовательность действий?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,913
26.07.2014, 21:57     Циклы: вычисление синуса #2
Senarist, посмотрите в готовых задачах,кто-то уже синус-разложение выкладывал.

Цитата Сообщение от Senarist Посмотреть сообщение
Обязательна ли последовательность действий?
О каких именно действиях речь?Есть конкретная формула,по ней и вычисляйте.
Senarist
32 / 32 / 10
Регистрация: 14.03.2014
Сообщений: 509
26.07.2014, 22:06  [ТС]     Циклы: вычисление синуса #3
S_el Ок. Немного по другому тогда. Пусть N=1 а не 100. по условию цикл пройдет ток 1 раз. Не могли бы вы мне показать какие действия будут происходить в теле цикла?
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
26.07.2014, 22:16     Циклы: вычисление синуса #4
Цитата Сообщение от Senarist Посмотреть сообщение
C++
1
2
s+=q;
 q*=(-1)*x*x/(2*n)/(2*n+1);
Те же действия, но только один раз. Вообще имхо напрашивается поменять строки местами, а "s" илициализировать не нулем, а "x". Иначе получается несколько бредово: мы вычисляем еще один виток цикла, а результат используем только в следующей итерации. Проще говоря в текущем виде последняя итерация цикла бесполезна.
Senarist
32 / 32 / 10
Регистрация: 14.03.2014
Сообщений: 509
26.07.2014, 22:33  [ТС]     Циклы: вычисление синуса #5
DarkMasterW вот это меня и вводит в заблуждение.
Допустим:
for(int i=1; i<=n; i++){
s+=i }
Здесь я вижу что идет суммирование натуральных чисел. Даже фигурные скобки можно упустить. А что происходит в той программе не понимаю.(
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
26.07.2014, 22:41     Циклы: вычисление синуса #6
Что происходит? Ну крутит он в цикле эти две строки. Вот и все что происходит. Или тебя интересует почему именно такая математика?
Senarist
32 / 32 / 10
Регистрация: 14.03.2014
Сообщений: 509
26.07.2014, 22:48  [ТС]     Циклы: вычисление синуса #7
Если вот тут видно что for(int i=1; i<=n; i++){ s+=i } допустим n=3 то 1+2+3 а из того кода я просто не вижу что с чем. Надеюсь вы поняли что я не понял))
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
26.07.2014, 22:57     Циклы: вычисление синуса #8
не понял, если честно...
q*=(-1)*x*x/(2*n)/(2*n+1);
s+=q;
ну счтитайте у вас не просто +i, а просто чуть более сложная формула. Поменял местами специально - так нагляднее. Почему формула такая - я не знаю и знать не хочу(имхо бесполезная вещь, кроме каких-то узких направлений).
если будет:
C++
1
2
3
4
5
for (n=1;n<=N;n++)
{
q*=n*x*x;
s+=q;
}
то вам понятно, что происходит?
Senarist
32 / 32 / 10
Регистрация: 14.03.2014
Сообщений: 509
26.07.2014, 23:06  [ТС]     Циклы: вычисление синуса #9
DarkMasterW вот так да. А в том коде, как написано в учебнике сделано для того чтобы избежать больших значений в частности http://www.cyberforum.ru/cgi-bin/latex.cgi?x^(2n+1) и http://www.cyberforum.ru/cgi-bin/latex.cgi?(2n+1)!
Для этого использовали http://www.cyberforum.ru/cgi-bin/latex.cgi?{q}_{n}={q}_{n-1}*(-1)*x^2/(2n)(2n+1)
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
26.07.2014, 23:15     Циклы: вычисление синуса #10
Примите как данность и не заморачивайтесь.Ну либо подробно разбирайте математические преобразования. Смысл в этом копаться какой? Я в школьные годы тоже докапывался для преподов с просьбами вывести формулу, а не предоставлять, как данность. Ну любопытно было. Практического смыла не было. Объяснить эту математику я вам не в состоянии - я всю ее забыл, как страшный сон и не жалею. Для практический целей дальше синусов уходить обычно не приходится, да и синусы редкость, а ряды... Ну хотите - учите, узнавайте все досканально, если желание есть - это в плюс пойдет.
Senarist
32 / 32 / 10
Регистрация: 14.03.2014
Сообщений: 509
26.07.2014, 23:20  [ТС]     Циклы: вычисление синуса #11
DarkMasterW да по самим вычислениям вопросов нет, хотя на семестровую с рядами и разложениями в ряд много времени потратил)) Меня интересует сам код. Даже если поменять эти две строчки в теле цикла местами то результаты разные.
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
26.07.2014, 23:34     Циклы: вычисление синуса #12
естественно разные.
Давайте по-дубовому

C++
1
2
3
4
5
6
int q;
for (n=1;n<=N;n++)
{
s+=q;
q*=*x*n;
}
на данном примере понятно, почему результат будет другой, если перевернуть строки? У нас результат содержится в s, но вычисления s содержатся после присвоения результату. Это глупость. Чтобы эту глупость убрать - я писал выше, что нужно сделать.

Вы можете конретизировать, что именно вам не понятно? Тут 2 строчки математики и все...
Senarist
32 / 32 / 10
Регистрация: 14.03.2014
Сообщений: 509
26.07.2014, 23:40  [ТС]     Циклы: вычисление синуса #13
DarkMasterW это я понял. Я поэтому и не понял как вычисляется результат. Ведь исходя из моего первого представленного кода все так как и у вас.
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
26.07.2014, 23:55     Циклы: вычисление синуса #14
результат не вычисляется в пределах одного цикла. Точнее он вычисляется, но не присваивается. Он просто выкидывается.

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream>
using namespace std;
const int N=100;
int main()
{
    double x,q,s=0;
    int n;
    cout<<"Enter x=";
    cin>>x;
    q=x;
    s=q; // Добавлено
    //Вычисление синуса
    for (n=1;n<=N;n++)
    {
    q*=(-1)*x*x/(2*n)/(2*n+1);
    s+=q;
    }
    cout<<"sin("<<x<<") = "<<s<<endl;
    system("PAUSE");
    return 0;
}
вот так попробуйте. Может заодно и понятнее станет. По большому счету я просто вынес:
s+=q;
из первого цикла наружу до начала for. А дальше уже можно спокойно проводит вычисления и сразу присваивать результат.

Добавлено через 4 минуты
Результат должен быть идентичен вашему варианту кода, но только при условии, если в вашем коде будет выполнено на 1 итерацию больше.
Senarist
32 / 32 / 10
Регистрация: 14.03.2014
Сообщений: 509
27.07.2014, 00:03  [ТС]     Циклы: вычисление синуса #15
Вот теперь понятно, только из каких соображений добавлено это:
C++
1
s=q;
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
27.07.2014, 00:32     Циклы: вычисление синуса #16
чтобы сохранить порядок вычислений. у нас самое первое вычисление в цикле было:
s+=q;
q при этом равнялось x, s=0.
Если мы просто выкинем эту строку, то у нас соответственно "поедут" вычисления. Можно было написать не:
s=q;
а все то же:
s+=q;
Но имхо оно как-то адекватнее выглядит в текущем коде.

Грубо говоря я половину первой итерации старого цикла выполняю до вступления в цикл. Это необходимо из-за смены строк. Вообще прокрутите в голове порядок вычислений. Столбик в голове представьте. И поймете, что мы его полностью сохранили, только в конце добавили присвоение результата.
Senarist
32 / 32 / 10
Регистрация: 14.03.2014
Сообщений: 509
27.07.2014, 00:39  [ТС]     Циклы: вычисление синуса #17
DarkMasterW все дошло! Пока вопросов нет.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
27.07.2014, 08:20     Циклы: вычисление синуса #18
Замечание.
Вычисление до заданного N лишено смысла, т.к. ничего нельзя сказать о точности результата.
Суммирование надо вести до тех пор, пока очередной член ряда не станет достаточно малым
C++
1
2
3
4
5
6
7
8
q=x;
    s=q; // Добавлено
    //Вычисление синуса
    for (n=1;fabs(q)>1e-10;n++)
    {
        q*=-x*x/(2.*n)/(2.*n+1.);
        s+=q;
    }
Senarist
32 / 32 / 10
Регистрация: 14.03.2014
Сообщений: 509
28.07.2014, 21:51  [ТС]     Циклы: вычисление синуса #19
zss может Вы мне подскажете как была подсчитана данная добавка: (-1)*http://www.cyberforum.ru/cgi-bin/latex.cgi?x^2/(2n)(2n+1)
если так: http://www.cyberforum.ru/cgi-bin/latex.cgi?{q}_{n}/{q}_{n-1} то наверное я неправильно считаю.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2014, 21:11     Циклы: вычисление синуса
Еще ссылки по теме:

C++ Циклы. Вычисление суммы ряда
C++ Вложенные циклы (вычисление суммы ряда)
C++ Вычисление суммы квадратов четных и кубов нечетных чисел (циклы)

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

Или воспользуйтесь поиском по форуму:
S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,913
29.07.2014, 21:11     Циклы: вычисление синуса #20
Senarist, "разверните" общую формулу и сравните с исходной,если совпало,сверьте внимательно с кодом.Если все совпало и там,возьмите с форума готовое разложение и сравнивайте.
Yandex
Объявления
29.07.2014, 21:11     Циклы: вычисление синуса
Ответ Создать тему
Опции темы

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