Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

LAB5_C90

.DOC
Скачиваний:
0
Добавлен:
11.07.2019
Размер:
326.14 Кб
Скачать

Вычисление функции с помощью разложения её в степенной ряд

Задание

  1. Cоставить два варианта программы:

  • в первом варианте программа (смотри пример) выводит на экран строку с данными о близости значения встроенной функции языка к значению этой же функции, разложенной в степенной ряд. Аргумент x программа вводит с клавиатуры и заканчивает работу при вводе вместо значения x “конец файла” <Ctrl+Z>

  • во втором варианте (примера нет) программа выводит в файл таблицу с значениями аргумента x от начального xo до конечного xk с шагом Δx, соответствующие им значения функции, вычисленные по стандартной программе, значения суммы ряда, данные о близости этих значений. Границы изменения аргумента xo, xk и шаг изменения Δx, а также значение точности вычислений ε ввести с клавиатуры и вывести в файл с результатами перед таблицей в строку.

2. В первом и втором вариантах программа должна делать следующее:

    1. вычислять значения функции из задания с помощью встроенной функции языка С;

    2. вычислять приближенное значение этой же функции с помощью разложения в степенной ряд и определять число членов ряда, необходимое для получения этого значения с заданной точностью;

    3. печатать, с управлением редактирования данных, для каждого значения аргумента:

  • значение функции, вычисленное по стандартной программе

  • приближенное значение функции

  • модуль разности этих двух значений

  • число членов ряда, использованных программой для достижения заданной точности.

Вычислить сумму ряда дважды с разными значениями точности и напечатать в отчет две таблицы. Учесть, что при любом порядке суммы компьютер хранит 15 цифр мантиссы, последняя цифра не точна (задать точность суммирования, например, 10-7 и 10-17). В отчете сравнить таблицы результатов.

Отчет

Отчет по лабораторной работе должен содержать в указанном порядке:

  1. название работы;

  2. номер варианта;

  3. фамилию, имя, отчество и номер группы студента, выполнившего работу;

  4. текст задания;

  5. формулу разложения функции в степенной ряд;

  6. рекуррентную формулу и вывод коэффициента рекурсии;

  7. распечатку текста программы и двух таблиц (пример таблицы смотри ниже) с результатами вычислений с разными значениями точности

  8. результаты сравнения таблиц

  9. вопросы к заданию с правильными ответами.

x0=1.00 xk=3.00 dx=0.20 eps=1.0e-007

+-----+------------+------------+-----------+-----+

| x | sin(x) | Tailor | |f-sum| | n |

+-----+-------------------------+-----------+-----+

| 1.00| 0.84147098| 0.84147098| 1.6e-010 | 5 |

| 1.20| 0.93203909| 0.93203909| 1.2e-011 | 6 |

| 1.40| 0.98544973| 0.98544973| 1.2e-010 | 6 |

| 1.60| 0.99957360| 0.99957360| 8.7e-010 | 6 |

| 1.80| 0.97384763| 0.97384763| 6.1e-011 | 7 |

| 2.00| 0.90929743| 0.90929743| 3.6e-010 | 7 |

| 2.20| 0.80849640| 0.80849640| 2.6e-011 | 8 |

| 2.40| 0.67546318| 0.67546318| 1.4e-010 | 8 |

| 2.60| 0.51550137| 0.51550137| 6.2e-010 | 8 |

| 2.80| 0.33498815| 0.33498815| 4.7e-011 | 9 |

| 3.00| 0.14112001| 0.14112001| 2.0e-010 | 9 |

+-----+-------------------------+-----------+-----+

Справочная информация

В заданиях используются встроенные функции:

в формуле

в C

в формуле

в C

в формуле

в C

shx

sinh(x)

chx

cosh(x)

lnx

log(x)

arctgx

atan(x)

arcsinx

asin(x)

arccosx

acos(x)

xy

pow( x, y)

х│

fabs(x)

sin х

sin(x)

ex

exp(x)

cos х

cos(x)

tg х

tan(x)

Комментарии к заданию

  • Величину n! называют “n-факториалом” .

  • При суммировании степенного ряда возникают следующие задачи:

упростить вычисления и свести их к простейшим операциям,

уменьшить число этих операций и время расчета,

уменьшить погрешность вычислений.

  • Для решения этих задач служит рекуррентная формула, позволяющая вычислить величину очередного члена ряда, используя величину предыдущего. Рекуррентная формула имеет вид: an+1=an Tn

  • При суммировании бесконечного ряда Тейлора следует ограничиться конечным значением n. Для сходящегося ряда предел . Поэтому для любого положительного , начиная с некоторого n, станет меньше .

  • чтоб избежать зацикливания n ограничивают неким Ng, например, Ng=50. При n>Ng фиксируется аврия. Надо проверить, нет ли ошибки в формуле, алгоритме или программе; только если ошибок нет, можно увеличить Ng.

  • Программу следует реализовывать поэтапно:

Этап 1 – только вычисление по рекуррентной формуле при значениях x, вводимых с клавиатуры. Этап 2 – добавить цикл по x, посмотреть на числа будущей таблицы

Этап 3 – добавить форматирование вывода и оформить таблицу

Пример

Рассмотрим вычисление функции sinx. Ряд Тейлора для этой функции имеет следующий вид

Если обозначить слагаемые a0, a1, a2, ..., то формула для вычисления любого члена ряда имеет вид:

, где n = 0, 1, 2, ...

Из формулы общего члена ряда следует, что при n=0 a0 =x. Теперь каждый следующий член ряда an+1 можно вычислить с использованием уже вычисленного an с помощью соотношения (рекуррентная формула)

an+1 = an Tn, где n=0,1,2,…

Сомножитель Tn определяется по формуле

Выполним подстановки

Чтобы сократить факториалы, рассмотрим отдельно числитель и знаменатель. По определению факториала

Окончательно получим

Отметим, что в полученной рекуррентной формуле один из сомножителей, а именно -x2, не зависит от n и вычисляется до цикла по n.

Программа

//Вычисление функции с помощью разложения её в степенной ряд

//вариант № группа № студент

#include <stdio.h>

#include <math.h>

int main(void)

{

double Eps = 1.0e-7; // методическая погрешность

double An, Sum, f, x;

int n, Ndop=350; // номер члена ряда и его MAX допустимое значение

printf( "\ax=");

scanf("%lf",&x);

do

{

n = 0; An=x; Sum=An; //стартовые значения n, A0 и суммы ряда

f=sin(x); //эталон по стандартной программе

while( fabs(An) > Eps)

{

An = -An*x*x / ( (2*n+2)*(2*n+3) ); Sum += An; ++n;

if( n > Ndop)

break;

}

printf(" x F(x) Series | F(x) - Row | n \n") ;

printf( "%f %f %f %e %i \n" ,x, f, Sum, fabs(f - Sum), n);

printf( "\ax=");

}

while(scanf("%lf",&x) != EOF);

return 0;

}

Вопросы к заданию

  1. Синтаксис оператора do ... while языка C.

  2. Синтаксис оператора while языка C.

  3. С какой целью в программах на C используют оператор while

  4. Чем отличается выполнение while от do ... while

  5. С какой целью в программах на C используют оператор break

  6. В программе на C записаны следующие операторы int k = 0; while ( k < 3) printf(“k = %i \n”,k); k++; что программа выведет на экран?

  7. В программе на C записаны следующие операторы int k = 0; while ( k++ < 3); printf(“k = %i \n”,k); что программа выведет на экран?

  8. Как заменить в программе цикл while на цикл for.

  9. Перечислите описатели редактирования целых, вещественных и вещественных с удвоенной точностью чисел.

  10. Каким образом управляют из программы редактированием при выводе и когда это необходимо? Приведите примеры описателей редактирования.

  11. Получены значения f= 0.5984721, S=0.5984728 Как их отредактировать в соответствии с eps= 1.0E-02? Каким будет описатель, и что увидим при печати

  12. Что меняется в результатах при изменении eps, покажите на Ваших результатах. Объясните, почему.

Варианты заданий

Разложение функции в степенной ряд

Аргумент

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]