Как построить векторное поле с помощью Numpy? - PullRequest
0 голосов
/ 19 апреля 2019

Идея состоит в том, чтобы построить следующее векторное поле:

enter image description here

У меня есть две основные проблемы:

1)Я не знаю, как сделать так, чтобы стрелки были не слишком длинными (я знаю, что должен использовать length, но как?).

2) Мне сказали использовать Numpy, чтобы нарисоватьвекторное поле, но опять же, как?

Вот что я пробовал:

# The components of the vector field 
F_x = y*e**x
F_y = x**2 + e**x
F_z = z**2*e**z

# The grid
xf = np.linspace(-0.15, 2.25, 8)
yf = np.linspace(-0.15, 2.25, 8)
zf = np.linspace(-0.75, 2.50, 8)
X_grid, Y_grid, Z_grid = np.meshgrid(xf, yf, zf)

# The arrows; how to deal with them?
dx = 1
#dy = ...
#dz = ...

# Standardize the arrows; In this way all arrows have the same length.
length = np.sqrt(dx**2 + dy**2 + dz**2)
dx_N = dx/length
dy_N = dy/length
dz_N = dz/length

#how to involve numpy in the process??

# Drawing the figure
fig, ax = plt.subplots(1, 1)
ax.quiver(X_grid, Y_grid, Z_grid, dx_N, dy_N, dz_N, dy, dz, cmap=plt.get_cmap('gnuplot2'))
plt.show()

Спасибо

РЕДАКТИРОВАТЬ

На основепо предоставленной ссылке я попробовал:

from sympy import *
x,y,z = sp.symbols('x y z', real = True)
import matplotlib.pyplot as plt
x, y, z = np.meshgrid(np.arange(0, 2 * np.pi, .2), np.arange(0, 2 * np.pi, .2), np.arange(0, 2 * np.pi, .2))
F_x = y * exp(x)
F_y = x**2 + exp(x)
F_z = z**2 * exp(z)

# Normalize the arrows:
F_x = F_x / np.sqrt(F_x**2 + F_y**2 + F_z**2)
F_y = F_y / np.sqrt(F_x**2 + F_y**2 + F_z**2)
F_z = F_z / np.sqrt(F_x**2 + F_y**2 + F_z**2)

plt.figure()
plt.title('Vector field')
Q = plt.quiver(x, y, z, F_x, F_y, F_z, units='width')
qk = plt.quiverkey(Q, 0.9, 0.9, 2, r'$2 \frac{m}{s}$', labelpos='E',
                   coordinates='figure')#I don't understand this line

TypeError: Shape должен содержать только целые числа.

Проблема в том, что я не понимаю эту часть кода:

qk = plt.quiverkey(Q, 0.9, 0.9, 2, r'$2 \frac{m}{s}$', labelpos='E',
                       coordinates='figure')

Я все еще застрял на том, как построить это векторное поле

Ответы [ 2 ]

1 голос
/ 20 апреля 2019

Метод quiver() - отличный инструмент для визуализации векторных полей.Поскольку Matplotlib - это библиотека двумерных графиков, нам нужно импортировать набор инструментов mplot3d для создания трехмерного графика.

Вот хороший пример :

Зависимости:
Axes3D для 3D-рендеринга
Pyplot, чтобы получить MATLAB-подобный каркас построения графиков
Numpy для работы с числовыми массивами

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

x, y, z = np.meshgrid(np.arange(-0.8, 1, 0.25),
                      np.arange(-0.8, 1, 0.25),
                      np.arange(-0.8, 1, 0.8))

u = np.sin(np.pi * x) * np.cos(np.pi * y) * np.cos(np.pi * z)
v = -np.cos(np.pi * x) * np.sin(np.pi * y) * np.cos(np.pi * z)
w = (np.sqrt(2.0 / 3.0) * np.cos(np.pi * x) * np.cos(np.pi * y) * np.sin(np.pi * z))


fig = plt.figure()
ax = fig.gca(projection='3d')

ax.quiver(x, y, z, u, v, w,
          length=0.15,
          color='Purple'
          )


ax.view_init(elev=10, azim=30)
ax.dist=8

plt.show()

enter image description here

1 голос
/ 20 апреля 2019

Предположим, что вам нужен трехмерный колчан, вы можете проверить учебник matplotlib на quiver3D . А чтобы контролировать размер стрелки, посмотрите документацию Axes3d.quiver библиотеки , особенно параметры.

Быстрый фрагмент:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
x, y, z = np.meshgrid(np.arange(0, 2*np.pi, .5), np.arange(0, 2*np.pi, .5), np.arange(0, 2*np.pi, .5))

F_x = y * np.exp(x)
F_y = x**2 + np.exp(x)
F_z = z**2 * np.exp(z)

fig = plt.figure()
ax = fig.gca(projection='3d')

Q = ax.quiver(x, y, z, F_x, F_y, F_z, length=0.3, normalize=True)

Но 3D колчан может быть очень многолюдным! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...