Python: странные пределы оси x с использованием matplotlib.pyplot - PullRequest
3 голосов
/ 12 июля 2020

(Python newb ie здесь) В качестве обучающего упражнения я пытаюсь решить и построить решение очень простого ODE: dy / dt = y с y (0) = 1. Я считаю, что мой код решить ODE правильно, но границы графика по оси x очень странные. Я сделал 50 равноудаленных значений x в диапазоне от 0 до 5, но похоже, что plt.plot() рисует только первые две точки, в результате чего график выглядит как линия, а не кривая y = e ^ x. Я пробовал поиграть с аргументами «scalex» и «scaley» plt.plot(), а также plt.xlim = (0,5) и их вариациями, но безрезультатно. Мой код ниже (я использую Python 3.7.6):

import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt

def f(t,y):
    return(y)

t0 = np.linspace(0,5,50)
y0 = np.array([1])

#solve_ivp(fun, t_span, y0, args = None)
out = solve_ivp(f, t0, y0)

t_vals = out.t
y_vals = out.y[0,:]

plt.plot(t_vals,y_vals)


Вот график, который я получаю:

Я попытался установить y = np.exp(t0), а затем построить график t0 vs y0, который отлично работает (т.е. со значениями x от 0 до 5). Поэтому я не уверен, почему мой исходный код не дает мне такой же тип графика. Возможно, моя попытка подмножества переменной out как-то неверна? ... Любая помощь приветствуется!

1 Ответ

1 голос
/ 12 июля 2020

Посмотрев на документацию для resolve_ivp , вы увидите, что t_span должен быть кортежем из двух чисел с плавающей запятой, и вы можете указать шаг с помощью max_step

Итак у вас может быть:

from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt

def f(t,y):
    return(y)

out = solve_ivp(f, (0, 5), [1], max_step=0.1)

t_vals = out.t
y_vals = out.y[0,:]

plt.plot(t_vals,y_vals)

Что дает ожидаемый график: введите описание изображения здесь

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