Консультация № 189385
16.05.2016, 19:02
0.00 руб.
16.05.2016, 20:16
0 8 1
Уважаемые эксперты! Пожалуйста,помогите с реализацией на Си, желательно с комментариями строк и с идеей решения задачи словами:

Дано вещественное число X и целое число N (> 0). Найти значение выражения X - X3/(3!) + X5/(5!) - . . . + (-1)N•X2•N+1/((2•N+1)!) (N! = 1•2•. . .•N). Полученное число является приближенным значением функции sin в точке X.

Обсуждение

давно
Посетитель
7438
7205
16.05.2016, 21:21
общий
это ответ
Здравствуйте, dasha.com!
Вот Вам реализация вычисления суммы ряда, что дает синус угла
Значения угла и количество слагаемых ряда задаются в коде. При желании можете их ввести с консоли.
При вычислении суммы элементов ряда учитывается тот факт, что каждый следующий элемент суммы
может быть получен из предыдущего: в числителе умножением на x2,
в знаменателе факториал - умножением на два следующих целых числа, знак - меняет свой знак на противоположный.
Поэтому введены три промежуточные переменные, которые хранят в себе текущее значение для элемента суммы.
x возводим в квадрат, т.к. каждый элемент надо умножать именно на квадрат икса
Для факториала задействован тип вещественный, т.к. величина очень быстро растет и в целый тип может просто не поместиться.
Для удобства вычисления факториала верхняя граница суммирования приведена к значению 2N+1, а индекс цикла меняется на 2
Для сравнения также выводится значение и библиотечной функции синус.
[code h=200]
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define PI 3.1415926535897932384626433832795

double sin(double x, int N)
{
int i;
int sign = 1; //знак слагаемого в сумме
double factorial = 1; //факториал в знаменателе слагаемого
double sum = 0; //значение суммы ряда
double g = x; //элемент суммы - x в степени (2n+1)
x *= x; //возведем в квадрат для нахождения очередного члена ряда

N = 2*N+1; //для удобства определения конца суммирования

for(i=1; i<=N; i+=2) //по всем элементам суммы
{
sum += sign*g/factorial;//вычисляем и складываем очередной элемент суммы
//готовимся к следующей итерации
sign *= -1; //чередуем знак
g *= x; //умножаем элемент суммы на x в квадрате
factorial *= (i+1)*(i+2);//а факториал на два следующих числа
}

return sum; //возвращаем сумму ряда - значение синуса
}

int main()
{
int N = 4; //задаем 5 элементов суммы [0;4]
double x = PI/4; //будем считать sin(x)

//выводим значение суммы ряда и, для сравнения, библиотечного синуса
printf(" our sin(%g) = %.16g\nlibrary's sin(%g) = %.16g\n", x, sin(x, N), x, sin(x));

return 0;
}
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
400315
5
17.05.2016, 16:55
общий
#define PI 3.1415926535897932384626433832795 -подскажите, пожалуйста, что значит вот эта строчка в вашей программе?
давно
Посетитель
7438
7205
17.05.2016, 17:09
общий
Адресаты:
Число [font=Times][$960$][/font]
Написал много знаков после точки для большей точности.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
17.05.2016, 17:11
общий
Адресаты:
Тригонометрические функции вычисляются от углов, заданных в радианах.
Без числа [font=Times][$960$][/font] никак не обойтись...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
400315
5
17.05.2016, 17:31
общий
Ваша программа написана слишком сложно, необходимо упростить выражение синуса, убрав из него факториалы!
Как-то так должно получиться, но я не могу сказать, что я 100% правильно решила!
Прикрепленные файлы:
3140e677f43fb7940681d8c9685e1558.jpg
давно
Посетитель
7438
7205
17.05.2016, 18:01
общий
Адресаты:
Как раз в программе и реализовано то, что Вы предлагаете
Каждый новый элемент суммы умножается на
-x2/((2n+2)(2n+3))
Только не сразу на такое выражение, а на sign*x/factorial
где sign - или +1, или -1
x = x2
factorial - накапливаемый факториал. Причем, для простоты i принимает значение 1,3,5,7,...,2n+1
Тогда факториал умножать надо на (i+1)(i+2)
Проще уже некуда. Вы просто не поняли программу... Посмотрите еще раз...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
400315
5
17.05.2016, 19:37
общий
Выдаёт ошибки:

5. double sin(double x, int N)
30. printf(" our sin(%g) = %.16g\nlibrary's sin(%g) = %.16g\n", x, sin(x, N), x, sin(x));

main.c|5|error: conflicting types for 'sin'|
math.h|143|note: previous declaration of 'sin' was here|
main.c||In function 'main':|
main.c|30|error: too few arguments to function 'sin'|
main.c|5|note: declared here|

давно
Посетитель
7438
7205
17.05.2016, 19:48
общий
17.05.2016, 19:49
Адресаты:
Переименуйте функцию-ряд sin, хотя бы, в sins

double sins(double x, int N)

printf(" our sin(%g) = %.16g\nlibrary's sin(%g) = %.16g\n", x, sins(x, N), x, sin(x));

Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа