Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
calc:vector [2021/03/10 12:08]
root
calc:vector [2022/08/10 23:55] (текущий)
root
Строка 1: Строка 1:
 <div slide> <div slide>
-====== Основные операции линейной алгебры в numpy ====== 
- 
-==== Операции над векторами ==== 
- 
-Положим что одномерные массивы ''a'' и ''b'' являются векторами в трехмерном пространстве: 
- 
-<sxh python> 
-import numpy as np 
- 
-a = np.array([1,1,1]) 
-b = np.array([2,-1,3]) 
-</sxh> 
- 
-^ Операция ^ Запись ^ Результат ^ 
-| Длина вектора | ''np.linalg.norm(a)'' | ''1.7320508075688772'' | 
-| Произведение вектора на скаляр | ''2*a'' | ''array([2, 2, 2])'' | 
-| Сумма векторов | ''a + b'' | ''array([3, 0, 4])'' | 
-| Скалярное произведение | ''np.dot(a,b)'' | ''4'' | 
-| Векторное произведение | ''np.cross(a,b)'' | ''array([ 4, -1, -3])'' | 
- 
-</div><div slide> 
- 
-==== Операции над матрицами ==== 
- 
-Положим, что ''a'' — вектор, а ''M'' — матрица в трехмерном пространстве. 
- 
-<sxh python> 
-import numpy as np 
- 
-a = np.array([1,1,1]) 
-M = np.array([[1,0,1],[2,1,-1],[-1,0,-3]]) 
-</sxh> 
- 
-^ Операция ^ Запись ^ Результат ^ 
-| Определитель | ''np.linalg.det(M)'' | ''-2.0'' | 
-| След | ''np.trace(M)'' | ''-1'' | 
-| Форма | ''M.shape'' | ''(3, 3)'' | 
-| Векторно-матричное умножение | ''np.matmul(a, M)'' |''array([ 2,  1, -3])'' | 
-| Матричное умножение | ''np.matmul(M,M)'' |''%%array([[ 0,  0, -2], [ 5,  1,  4], [ 2,  0,  8]])%%'' | 
-| Обратная матрица | ''np.linalg.inv(M)'' | ''%%array([[ 1.5,  0. ,  0.5], [-3.5,  1. , -1.5], [-0.5,  0. , -0.5]])%%'' | 
-| Собственные числа и собственные векторы | ''np.linalg.eig(M)'' | ''%%(array([ 1.        ,  0.73205081, -2.73205081]), array([[ 0.        ,  0.11727205, -0.2405126 ], [ 1.        , -0.99260257,  0.36940291], [ 0.        , -0.03142295,  0.89760524]]))%%'' | 
-| Транспонирование | ''M.T'' | ''%%array([[ 1,  2, -1], [ 0,  1,  0], [ 1, -1, -3]])%%'' | 
-| Нулевая матрица | ''%%np.zeros((3,3))%%'' | ''%%array([[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]])%%'' | 
-| Единичная матрица | ''np.eye(3)'' | ''%%array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])%%'' | 
- 
-</div><div slide> 
- 
-==== Вращение координат ==== 
- 
-Вращение координат удобно задавать в виде матрицы поворота с помощью модуля ''scipy.spatial.transform'' 
- 
-<sxh python> 
-from scipy.spatial.transform import Rotation 
- 
-#Вращение на 90 градусов вокруг оси X 
-MRot = Rotation.from_euler('x', [np.pi/2]).as_dcm() 
-#Для новых версий: 
-MRot = Rotation.from_euler('x', [np.pi/2]).as_matrix() 
- 
-a = np.array([1,1,1]) 
- 
-rot_a = np.squeeze(np.matmul(a, MRot)) 
- 
-</sxh> 
- 
-</div><div slide> 
- 
-==== Способы задания вращения ==== 
- 
-^ Способ задания ^ Описание ^ Пример ^ 
-| Углы Эйлера | Последовательность вращений вокруг осей координат | ''%%Rotation.from_euler('xy', [np.pi/2, -np.pi/6])%%'' | 
-| Матрица поворота | Матрица направляющих косинусов | ''%%Rotation.from_matrix([[0,0,0],[0,0,0],[0,0,1]])%%'' | 
-| Вращение вокруг вектора | Вращение вокруг вектора единичной длинны на данный угол | ''%%v = np.array([1, 0, 1]); Rotation.from_rotvec(np.pi/2 * v/np.linalg.norm(v))%%'' | 
-| Кватернион | Запись вращения в форме кватерниона (x, y, z, w) | ''%%Rotation.from_quat([0.        , 0.        , 0.70710678, 0.70710678])%%'' | 
- 
-Библиотека ''scipy.spatial.transform'' также позволяет преобразовывать одно представление вращения в другое методами ''to_euler'', ''to_matrix'', ''to_rotvec'', ''to_quat''. 
- 
-</div><div slide> 
  
 ===== Функция на сетке ===== ===== Функция на сетке =====
  
-Важная особенность ''np.array'' — возможность обходиться при вычислении значения функции без циклов.+Важная особенность ''np.array'' — возможность обходиться при вычислении значения функции **без циклов**.
  
 <sxh python> <sxh python>
Строка 92: Строка 14:
 p = np.linspace(5,9,3) p = np.linspace(5,9,3)
  
-v = f (s,p)+v = f (s,p) # Функция f была применена поэлементно 
 # v == array([  33.,   66.,  117.]) # v == array([  33.,   66.,  117.])
  
 S, P = np.meshgrid(s,p,indexing='ij') S, P = np.meshgrid(s,p,indexing='ij')
-v = f (S,P)+v = f (S,P) # Функция f была применена для каждой пары из s и p
 # array([[ 33.,  45.,  57.], # array([[ 33.,  45.,  57.],
 #       [ 54.,  66.,  78.], #       [ 54.,  66.,  78.],
Строка 127: Строка 49:
 Объект ''FinDiff'' реализует дифференциальный оператор, аргументы: ''0'' — по первой оси, ''dx'' — размер шага, ''1'' — первая производная.  Объект ''FinDiff'' реализует дифференциальный оператор, аргументы: ''0'' — по первой оси, ''dx'' — размер шага, ''1'' — первая производная. 
  
-''df_dx'' — массив ''np.array'' со значениями производной ''f'' в узлах сетки.+''df_dx'' — массив ''np.array'' со значениями производной ''f'' в узлах сетки. Модуль ''findiff'' не изменяет размер массива т.к. на краях применяется схема дифференциирование вперед или назад соответственно, а по остальному объему массива используется центральная схема.
  
 </div><div slide> </div><div slide>