График скорости и расстояния от исчисления функций в Python - PullRequest
0 голосов
/ 26 декабря 2018

enter image description here

Есть ли какой-нибудь более понятный способ, которым я мог бы легче реализовать графическое представление следующих кусочных функций в задаче исчисления?В моем подходе я использовал matplotlib и просто объединил графики в два основных графика, чтобы показать разрыв.

import matplotlib.pyplot as plt

def v(time_range):
    velocity_val = []
    for i in time_range:
        if i < .2:
            velocity_val.append(20)
        elif i > .2:
            velocity_val.append(0)
    return velocity_val

def f(time_range):
    distance_val = []
    for i in time_range:
        if i <= .2:
            distance_val.append(20*i)
        if i >= .2:
            distance_val.append(4)
    return distance_val

def time_vals(time_range):
    decimal = 100
    time_val = []
    for i in time_range:
        num = i / decimal
        time_val.append(num)
    return time_val

#convert time into decimal
time_range_1 = range(1,20,1)
time_range_2 = range(21,40,1)
t_1 = time_vals(time_range_1)
t_2 = time_vals(time_range_2)

#get x, y for plot
v_1 = v(t_1)
v_2 = v(t_2)
f_1 = f(t_1)
f_2 = f(t_2)

#plot values into two graphs.
plt.subplot(2, 1, 1)
plt.plot(t_1, v_1)
plt.plot(t_2, v_2)
plt.title(' Problem 9')
plt.ylabel('Velocity')

plt.subplot(2, 1, 2)
plt.plot(t_1, f_1)
plt.plot(t_2, f_2)
plt.xlabel('time (t)')
plt.ylabel('Velocity');

Ответы [ 2 ]

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

Вы можете использовать np.where, чтобы назначить v(t) и f(t) в зависимости от ваших условий.Вам не нужно никаких петель.Векторизованные подходы делают ваш код очень аккуратным и коротким.В np.where вы сначала проверяете условие, а затем первое значение после условия присваивается индексам, в которых выполняется условие True, а второе значение присваивается индексам, в которых выполняется условие False.

Ниже приведен пример:

import numpy as np
import matplotlib.pyplot as plt

# Initialise time
t_1 = np.arange(1,20,1)/100
t_2 = np.arange(21,40,1)/100

# Compute v(t)
v_1 = np.where(t_1<0.2, 20, 0)
v_2 = np.where(t_2<0.2, 20, 0)

# Compute f(t)
f_1 = np.where(t_1<=0.2, 20*t_1, 4)
f_2 = np.where(t_2<=0.2, 20*t_2, 4)

# Plotting as you are doing

enter image description here

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

Вы можете использовать numpy для векторизации вашего кода

Может быть что-то вроде:

# Define time steps
t = np.linspace(0, 1, 100)
# Build v
v = np.empty_like(t)
v[.2 < t] = 20
v[.2 >= t] = 0
# Build f
f = np.empty_like(t)
f[t < 0.2] = 20 * t[t < 0.2]
f[t >= 0.2] = 4
# Plot
plt.plot(t, v)
plt.plot(t, d)

Другой способ построения v и f - использование np.piecewise:

v = np.piecewise(t, [.2 < t, .2 >= t], [20, 0])
f = np.piecewise(t, [t <= .2, t > .2], [lambda x: 20 * x, 4])

Я думаю, np.piecewise не очень читабелен, но определенно сохраняет некоторые строки кода

...