решить дифференциальное уравнение в Python с помощью Scipy - PullRequest
0 голосов
/ 06 ноября 2018

Здравствуйте, я хотел бы решить следующую первую ОДУ:

dt / dr = + - cos (t) ^ 2 / cos (r) ^ 2

Я знаю, что решение: t (r) = t (r) = arctan (tan (r) + _ C1), с: pi / 2

Я хотел бы знать, как я могу улучшить приведенный ниже код, чтобы мое решение напоминало кривую, которая стремится к + бесконечности по оси t на изображении:

desired solution for one C value

Мой код:

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

    """
    Equations to be solved: 


       boundary conditions: 

        -pi/2 << t << pi/2 
            0 <= r <= pi/2 


    Equation:

        dt/dr = +- cos^2(t)/cos^2(r)

    Solution : 

        t(r) = arctan(tan(r) +_C1)


"""
def dt_dr(t,r):

    return (cos(t)**2)/(cos(r)**2)

rs = np.linspace(0,pi/2,1000)
t0 = 0.0 #the initial condition 
ts = odeint(dt_dr,t0,rs)
ts = np.array(rs).flatten()

plt.rcParams.update({'font.size': 14}) 
plt.xlabel("r")
plt.ylabel("t")
plt.plot(rs,ts);

и мой текущий графический вывод:

current_solution

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Два графика в вопросе одинаковы, однако оба имеют разные пределы. Для изменения лимитов нужно сделать plt.xlim() и plt.ylim(). Установка их так же, как желаемый результат, даст вам тот же результат.

Существует одно добавление к желаемому результату в том, что ось y пересекает ось x в 0, а не левый край оси (по умолчанию). Вы можете изменить это, перемещая левый позвоночник:

rs = np.linspace(0, pi/2, 1000)
t0 = 0.0 #the initial condition
ts = odeint(dt_dr, t0, rs)

plt.rcParams.update({'font.size': 11})
plt.xlabel("t")
plt.ylabel("r")
plt.plot(ts, rs)

# Change axis limits
plt.ylim(0,0.6)
plt.xlim(-1.5,1.5)

# Move left spine to x=0
ax = plt.gca()
ax.spines['left'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['bottom'].set_position('zero')
ax.spines['top'].set_color('none')

plt.show()

Что дает:

enter image description here

0 голосов
/ 06 ноября 2018

Не уверен, что я понимаю вашу проблему, однако кажется, что решения на двух графиках одинаковы, но они построены по-разному. В графике «желаемое решение для одного значения C» ось Y растянута по сравнению с осью X. В вашем "current_solution" они равны.

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