- •Математические модели и численные методы
- •Структура погрешности при решении задачи на эвм
- •Решение уравнений с одной переменной Постановка задачи
- •Отделение корней
- •I. Графический способ отделения корней
- •II. Отделения корней программным способом.
- •Уточнение корней
- •Метод половинного деления
- •Метод хорд
- •Метод касательных
- •Метод простой итерации
- •Оценка погрешности метода итераций
- •Преобразование к итерационному виду
- •Решение системы линейных алгебраических Постановка задачи
- •Метод Гаусса
- •Метод простой итерации
- •Решение слу методом Зейделя
- •Интерполирование функций Постановка задачи
- •Интерполяционный многочлен Лагранжа
- •Интерполяционный многочлен Ньютона для равноотстоящих узлов
- •Первая интерполяционная формула Ньютона
- •Вторая интерполяционная формула Ньютона
- •Численное дифференцирование
- •Вычисление производной по определению
- •Вычисление производной на основе интерполяционного многочлена Лагранжа
Численное дифференцирование
Производной функции y=f(x) в точке x0 называется предел отношения приращения функции y к приращению аргумента x при стремлении x к нулю: .
Если
производную от функции в данной точке аналитически найти не удается либо
вычисление производной слишком громоздко или занимает очень много времени либо
функция f(x) задана на конечном множестве точек {xi} (i=0,1,…,n),
то необходимо перейти к численному дифференцированию.
Вычисление производной по определению
Вычисление производной по определению применяется, когда известно аналитическое выражение функции y=f(x).
Пусть функция y=f(x) определена в некоторой окрестности точки x0 и имеет производную в этой точке, т.е. ,
Где x=x–x0 ,
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=xi– xi-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) на отрезке [xi, xi+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) на отрезке [xi, xi+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