Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаб_2_метод_указания.doc
Скачиваний:
2
Добавлен:
09.11.2018
Размер:
412.67 Кб
Скачать

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

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

Разложение функции в ряд Тейлора в точке – это есть вычисление суммы S бесконечного ряда и пример итерационного цикла (неизвестно количество слагаемых в сумме, а момент завершения вычисления суммы (конец итерационного цикла) определяется только в ходе вычислений, при сравнении очередного получаемого слагаемого с наперед заданным значением точности ε (эпсилон).

Чтобы оптимизировать процесс вычислений, рассматриваемый алгоритм предполагает суммирование слагаемых слева направо с пересчетом очередного слагаемого в его отношении к предыдущему (т.е. умножением на некоторый коэффициент). Рассмотрим алгоритм на примере разложения функции sin(x):

Процесс вычисления суммы ряда S завершается, если очередное значение y по модулю будет меньше ε.

Вычислим в точке x сумму ряда S и количество слагаемых n:

int main ()

{

double y, x, S, eps = 0.00001; // y – очередное слагаемое

int n=0;

cin >> x; //значение точки, в которой выполняется вычисление

y=x; //первое слагаемое данного ряда равно х

S=y; //первое значение суммы

while (fabs(y) > eps) //пока точность не достигнута

{ n++;

y *=-x*x/(2*n*(2*n+1)); //пересчет слагаемого

S +=y;

}

cout << "x = " << x << " S =" << S << " n=" << n << endl;

_getch();

return 0;

}

Разложение функции в ряд Тейлора на отрезке представляется в виде вложенных циклов. Внешний цикл (организация движения по отрезку) является циклом с параметром. Его можно реализовать циклами for, while или do-while. Внутренний цикл (вычисление функции в точке) – это итерационный цикл. Его желательно реализовать циклами while или do-while:

#include <math.h>

int main ()

{ double y, x0, xn, h=0.1, S, eps = 0.00001;

int n; //счетчик числа слагаемых

cin >> x0 >> xn; //ввод границ отрезка

double x=x0;

const double B=xn+h/2;

while (x < B) //внешний цикл движения по отрезку

{n=0; y=x; S=y;

while (fabs(y) > eps) //цикл вычисления суммы ряда в точке

{ n++;

y *=-x*x/(2*n*(2*n+1));

S +=y;

} //end_while вычисления суммы ряда в точке

cout << "x=" << setw(5)<<setiosflags(ios::right)<< x << " S=" << setw(9) << setiosflags(ios::right)<< S << endl;

x+=h; //переход к очередной точке отрезка

} //end_while движения по отрезку

_getch();

return 0;

}

Результаты:

1 2 //границы отрезка

x= 1 S= 0.841471

x= 1.1 S= 0.891207

x= 1.2 S= 0.932039

x= 1.3 S= 0.963558

x= 1.4 S= 0.98545

x= 1.5 S= 0.997495

x= 1.6 S= 0.999574

x= 1.7 S= 0.991665

x= 1.8 S= 0.973848

x= 1.9 S= 0.9463

x= 2 S= 0.909297

Организация работы с последовательностью чисел, вводимых с клавиатуры

  1. Определим минимальное число последовательности натуральных чисел:

int main ()

{

int a, min;

printf (" min\n");

printf (" input, exit - 0 \n");

printf ("->");

scanf ("%d", &a);

min = a;

while (a>0)

{

if (a < min) min = a;

printf ("->");

scanf ("%d", &a);

}

printf ("min: ");

printf ("%i \n", min);

printf ("\n exit - <enter>\n");

_getch();

return 0;

}

  1. Для заданных n и целых чисел с1, с2, ..., сn и s1, s2, ..., sn

вычислить:

int main()

{ double proizv=1.; //переменная для вычисления произведения

double c=0, c1, s=0, s1; //переменные для числителя и знаменателя

int n;

cout <<"n="; cin>> n; //количество сомножителей

for (int i=1; i<=n; i++)

{cout <<"\nc" << i << "= "; cin >> c1;

cout <<"\ns" << i << "= "; cin >> s1;

c+=c1; //вычисление очередного числителя

s+=s1; //вычисление очередного знаменателя

proizv *=c/s; //вычисление произведения

}

cout << "\nproizv= " << proizv << '\n';

_getch();

return 0;

}