Задача. Вычислите с точностью [latex]\epsilon[/latex] значение функции [latex]f\left( x \right) = \sin x[/latex]. При вычислениях допустимо использовать только арифметические операции.
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <iostream> #include <cmath> using namespace std; double sin (double x, double e) { double k, a = x; double s = x; int n=1; while (abs(a) > e) { k = - x * x / (2 * n * (2 * n + 1)); a *= k; s += a; n++; } return s; } int main () { double x, e; cin >> x >> e; cout << endl << sin(x, e); } |
Тесты
Входные данные | Входные данные | Выходные данные |
x | e | sin(x) |
1 | 0,01 | 0,841471 |
3 | 0,01 | 0,14112 |
4 | 0,001 | -0,756802 |
7 | 0,0001 | 0, 656987 |
Решение
Необходимо использовать формулу Тейлора, а именно ряд Маклорена, чтобы представить функцию
[latex]f(x)[/latex] = [latex]\sin x[/latex]Эта формула имеет такой вид [latex]\sin x[/latex] = [latex]\sum _ { n=0 }^{ \infty }{ { (-1) }^{ n } } \frac { { x }^{ 2n+1 } }{ (2n+1)! }[/latex].
Подключаем заголовочный файл cmath для использования функции abs(). Построим реккурентную формулу для [latex]x_n[/latex] через [latex]x_{n-1}[/latex] для [latex]n > 1 \left(x_0=x\right)[/latex]. Для этого найдем отношение последующего члена ряда к предыдущему [latex]k = \frac{x_n}{x_{n-1}} = -\frac{x^2}{2n\cdot(2n + 1)}[/latex].
Используем функцию while, чтобы проверить является ли член ряда [latex]x_n[/latex] больше [latex]e[/latex].
— Пожалуйста, сделайте правильные отступы. Здесь весьма доступно объясняют, как это делается.
— Вы отлично писали всё в latex и вдруг вставили две картинки. Вы же понимаете, что это не пройдёт? Здесь есть примеры задания сумм, а дроби \frac поищите, пожалуйста, сами.
Всё получится.
Увы, лучше не стало.
Что же делать?
Скопируйте свой код на эту страничку, выберите C-style и нажмите кнопку «Tabify». Текст с автоматически расставленными отступами вставьте в эту публикацию. Хотя лучше бы разобраться с отступами — это ещё 100500 раз Вам пригодится как программисту.
Как быть?
Найти формулу разложения синуса на странице Википедии. Войти в режим редактирования и скопировать формулу для синуса. Получится так —
[latex]\sin x =[/latex] [latex]x — \frac{x^3}{3!} + \frac{x^5}{5!} — \cdots\ =[/latex] [latex]\sum_{n=0}^{\infty}{(-1)^n}\frac{x^{2n+1}}{(2n+1)!} ,[/latex] [latex]x\in\mathbb{C}[/latex]. Хотя лучше бы разобраться с latex — он ещё 100500 раз Вам пригодится как математику.
*=/code> в 11-й строке и
+=/code> в 12-й?
В начале Вы справедливо писали [latex]\sin x[/latex]. Потом всё забыли и стали писать [latex]sin x[/latex]. Т.е. синус нужно кодировать \sin, а не просто sin.
Нету ссылки на код в Ideone.
Хорошо. Теперь поработаем над текстом.
— Вы пишите «Подключаем библиотеку math.h для нахождения алгебраических операций». Это неточное высказывание. А в математике и программировании неточные высказывания считаются ошибочным. Вам нужен cmath, т.к. это С++. Это не библиотека, а заголовочный файл. Он нужен для использования функции abs(), а не для каких-то «алгебраических операций».
— «Объявляем функцию sin(x) с помощью типа double». Вы не объявляете такой функции. У Вас два аргумента, а не один. И само предложение довольно нескладное и ничего не объясняет. Лучше без него обойтись.
Вы пишите: «Вычисляем рекуррентное соотношение [latex]x_n[/latex] и [latex]x_{n-1}[/latex] и находим число k. k = [latex]\frac{- x * x}{(2 * n * (2 * n + 1))}[/latex]».
Так говорить не совсем корректно по нескольким причинам. Например, вы находите не число, а формулу для его вычисления. Давайте лучше напишем так:
Не возражаете?
Конечно, выбор обозначения [latex]x_n[/latex] для членов ряда нельзя назвать удачным. В условии через [latex]x[/latex] обозначен аргумент функции. Тем более, что в программе соответствующая переменная называется a. Я бы рекомендовал выбрать одинаковые обозначения в программе и пояснительном тексте.
И обратите внимание на Ваш и мой вариант записи формулы для [latex]k[/latex]. Заметили разницу? Я использую математическую запись, а не программный код. Нужно научиться отличать математику от программирования. У каждой свой язык и способы кодирования формул.
Вы пишите «является ли член ряда суммы [latex]a[/latex]». Во-первых, слово суммы здесь лишнее. Во-вторых, Вы сами запутались в обозначениях, поскольку член ряда у Вас [latex]x_{n}[/latex], а переменная для его хранения a. Возможно стоит согласовать обозначения. Например, [latex]a_n[/latex] в математических формулах и a_n (или просто a) в коде?
Хорошо. Остановимся на этом.
Зачтено.