Как определить границу в python matplotlib? - PullRequest
0 голосов
/ 31 декабря 2018

Я хочу построить следующие уравнения поля:

  • dx / dt = x * (4 * y + 3 * x-3)
  • dy / dt = y *(4 * у + 3 * х-4)

но я не знаю, как я могу ограничить границу треугольником: x>=0, y>=0, x<=1-y:

enter image description here

# stream plot with matplotlib
import numpy as np
import matplotlib.pyplot as plt
def velocity_i(x,y):
    vx = x*(3*x+4*y-3)
    vy = y*(3*x+4*y-4)
    return vx, vy
n=100
x = np.linspace(0, 1, n)
y = np.linspace(0, 1, n)
X, Y = np.meshgrid(x, y)
Ux, Uy = velocity_i(X, Y)
vels = (Ux**2+Uy**2)**0.5
plt.figure(figsize=(5,4))
stream = plt.streamplot(X, Y,
              Ux,Uy,
              arrowsize=1,
              arrowstyle='->',
              color= vels,
              density=1,
              linewidth=1,
                       )
plt.xlabel(r"$\Omega_{\rm m}$",fontsize='14')
plt.ylabel(r"$\Omega_{\rm r}$",fontsize='14')
plt.colorbar(stream.lines)

plt.xlim((-.05,1.05))
plt.ylim((-.05,1.05))
plt.show()

1 Ответ

0 голосов
/ 31 декабря 2018

Это вполне достижимо при использовании маскирования NumPy и функции np.where .Я только показываю соответствующие две строки кода (выделенные комментарием), необходимые для выполнения работы.

Объяснение : X<=1-Y проверяет требуемое граничное условие и затем все этииндексам, где выполняется это условие True, присваивается фактическое вычисленное значение Ux (или Uy), а индексам, где условие False, присваивается 0. Здесь X<=1-Y действует как вид условногомаска.

Ux, Uy = velocity_i(X, Y)
Ux = np.where(X<=1-Y, Ux, 0) # <--- Boundary condition for Ux
Uy = np.where(X<=1-Y, Uy, 0) # <--- Boundary condition for Uy
vels = (Ux**2+Uy**2)**0.5

enter image description here

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