Как использовать определенную математическую функцию для создания аргументов U, V в matplotlib.quiver () - PullRequest
0 голосов
/ 17 октября 2019

У меня есть очень базовая модель, управляющая падающим объектом:

# ODE modelling velocity of a falling object
def field(t, v):
    v_dot = 9.8 - (gamma / mass) * v
    return v_dot

Я решил и построил этот ODE для нескольких различных начальных условий. Я хотел бы наложить график с полем уклона, используя matplotlib.quiver ().

Мне сложно разобраться с аргументами U и V. Я понимаю, что это направления x и y, на которые должна указывать каждая стрелка.

Вот то, что я попробовал, тактика, которую я почерпнул из другого ответа:

x = np.linspace(0, 50, 6)
y = np.linspace(0, 150, 16)
X, Y = np.meshgrid(x, y)
f = 9.8 - (gamma / mass) * Y
U, V = np.gradient(f)
Q = plt.quiver(X, Y, U, V)

Однако,На этом графике показано следующее:

enter image description here

Что, безусловно, неправильно, не говоря уже о безобразии. Разумеется, моя главная проблема в том, что я не знаю, как правильно найти U и V. Я просмотрел несколько других вопросов, но большинство людей делают что-то гораздо более сложное, чем я, и я не могу уменьшить их ответы на мою более простую проблему.

# ODE modelling velocity of a falling object
def field(t, v):
    v_dot = 9.8 - (gamma / mass) * v
    return v_dot

# gamma is the coefficient for air resistance
gamma = 0.392
mass = 3.2

# declare interval and step size
t_0 = 0.
t_n = 100.
delta = 0.05
time = np.arange(t_0, t_n, delta)

fig, axs = plt.subplots(figsize=(10, 6))
fig.suptitle("A Simple Model: Falling Object")

axs.set_title(r"Solution to $\dot{v} = 9.8 - \frac{\gamma}{m}v$")
axs.set_ylabel('Velocity')
axs.set_xlabel('Time')

for x_0 in np.arange(0., 101., 20):
    # Solve for each initial condition x_0
    x = rk4(delta, time, field, x_0)

    # Plot results
    axs.plot(time, x, label=r"$v_0=$%.3f" % x_0)

1 Ответ

0 голосов
/ 27 октября 2019

Не думаю, что комментаторы поняли, что мне нужна помощь с базовым концептуальным характером вопроса. Я понимаю, что я медленный и глупый, и, к счастью, есть люди за пределами этого форума, которые лучше понимают это. Итак, здесь много комментариев на тот случай, если кому-то, кто так медлителен, как я, нужна помощь. Просто замените мой ODE на тот, который вы хотите смоделировать, и поиграйтесь с массивами осей x и y, чтобы получить желаемый интервал:

# ODE for falling object
def field(t, v):
    v_dot = 9.8 - (gamma / mass) * v
    return v_dot

# gamma is the coefficient for air resistance
gamma = 0.392
mass = 3.2

# x and y axis arrays 
x = np.linspace(0,50, 11) # time from zero to 50 inclusive
y = np.linspace(0,100, 11) # initial velocities from 0 to 100 inclusive

# meshgrid creates two arrays of shape(len(y), len(x))
# by pairing the values of these two arrays, we create a set
# of ordered pairs that give our coordinates for the location
# of the quiver arrows we wish to plot.
X, Y = np.meshgrid(x, y)

# We know slope is v' = f(t, v), so we can use trig to get
# to the x and y components of our quiver arrow vectors
theta = np.arctan(field(X, Y))
U = np.cos(theta)
V = np.sin(theta)

plt.quiver(X, Y, U, V)

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