Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЧМ_1-5.doc
Скачиваний:
14
Добавлен:
25.08.2019
Размер:
595.46 Кб
Скачать

Численное дифференцирование

Производной функции y=f(x) в точке x0 называется предел отношения приращения функции y к приращению аргумента x при стремлении x к нулю: .

Если

  • производную от функции в данной точке аналитически найти не удается либо

  • вычисление производной слишком громоздко или занимает очень много времени либо

  • функция f(x) задана на конечном множестве точек {xi} (i=0,1,…,n),

то необходимо перейти к численному дифференцированию.

Вычисление производной по определению

Вычисление производной по определению применяется, когда известно аналитическое выражение функции y=f(x).

Пусть функция y=f(x) определена в некоторой окрестности точки x0 и имеет производную в этой точке, т.е. ,

Где x=xx0 ,

y=f(x0+x)f(x0)

Значение производной функции y=f(x) в точке x0 получим, рассматривая последовательность ,

где (x)0 – некоторое начальное приращение аргумента;

a – некоторое число a>1;

n = 0, 1, …

Значение производной примет вид: ,

где , откуда получим: .

Оценим точность приближения.

Пусть функция y=f(x) имеет непрерывную производную до второго порядка включительно в окрестности точки x0.

По формуле Тейлора ,

откуда ,

где – максимальное значение производной на (x, x0).

Окончательно получим: , где

Для достижения заданной степени точности ε при вычислении производной можно использовать неравенство: и, соответственно, последний результат принимают в качестве производной функции, вычисленной в точке x с заданной степенью точности.

Блок-схема вычисления производной по определению:

начало

Ввод x,e

dF:=( f(x+dX)- f(x))/dX

dX:=0,1

der1:=dF(x,dX)

dF(x,dX)

конец

e1<e

Вывод x, der2,e1

конец

+

dX:=dX/a

der2:=dF(x,dX)

e1:=|der1-der2|

der1:=der2

Программа вычисления производной по определению

program deriveFunction;

uses Crt;

const a=10;

var

deltaX, der1, der2, e, e1, x : real;

function F(x : real): real;

begin

f:=sin(x);

end;

{ *** Вычисление производной по определению *** }

function derivF(x, deltaX : real): real;

begin

derivF:=(f(x+deltaX)-f(x))/deltaX;

end;

BEGIN

ClrScr;

writeln('Введите значение х и точность epsilon');

readln(x,e);

deltaX:=0.1; der1:=derivF(x,deltaX);

repeat

deltaX:=deltaX/a;

der2:=derivF(x,deltaX);

e1:=abs(der1-der2);

der1:=der2;

until e1<e;

writeln('x = ',x:4:2, ' производная = ',der2:10:6);

writeln('Погрешность приближения = ', e1);

readln

END.

Введите значение х и точность epsilon

0 0.0001

x = 0.00 производная = 1.000000

Погрешность приближения = 1.6499916455E-05

Введите значение х и точность epsilon

0.76 0.0001

x = 0.76 производная = 0.724833

Погрешность приближения = 3.0968294595E-05

Вычисление производной на основе интерполяционного многочлена Лагранжа

Вычисление производной на основе интерполяционного многочлена Лагранжа применяется, когда аналитическое выражение функции y=f(x) не известно, а функция y=f(x) задана таблично.

Пусть функция y=f(x) определена на отрезке и в точках {xi} (i=0,1,2,…,n) этого отрезка принимает значения yi=f(xi).

Разность между соседними значениями аргумента xi постоянна и является шагом h=xixi-1 (i=1, …,n) разбиения отрезка на n частей, прием a=x0 и b=xn.

Найдем аппроксимации производной первого порядка с помощью значений функций yi в узловых точках xi.

Для того чтобы выразить значения производной через значения функции yi в узлах интерполяции xi, построим интерполяционный многочлен Лагранжа Lm(x) степени m, удовлетворяющий условиям

Lm(x)= f(xk)= yk (k=i, i+1, …, i+m), i+mn

Многочлен Лагранжа Lm(x) интерполирует функцию f(x) на отрезке [xixi+m]. Дифференцируя многочлен Lm(x), получаем значения производной в точках {xi} (k=i, i+1, …, i+m).

Если m=2, то график интерполяционного многочлена Лагранжа L2(x) – парабола, проходящая через три точки (xi, yi), (xi+1, yi+1) и (xi+2, yi+2).

Вычислим первую производную многочлена L2(x) на отрезке [xixi+2]:

Производная многочлена L2(x) в точках xi, xi+1, xi+2 является приближением производной функции f(x) в этих точках:

(1)

Погрешности при вычислении производных в точках xi, xi+1, xi+2 определяются следующим образом:

(2)

Формулы (2) показывают, что погрешности аппроксимации первой производной с помощью формул (1) имеют один и тот же порядок O(h2), таким образом, можно вычислять производную на отрезке [a,b] в точках {xi} (i=0,1,2,…,n) при n2 по формулам:

(3)

Полагаем, что значения производных и в точках х, близких к точкам xi, равны соответствующим значениям и .

Будем считать точку близкой к xi, если она принадлежит промежутку . Точки х, близкие к точкам xi, имеют одно и то же значение параметра

В зависимости от i при n3 используем одну из формул (5).

Программа вычисления производной первого порядка на основе интерполяционного многочлена Лагранжа:

program deriveFunction1order;

const p=15;

type

vector = array [0..p] of real;

var i,n : integer;

a,b,h,x,y1 : real;

y : vector;

BEGIN

repeat

writeln('Введите n - число разбиений отрезка [a,b]');

readln(n);

until (n>=3) and (n<=15);

writeln('Введите координаты концов отрезка [a,b]');

readln(a,b);

writeln('Введите значения функции y[i] в узлах,');

writeln('причем y0=f(a), yn=f(b)');

for i:=0 to n do readln(y[i]);

writeln('Введите x');

readln(x);

h:=(b-a)/n;

i:=trunc((x-a)/h+h/2);

if i=0 then y1:=(-3*y[0]+4*y[1]-y[2])/(2*h);

if (i>0) and (i<n) then y1:=(-y[i-1]+y[i+1])/(2*h);

if i=n then y1:=(y[n-2]-4*y[n-1]+3*y[n])/(2*h);

writeln('x=',x:6:3, 'производная 1 порядка=',y1:10:6);

readln

END.

Введите n - число разбиений отрезка [a,b]

10

Введите координаты концов отрезка [a,b]

2 3

Введите значения функции y[i] в узлах,

причем y0=f(a), yn=f(b)

4.00

6.71

10.08

14.17

19.04

24.75

31.36

38.93

47.52

57.19

68.00

Введите x

2.85

x = 2.850 производная 1 порядка = 91.300000

40