Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 21, 2014 10:37:20

Olmer
От: Moscow
Зарегистрирован: 2012-11-05
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Решение ОДУ с scipy.inegrate.odeint.

fongostev
Да! Я про эту ссылку говорил. Вот мой вариант кода
from matplotlib import pyplot as plt
import numpy as np
from scipy.integrate import odeint
G=6.67*10**-8
M=2*10**33.
def motion(x_vec, t):
    x, y = x_vec  # tuple unpacking
    
    return [y, G*M/y**2.]
y0 = [10**13., 10**13.]
t_output = np.arange(0, 10**7, 10**3)
y_result = odeint(motion, y0, t_output)
plt.plot(y_result[:,0],y_result[:,1])
plt.show()
Я не понимаю, что происходит в теле функции, перед return.

Офлайн

#2 Апрель 21, 2014 10:38:42

fongostev
От: Moskau
Зарегистрирован: 2012-04-03
Сообщения: 62
Репутация: +  4  -
Профиль   Отправить e-mail  

Решение ОДУ с scipy.inegrate.odeint.

Olmer
Там идет распаковка набора аргументов. Грубо говоря, там происходит следующее:
a, b, c = (a, b, c)

UPD: Т.е. принимается левая часть уравнений, а возвращается правая.

Отредактировано fongostev (Апрель 21, 2014 10:40:22)

Офлайн

#3 Апрель 21, 2014 10:47:11

Olmer
От: Moscow
Зарегистрирован: 2012-11-05
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Решение ОДУ с scipy.inegrate.odeint.

fongostev
x, y = x_vec
Вот здесь? “x, y = x_vec ” Немного не догоняю…

Офлайн

#4 Апрель 21, 2014 10:48:28

fongostev
От: Moskau
Зарегистрирован: 2012-04-03
Сообщения: 62
Репутация: +  4  -
Профиль   Отправить e-mail  

Решение ОДУ с scipy.inegrate.odeint.

Olmer
Да, именно. Просто в интерпретаторе введи
t = (1,2)
a, b = t
И посмотри, что получится.

Офлайн

#5 Апрель 21, 2014 10:53:06

Olmer
От: Moscow
Зарегистрирован: 2012-11-05
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Решение ОДУ с scipy.inegrate.odeint.

fongostev
Но x_vec, что такое? Что это за вектор?

Офлайн

#6 Апрель 21, 2014 10:54:25

fongostev
От: Moskau
Зарегистрирован: 2012-04-03
Сообщения: 62
Репутация: +  4  -
Профиль   Отправить e-mail  

Решение ОДУ с scipy.inegrate.odeint.

Olmer
это твой набор независимых переменных, в твоем случае х и х с точкой.

Офлайн

#7 Апрель 21, 2014 10:57:22

Olmer
От: Moscow
Зарегистрирован: 2012-11-05
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Решение ОДУ с scipy.inegrate.odeint.

fongostev
А ты можешь записать, как будет выглядеть тело функции, или у меня правильно написано?

Офлайн

#8 Апрель 21, 2014 11:02:16

fongostev
От: Moskau
Зарегистрирован: 2012-04-03
Сообщения: 62
Репутация: +  4  -
Профиль   Отправить e-mail  

Решение ОДУ с scipy.inegrate.odeint.

Ты просто неаккуратно расписал систему. Замени строку и попробуй. Должно быть так:

return [y,  G*M/x**2]
Знаки только проверь

Отредактировано fongostev (Апрель 21, 2014 11:03:08)

Офлайн

#9 Апрель 21, 2014 11:08:26

Olmer
От: Moscow
Зарегистрирован: 2012-11-05
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Решение ОДУ с scipy.inegrate.odeint.

fongostev
Ты просто неаккуратно расписал систему. Замени строку и попробуй. Должно быть так:
Он рисует, что-то похожее. Но если поменять знак на минут перед G*M, то получается страшное решение.

Офлайн

#10 Апрель 21, 2014 11:09:34

fongostev
От: Moskau
Зарегистрирован: 2012-04-03
Сообщения: 62
Репутация: +  4  -
Профиль   Отправить e-mail  

Решение ОДУ с scipy.inegrate.odeint.

Ясное дело, ты же меняешь вектор действия потенциала на противоположный

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version