58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 905
1

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

26.07.2014, 21:51. Показов 6631. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приступил к циклам.
Задание такое:
Как известно, функция sin(x) может может быть вычислена в виде ряда
sin(x)=https://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)= https://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;
}
Не понял тот момент как происходят действия в теле цикла. Обязательна ли последовательность действий?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.07.2014, 21:51
Ответы с готовыми решениями:

Вычисление гиперболического синуса
Помогите пожалуйста, абсолютно не могу понять..

Неправильное вычисление синуса
double x, y, z; cout &lt;&lt; &quot;введите угол: &quot;; cin &gt;&gt; x; cout &lt;&lt; &quot;синус &quot; &lt;&lt; x &lt;&lt; &quot; = &quot; &lt;&lt;...

Задание на вычисление синуса
В этой задачке нужно вычислить синус вводимого угла без использования библиотеки &lt;cmath&gt; Я...

Неправильное вычисление синуса угла
#include &lt;iostream&gt; #include &lt;cmath&gt; #include &lt;math.h&gt; using namespace std; void main() {...

19
2443 / 1841 / 406
Регистрация: 15.12.2013
Сообщений: 8,237
26.07.2014, 21:57 2
Senarist, посмотрите в готовых задачах,кто-то уже синус-разложение выкладывал.

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

Грубо говоря я половину первой итерации старого цикла выполняю до вступления в цикл. Это необходимо из-за смены строк. Вообще прокрутите в голове порядок вычислений. Столбик в голове представьте. И поймете, что мы его полностью сохранили, только в конце добавили присвоение результата.
1
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 905
27.07.2014, 00:39  [ТС] 17
DarkMasterW все дошло! Пока вопросов нет.
0
Модератор
Эксперт С++
13502 / 10754 / 6409
Регистрация: 18.12.2011
Сообщений: 28,700
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;
    }
0
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 905
28.07.2014, 21:51  [ТС] 19
zss может Вы мне подскажете как была подсчитана данная добавка: (-1)*https://www.cyberforum.ru/cgi-bin/latex.cgi?x^2/(2n)(2n+1)
если так: https://www.cyberforum.ru/cgi-bin/latex.cgi?{q}_{n}/{q}_{n-1} то наверное я неправильно считаю.
0
2443 / 1841 / 406
Регистрация: 15.12.2013
Сообщений: 8,237
29.07.2014, 21:11 20
Senarist, "разверните" общую формулу и сравните с исходной,если совпало,сверьте внимательно с кодом.Если все совпало и там,возьмите с форума готовое разложение и сравнивайте.
0
29.07.2014, 21:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.07.2014, 21:11
Помогаю со студенческими работами здесь

вычисление погрешности - циклы.
Задание во вложении. мой код приложен. не правильно работает ряд, точнее его накопление, на сколько...

Вычисление синуса
почему при вычислении на инженерном калькуляторе sin(1) = 0,01745.... а pascal sin(1) =...

Вычисление синуса
нужно составить прогрмамму . Вычислите значение выражения sinx+sin2x+sin3x+sin nx без...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru