Содержание
Постановка задания
Задание для всех вариантов звучит так (или, возможно, немного изменено, так как могут быть разные издания учебного пособия):
Написать функцию с входными и выходными аргументами, вычисляющую сумму ряда с заданной точностью для вводимого значения х. Функция должна вернуть значение суммы ряда, последнее учтенное в сумме слагаемое, число учтенных слагаемых.
Вычисление очередного члена ряда в цикле осуществляется с помощью рекуррентных соотношений при экономном использовании количества операций для вычислений. При решении задачи вычисления ряда нужно использовать только один оператор цикла и нельзя использовать стандартные функции в цикле. Вычисление ряда заканчивается, если модуль очередного слагаемого ряда меньше заданной точности.
В функции main следует осуществить проверку правильности ввода исходной информации. Для оценки правильности решения надо предусмотреть вычисление по контрольной формуле с выдачей результата с большой точностью. Следует привести три результата вычислений для одного значения х и трех различных значений точности, которые отличаются на порядок.
Результаты напечатать в виде таблицы из четырех столбцов с соответствующей «шапкой».
Варианты заданий
№ | Ряд | Функция и область сходимости |
1. | $x — \frac{x^3}{3!} + \frac{x^5}{5!} — \frac{x^7}{7!} +\ …$ | |
2. | $sin(\alpha) + xcos(\alpha) — x^2\frac{sin(\alpha)}{2!} — x^3\frac{cos(\alpha)}{2!} + x^4\frac{sin(\alpha)}{4!} +\ …$ | |
3. | $1 — \frac{x^2}{2!} + \frac{x^4}{4!} — \frac{x^6}{6!} +\ …$ | |
4. | $cos(\alpha) + xsin(\alpha) — x^2\frac{cos(\alpha)}{2!} — x^3\frac{sin(\alpha)}{2!} + x^4\frac{cos(\alpha)}{4!} +\ …$ | |
5. | $x + \frac{x^3}{3!} + \frac{x^5}{5!} + \frac{x^7}{7!} +\ …$ | |
6. | $1 + \frac{x^2}{2!} + \frac{x^4}{4!} + \frac{x^6}{6!} +\ …$ | |
7. | $1 + x + \frac{x}{2!} + \frac{x}{3!} +\ …$ | |
8. | $1 + x·ln(\alpha) + \frac{(x\ ·\ ln(\alpha))^2}{2!} + \frac{(x\ ·\ ln(\alpha))^3}{3!} +\ …$ | |
9. | $(x — 1) — \frac{(x — 1)^2}{2} + \frac{(x — 1)^3}{3} — \frac{(x — 1)^4}{4} +\ …$ | |
10. | $x + \frac{x^7}{2·3} + 3·\frac{x^5}{2·4·5} + 3·5·\frac{x^7}{2·4·6·7} +\ …$ | |
11. | $\pi — (x + \frac{x^7}{2·3} + 3·\frac{x^5}{2·4·5} + 3·5·\frac{x^7}{2·4·6·7} +\ …)$ | |
12. | $\pm \frac{\pi}{2} — \frac{1}{x} + \frac{1}{3}·x^3 — \frac{1}{5}·x^5 + \frac{1}{7}·x^7 -\ …$ первый член со знаком плюс, при $x \gt 0$ и со знаком минус при $x \lt 0$ | |
13. | $\frac{\pi}{2} — (x — \frac{x^3}{3} + \frac{x^5}{5} — \frac{x^7}{7} -\ …)$ | |
14. | $x·\frac{3 + x}{3!} — x^3·\frac{5 + x}{5!} + x^5·\frac{7 + x}{7!} -\ …$ | $\frac{1 — cos(x) — sin(x)}{x}$ |
15. | $\frac{x}{3!} — \frac{x^3}{5!} + \frac{x^5}{7!} — \frac{x^7}{9!} +\ …$ | $\frac{x — sin(x)}{x^2}$ |
16. | $\frac{2x}{1!} — \frac{3x^2}{2!} + \frac{4x^3}{3!} — \frac{5x^4}{4!} +\ …$ | $x·e^{-x} — e^x + 1$ |
17. | $x^2(\frac{1}{1!} + \frac{1}{2!}) — x^4(\frac{1}{2!} + \frac{1}{4!}) + x^6(\frac{1}{3!} + \frac{1}{6!}) +\ …$ | $2 — e^{-x} — cos(x)$ |
18. | $x(\frac{1}{1} + \frac{1}{1!}) — x^2(\frac{1}{2} + \frac{1}{2!}) + x^3(\frac{1}{3} + \frac{1}{3!}) +\ …$ | $ln(1 + x) — x·e^{-x} + 1$ |
19. | $x(\frac{1}{1!} — \frac{1}{2!}) — x^2(\frac{1}{2!} — \frac{1}{4!}) + x^3(\frac{1}{3!} — \frac{1}{6!}) +\ …$ | $cos(x) — e^{-x}$ |
20. | $x·\frac{2 + x}{2!} — x^3·\frac{4 + x}{4!} — x^5·\frac{6 + x}{6!} +\ …$ | $sin(x) — cos(x) + 1$ |
21. | $1 — \frac{3x^2}{2!} + \frac{5x^4}{4!} — \frac{7x^6}{6!} +\ …$ | $cos(x) — x·sin(x)$ |
22. | $\frac{2x^6}{3!} — \frac{4x^{10}}{5!} + \frac{6x^{14}}{7!} — \frac{8x^{18}}{9!} +\ …$ | $sin(x^2) — x^2·cos(x^2)$ |
23. | $x·\frac{2 — x}{2!} + x^5·\frac{6 — x}{6!} + x^9·\frac{10 — x}{10!} +\ …$ | $\frac{sin(x) + cos(x) — e^{-x}}{2}$ |
24. | $x^2(\frac{1}{1!} + \frac{1}{1!}) — x^4(\frac{1}{2!} + \frac{1}{3!}) + x^6(\frac{1}{3!} + \frac{1}{5!}) -\ …$ | $x·sin(x) — e^{-x} + 1$ |
25. | $\frac{x^2}{4!} — \frac{x^4}{6!} + \frac{x^6}{8!} — \frac{x^8}{10!} +\ …$ | $\frac{cos(x) — 1}{x^2} + \frac{1}{2}$ |
Лабораторная работа $№3$ предполагает написание программы на языке Си. При заказе работы своего варианта вы получите качественно написанную и хорошо прокомментированную программу.
Если дополнительно закажите алгоритм решения вашей задачи (мы крайне рекомендуем это сделать), то получите аккуратно оформленный отчет-алгоритм, поясняющий все тонкости решения поставленной задачи.
Образец выполнения (вариант №15)
Условие задания
№ | Ряд | Функция и область сходимости |
15. | $\frac{x}{3!} — \frac{x^3}{5!} + \frac{x^5}{7!} — \frac{x^7}{9!} +\ …$ | $\frac{x — sin(x)}{x^2}$ |
Алгоритм решения задачи
Начнем с этапа алгоритмизации. Чтобы успешно закодировать любую задачу, надо в самую первую очередь определиться с алгоритмом решения.
По условии задания просят использовать рекуррентные соотношения. Попробуем получить эту рекуррентность. Рассмотрим первых $3$ слагаемых данного ряда:
№ слагаемого | Знак | Значение |
1. | $+$ | $\frac{x}{3!}$ |
2. | $-$ | $\frac{x^3}{5!}$ |
3. | $+$ | $\frac{x^5}{7!}$ |
Смысл рекуррентных соотношений заключается в том, чтобы очередное слагаемое, в нашем случае ряда, можно было вычислить, используя предыдущее слагаемое этого же ряда.
Найдем отношение слагаемых заданного ряда под $№2$ и $№1$: $k_{1} = \frac{Слагаемое_{2}}{Слагаемое_{1}} = \frac{x^3}{5!} : \frac{x}{3!} = \frac{x^3\ ·\ 3!}{5!\ ·\ x} = \frac{x^2}{4\ ·\ 5}$.
То есть, чтобы вычислить слагамое ряда, стоящее на $2$-й позиции, нужно взять слагаемое под $№1$ и умножить его на этот коэффициент $k_{1}$, равный $\frac{x^2}{4\ ·\ 5}$. Также не стоит забыть еще поставить перед $2$-ым слагаемым знак «минус», т к заданный ряд является знакочередующимся.
Сейчас рассмотрим отношение $3$-го и $2$-го члена данного ряда: $k_{2} = \frac{x^5}{7!} : \frac{x^3}{5!} = \frac{x^5\ ·\ 5!}{7!\ ·\ x^3} = \frac{x^2}{6\ ·\ 7}$. То есть, чтобы вычислить слагамое ряда, стоящее на $3$-й позиции, нужно взять слагаемое под $№2$ и умножить его на этот коэффициент $k_{2}$, равный $\frac{x^2}{6\ ·\ 7}$. Третий член ряда также должен быть положительным.
💡 В итоге мы видим, что рекуррентное соотношение не является постоянным ($k_{1} \neq k_{2})$. Это важнейший момент в данном алгоритме! Такую зависимость принято называть рекуррентным соотношением с непостоянным коэффициентом.
Если продолжить вычислять последующие коэффициенты рекуррентных соотношений: $k_{3},\ k_{4},\ …$, то можно заметить, что все они являются дробями, числитель которых строго равен $x^2$, а вот знаменатель будет меняться, но при этом знаменатель будет всегда равен произведению двух натуральных чисел.
Следовательно, нам нужно научиться лишь правильно вычислять знаменатель этих коэффициентов, чтобы получать очередное слагаемое заданного ряда.
$Слагаемое_{2} = Слагаемое_{1}\ ·\ k_{1} = \frac{x}{3!}\ ·\ \frac{x^2}{4\ ·\ 5}$. На момент, когда происходит вычисление $2$-го члена ряда, в сумму уже было включено значение $1$-го члена, значит, количество уже учтенных слагаемых равно $1$. Тогда, попытаемся связать формулой количество уже учтенных слагаемых, со знаменателем соответствующего коэффициента рекуррентного соотношения:
- $4 = (количество\ учтенных\ слагаемых\ +\ 1)\ ·\ 2$.
- $5 = (количество\ учтенных\ слагаемых\ +\ 1)\ ·\ 2\ +\ 1$.
Эти зависимости будут справедливы абсолютно для любого коэффициента рекуррентного соотношения.
💡 На данный момент стало абсолютно понятно, каким образом происходит формирование очередного слагаемого заданного ряда, зная значение предыдущего слагаемого. То есть выведены однозначно все необходимые рекуррентные соотношения.
Что касается знакочередования слагаемых в ряду, то учеть это досаточно просто: необходимо при вычислении текущего члена домножать его на $(-1)$.
И последнее, на что хотелось бы обратить внимание! В условии говорится, что вычисление суммы заданного ряда заканчивается, если модуль очередного слагаемого ряда меньше заданной точности. Это означает, что, как только условие $(|текущее\ слагаемое| >= точность)$ становится ложным, все расчеты прекращаются. И это слагаемое НЕ попадает в результат.
Хочу заметить, что подобное окончание вычисление суммы ряда справедливо лишь для небольшего числа рядов, особенно для рядов знакопеременных. Если бы ряд не был знакопеременным, то с огромной вероятностью нужно было бы использовать другой прием окончания всех вычислений.
Реализация задачи на языке Си
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | #include <stdio.h> // для ввода-вывода (scanf, printf) #include <conio.h> // для задержки программы (getch) #include <locale.h> // для руссификации (setlocale) #include <math.h> // для мат.функций (sin) //--------------------------------------------------------------------------------------------- // функция, которая находит сумму ряда, последний учтенный член ряда, общее кол-во членов ряда // px - текущее значение аргумента // psumSeries - отвечает за накопление суммы ряда // plastTerm - отвечает за последний учтенный член ряда // pcountTerm - отвечает за общее кол-во учтенных членов суммы ряда // peps - точность расчетов //--------------------------------------------------------------------------------------------- void F(const float px, long double *psumSeries, long double *plastTerm, int *pcountTerm, const float peps) { long double currentTerm = +1 * px / (1 * 2 * 3); // инициализация значением 1-го слагаемого ряда (x / 3!) long int denominatorFactorial; // помогает использовать рекуррентную зависимость // сумму ряда, кол-во слагаемых нужно обнулять до начала всех расчетов *psumSeries = *plastTerm = *pcountTerm = 0; // пока модуль текущего слагаемого ряда не меньше заданной точности // это текущее слагаемое добавляется к общей сумме ряда while(fabs(currentTerm) >= peps) { (*pcountTerm)++; // увеличиваем общее кол-во членов ряда на 1 *psumSeries += currentTerm; // сумма ряда увеличивается на величину последнего учтенного слагаемого *plastTerm = currentTerm; // текущее слагаемое на данный момент является последним учтенным // вычисляем знаменатель дроби, на которую будет домножаться текущий член для получения следующего denominatorFactorial = ((*pcountTerm + 1) * 2) * ((*pcountTerm + 1) * 2 + 1); // вычисляем рекуррентно очередное слагаемое ряда (в итоговой сумме оно еще не учтено) currentTerm = -currentTerm * ((px * px) / (denominatorFactorial)); } } //--------------------------------------------------------------------------------------------- // главная функция программы (точка входа) //--------------------------------------------------------------------------------------------- int main() { float x; // входное значение long double sumSeries; // сумма ряда long double lastTerm; // последнее учтенное слагаемое int countTerm; // количество учтенных слагаемых setlocale(LC_ALL, "rus"); // настройка руссификации диалогов // запрашиваем вводом с клавиатуры входное значение х printf("Введите значение Х для вычислений: "); scanf("%f", &x); // выводим на экран шапку таблицы результатов printf("\n\nТаблица результатов:"); printf("\n--------------------------------------------------------------------------------------\n"); printf("| Сумма ряда | Последнее слагаемое ряда | Количество слагаемых | Точность расчетов |\n"); printf("--------------------------------------------------------------------------------------\n"); // производим все вычисления с точностю = 0.001 F(x, &sumSeries, &lastTerm, &countTerm, 0.001); printf("| %12.3lf | %24.3lf | %20d | %17.3f |\n", sumSeries, lastTerm, countTerm, 0.001); printf("--------------------------------------------------------------------------------------\n"); // производим все вычисления с точностю = 0.0001 (отличие на порядок, чем шагом раньше) F(x, &sumSeries, &lastTerm, &countTerm, 0.0001); printf("| %12.4lf | %24.4lf | %20d | %17.4f |\n", sumSeries, lastTerm, countTerm, 0.0001); printf("--------------------------------------------------------------------------------------\n"); // производим все вычисления с точностю = 0.00001 (отличие на порядок, чем шагом раньше) F(x, &sumSeries, &lastTerm, &countTerm, 0.00001); printf("| %12.5lf | %24.5lf | %20d | %17.5f |\n", sumSeries, lastTerm, countTerm, 0.00001); printf("--------------------------------------------------------------------------------------\n"); // вычисляем сумму ряда по контрольной формуле и выводим на экран с большой точностью (до 10 цифр) printf("Значение, полученное по контрольной формуле: %0.10f", (x - sin(x)) / (x * x)); printf("\n\nДля завершения работы программы нажмите клавишу ENTER..."); getch(); // задержка программы, чтобы можно было просмотреть результаты return 0; // завершение программы и передача управления в ОС } //--------------------------------------------------------------------------------------------- |
Результаты работы программы
Стоимость заказа работы
➡ Стоимость одной программы из любого варианта составляет $200$ рублей.
➡ Стоимость блок-схемы из любого варианта составляет $200$ рублей.
💡 Стоимость алгоритма (в виде отчета в формате *.doc из любого варианта составляет $200$ рублей (заказывается опционально на ваше усмотрение, чтобы детально разобраться с решением лабораторной работы, например, не прибегая к консультации репетитора).
Для оформления заказа пишите на почту: proglabs@mail.ru.
Время нашего ответа обычно составляет не более 10 минут.
Добавить комментарий