Похожие презентации:
Презентация 6 (2024)
1.
Особенности дифференцированияОперация дифференцирования реализована в Python как в численной,
так и в аналитической форме.
Аналитически продифференцировать функцию можно с помощью
символьных операций. Если функция задана аналитически, то значение
ее производной в точке можно найти, используя функции и методы
SymPy. (например, diff (f,x,k))
f ( x) =
3
( cos ( x) )
x =
4
При вычислении значения производной с помощью метода evalf с
параметром subs получаем приближенное ( с точностью, указанной в
evalf) значение производной
2.
Используя метод subs(old, new) можно получить точное значениепроизводной
После округления получим приближенный результат
Если бы записали выражение для функции иначе, то значение
производной с точностью 26 значащих цифр получить бы не удалось:
3.
Численное дифференцирование применяется тогда, когда функциютрудно или невозможно продифференцировать аналитически.
Например, такая необходимость возникает, когда функция задана
таблицей, а также при решении дифференциальных уравнений.
Процесс численного дифференцирования основан на вычислении
производной через значения функции f(x) в нескольких точках,
расположенных на близком расстоянии друг от друга. По определению
производная первого порядка функции f в точке x:
f ( x + h) − f ( x )
h→0
h
f ( x ) = lim
При вычислении производной функции f(x) на компьютере
f ( x) =
f ( x + h) − f ( x )
+ О ( h)
h
(1)
O(h) - это ошибка вычисления производной
Основная проблема численного определения производной связана
с процедурой выбора значения h. На первый взгляд может
показаться, что следует выбирать очень малые h, чтобы
получить желаемую точность, однако это не совсем так.
4.
График погрешности разностной формулы (1) изображен ниже,причем
для его обеих осей выбран логарифмический
масштаб, а сама производная вычислялась в точках x=0 и
x=1. Δ =h
10
0.1
−3
eps
es
1 10
−5
1 10
−7
1 10
−9
1 10
1 10
− 11
− 20
1 10
1 10
− 16
− 12
1 10
1 10
−8
−4
1 10
1
5.
Если увеличение ошибки на правом конце графика являетсяочевидным, так как, согласно формуле (1), чем больше Δ , тем
больше погрешность, то рост ошибки при очень малых Δ , на первый
взгляд, кажется неожиданным. Дело в том, что, применяя разностную
формулу, мы неявно полагаем, что умеем точно вычислять
значения функции f(x) в любой точке. Но любые компьютерные
вычисления сопряжены с неустранимыми погрешностями, в
частности, обусловленными дискретным представлением чисел.
Поэтому в реальности мы можем вычислить значение f(x) лишь с
некоторой погрешностью δ, обусловленной (по крайней
мере)
заведомым округлением чисел при расчетах на компьютере.
При очень малом шаге разностные формулы означают вычитание
друг из друга близких чисел. В этом случае ошибки вычисления
функции f(x) становятся
доминирующими
и
приводят
к
существенному
росту
суммарной
погрешности вычисления
производной. Поэтому значение шага следует выбирать "не очень
малым", иначе ошибки вычисления f(x) неминуемо сделают
результат дифференцирования неправильным.
6.
Отметим, что в зависимости от точки, в которой ищется значениепроизводной, и от характера дифференцируемой функции диапазон
приемлемых значений Δ будет различным. Поэтому в каждом
конкретном случае требуется совершать дополнительные шаги,
тестирующие верность выбора шага для численного
дифференцирования.
Формула (1) называется правой разностной схемой для вычисления
первой производной, а выражение в числителе - правой разностью
или конечной разностью вперед. Аналогично, может быть, написана
левая разностная схема и определена левая разность.
Левая разность
Правая разность
f = f ( x) − f ( x − h)
f = f ( x + h) − f ( x)
7.
Разложим функцию f(x) в ряд Тейлора в точке x+hh2
h3
f ( x + h) = f ( x) + h f ( x) + f ( x) + f ( x) + ...
2
6
h
откуда следует
О (h) = − f ( x) + ...
2
Если разложить функцию f(x) в ряд Тейлора в точках x+h и x−h, а
затем вычесть один результата из другого, то
f ( x + h) − f ( x − h)
f ( x) =
+ О ( h2 )
2h
а погрешность вычисления первой производной:
2
h
О(h2 ) = − f ( x) + ...
6
Это центральная разностная схема. Соответствующая разность
называется центральной (или симметричной) конечной разностью
первого порядка:
f = f ( x + h) − f ( x − h )
8.
Можно пойти по пути повышения точности метода вычисления первойпроизводной и далее. Например, рассматривая разложение функции
f(x) в ряд Тейлора в точках x+h, x+2h, x−h и x−2h, можно получить
четырехточечную схему и т. д.
f ( x) =
f ( x − 2 h ) − 8 f ( x − h ) + 8 f ( x + h ) − f ( x + 2 h)
+ О ( h4 )
12h
Для вычисления производных высших порядков вводятся конечные
разности высших порядков
Левая разность 2-го порядка
2 f = ( f ) = f ( x) − 2 f ( x − h) + f ( x − 2h)
Правая разность 2-го порядка
2 f = ( f ) = f ( x + 2h) − 2 f ( x + h) + f ( x)
Центральная разность 2-го порядка
2 f = ( f ) = f ( x + 2h) − 2 f ( x) + f ( x − 2h)
9.
Можно найти численно производную (а также градиент функции)используя функцию numpy.gradient библиотеки NumPy
numpy.gradient(f, *varargs, axis=None, edge_order=1)
Возвращает градиент N-мерного массива. Градиент рассчитывается с
использованием центральных разностей во внутренних точках и
односторонних или центральных разностей на границах.
f N-мерный массив, содержащий выборки (значения ) функции.
varargs - список скаляров или массивов (т.е. список значений
аргументов). Необязательный параметр.
Расстояние между значениями f в соседних точках по умолчанию
равно единице. Расстояние можно указать с помощью:
1. одной скалярной величины при указании этого расстояния для всех
измерений ( например не 1, а 0.005)
2. N скаляров при указании постоянного расстояния между выборками
для каждого измерения. то есть dx, dy, dz, …
3. N массивов для указания значений аргумента по каждому измерению
f.
10.
Если задан параметр axis, то количество переменных функциидолжно равняться числу значений этого параметра. По умолчанию:
axis =1.
axis - этот параметр может отсутствовать, быть равен целому числу
или кортежу целых чисел. По умолчанию рассчитывается градиент для
всех осей входного массива. Можно градиент рассчитывать только
вдоль заданной оси или набора осей.
edge_order=1 Необязательный параметр, может быть равен 1 или 2.
По умолчанию равен 1. Определяет тип используемых разностей для
расчета в граничных точках. 1 – используются односторонние разности,
2 – центральные; при этом значения функции в недостающих точках
аппроксимируются для заданного шага dx.
Найдем численно производную функции y=x3 в точке x0=1 при
задании равномерной сетки значений переменной:
11.
Отметим, что точность вычисления производной в крайних точкахзаметно хуже, чем во внутренних точках промежутка. Так при х=0.8
производная равна 1.92, а получилось -2.17. Для внутренних точек
расхождения - 0.01.
Тот же результат получится, если расстояния между значениями
аргумента задать массивом:
В общем случае массив х3 может содержать и неравномерную сетку
значений
Результат при задании трех равноудаленных точек:
12.
Для двумерных массивов функция возвращает два массива,упорядоченные по осям. В первом массиве –градиент по столбцам.
Зададим значения функции z=x3 + y2 на двумерной сетке
вычислим градиент
13.
Значения функции z:Результат с указанием осей:
1.9=(1.729-1.539)/0.1 1.9=(2-1.81)/0.1
1.9=(2.331-2.141)/0.1
2=(1.939-1.539)/0.2
2=(2.21-1.81).0.2 2=(2.541-2.141)/0.2
2.1=(1. 939-1.729)/0.1 …..2.1=………………….2.1=………………….
Получили массив с частными производными по у
А второй массив - с частными производными по х, его элементы
получены при вычислении разностей по строкам матрицы z.
14.
Численно производную можно также найти с помощью функцииnumpy.diff
numpy.diff(a, n=1, axis=-1, prepend=<no value>, append=<no value>)
Функция вычисляет разность n-го порядка вдоль заданной оси (при
условии, что вдоль этой оси число заданных точек n +1)
Разность 1-го порядка определяется как out[i] = a[i+1] - a[i] вдоль
заданной оси.
а – входной массив
n- целое, необязательный параметр. Определяет порядок вычисляемой
разности. По умолчанию равен 1. Если равно нулю, возвращается
исходный массив.
axis: целое, необязательный параметр. Ось, по которой
вычисляется разность.
prepend, append - необязательные параметры, массиво подобный.
Значения, которые нужно добавить в начало или в конец перед
определением разности.
15.
Вычислим разности первого и второго порядков, задав одномерныймассив данных
Полученные значения разностей первого и второго порядка будут
относиться к различным точкам, в зависимости от того, как
трактовать эти разности (как левые или как правые).
f = f ( x + h) − f ( x)
f = f ( x) − f ( x − h)
f ( x) − 2 f ( x − h) + f ( x − 2h)
16.
Вычислим разности первого и второго порядков, задав двумерныймассив данных
17.
влияние параметров prepend, appenddy=np.diff(y)
dx= np.diff(x)
der=dy/dx
Функция scipy.misc.derivative библиотеки SciPy вычисляет
производную n-го порядка функции в точке, используя центральную
разностную схему.
scipy.misc.derivative(func, x0, dx=1.0, n=1, args=(), order=3)
func
- входная функция
x0 - точка, в которой вычисляется производная n-го порядка
dx - интервал между значениями переменной. Необязательный
параметр, по умолчанию — 1
n - Необязательный параметр. Порядок производной. По умолчанию 1
18.
order - целое нечетное число, необязательный параметр. Числоточек, используемых для вычисления производной, должно быть
больше порядка производной по крайней мере на единицу.
Эту функцию можно применить к массиву:
19.
Эту функцию можно применить к массиву:Производные 1 –ой и 2-ой функций равны: 4 x3+2x и 3x2+4x . Их
значения при х=1 должны быть равны 6 и 7. Почему же
получается, что ответ другой?
scipy.misc.derivative устарел; и будет полностью удален в SciPy v1.12.0.
Рекомендуется использовать findiff: https://github.com/maroba/findiff
или numdifftools: https://github.com/pbrod/numdifftools
20.
finddiff - Пакет Python для численных вычислений производных ирешения уравнений в частных производных. Позволяет:
-
Дифференцировать массивы любого количества измерений по
любой оси с любым желаемым порядком точности.
- Реализовать матричные представления произвольных
линейных дифференциальных операторов
- Решать уравнения в частных производных с граничными
условиями Дирихле или Неймана.
- Символическое представление конечно-разностных схем.
numdifftools
Библиотека предназначена для решения задач
автоматического численного дифференцирования по одной или
нескольким переменным. Имеется возможность пользователю
указать, будут ли использоваться комплексные, центральные,
прямые или обратные разности. Позволяет:
- вычислять производные порядка 1–10 для любой скалярной
функции
- вычислять производную по направлению функции n переменных
21.
- вычислять вектор градиента скалярной функции одной илинескольких переменных
- вычислять Якобиан векторной функции одной или нескольких
переменных.
- вычислять матрицу Гессе скалярной функции одной или
нескольких переменных
Математика