MLoop 4

Задача. Вычислите с точностью [latex]\epsilon[/latex] значение функции [latex]f\left( x \right) = \sin x[/latex]. При вычислениях допустимо использовать только арифметические операции.

Код программы

Тесты

Входные данные Входные данные Выходные данные
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].

Ideone.com

 

Настя Панько
Настя Панько

Latest posts by Настя Панько (see all)

7 thoughts on “MLoop 4

  1. — Пожалуйста, сделайте правильные отступы. Здесь весьма доступно объясняют, как это делается.
    — Вы отлично писали всё в latex и вдруг вставили две картинки. Вы же понимаете, что это не пройдёт? Здесь есть примеры задания сумм, а дроби \frac поищите, пожалуйста, сами.
    Всё получится.

  2. Увы, лучше не стало.

    • К сожалению с отступами не получилось.
      Что же делать?
      Скопируйте свой код на эту страничку, выберите C-style и нажмите кнопку «Tabify». Текст с автоматически расставленными отступами вставьте в эту публикацию. Хотя лучше бы разобраться с отступами — это ещё 100500 раз Вам пригодится как программисту.
    • С формулами тоже. В начале Вы справедливо писали [latex]\sin x[/latex]. Потом всё забыли и стали писать [latex]sin x[/latex]. Формула для разложения синуса в ряд и неверная, и записана не по математическим правилам. Не нужно использовать * вместо умножения, умножение вместо возведения в квадрат и т.п.
      Как быть?
      Найти формулу разложения синуса на странице Википедии. Войти в режим редактирования и скопировать формулу для синуса. Получится так —
      [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 раз Вам пригодится как математику.
    • Это не так важно, но не хотите ли Вы использовать *= в 11-й строке и += в 12-й?
  3. Хорошо. Теперь поработаем над текстом.
    — Вы пишите «Подключаем библиотеку math.h для нахождения алгебраических операций». Это неточное высказывание. А в математике и программировании неточные высказывания считаются ошибочным. Вам нужен cmath, т.к. это С++. Это не библиотека, а заголовочный файл. Он нужен для использования функции abs(), а не для каких-то «алгебраических операций».
    — «Объявляем функцию sin(x) с помощью типа double». Вы не объявляете такой функции. У Вас два аргумента, а не один. И само предложение довольно нескладное и ничего не объясняет. Лучше без него обойтись.

  4. Вы пишите: «Вычисляем рекуррентное соотношение [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_{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].

    Не возражаете?
    Конечно, выбор обозначения [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) в коде?

Добавить комментарий