Форум сайта python.su
Добрый вечер, прошу помочь с программой на Python
Цель: смоделировать траекторию движения спутника (на спутник ничто кроме Земли не влияет, сам спутник в виде материальной точки). По идее должен получиться круг.
Делаю с помощью библиотеки matplotlib, плюс vector - мой модуль, где прописаны сложение и умножение векторов и вектора на число. ПРога либо зацикливается , либо выводит прямую, то есть во втором варианте скорее всего неправильно написан ylist. А что именно – не доходит.. Насколько я понимаю, результат возвращаться должен в векторах. Заранее благодарю
#!/usr/bin/python
# -*- coding: utf-8 -*-
import math
import pylab
from matplotlib import mlab
from vector import vector
M_earth = 5.9736e-24
G = 6.67429e-11
R0 = vector( 0, 10000000.0 ) # радиус-вектор
V0 = vector( 10000.0, 0 ) #начальная скорость
def ar () : # ускорение
R = R0
V = V0
RR = ( G * M_earth / (R.abs*R.abs*1/R.abs)*R)
dt = 0.5
T = 60 # одна минута
for n in range(0,int(T//dt)) :
R1 = R + dt*V
V = V + dt*RR
R = R1
xmin = -100000.0
xmax = 100000.0
ymin = -100000.0
ymax = 100000.0
dx = 0.1
xlist = mlab.frange (xmin, xmax, dx)
ylist =
pylab.plot (xlist, ylist)
pylab.show()
модуль vector:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import math
class vector ( object ) :
def __init__( self, x, y ) :
self.__X = float(x)
self.__Y = float(y)
def __repr__ ( self ) :
return “( %f, %f )” % ( self.__X, self.__Y )
@property
def abs( self ) : # длина
return math.sqrt( self.__X * self.__X +
self.__Y * self.__Y )
def __add__( self, other ) : #сложение
return vector( self.__X + other.__X,
self.__Y + other.__Y )
def __mul__( self, number ) :
return vector( float(number)*self.__X,
float(number)*self.__Y )
def __rmul__( self, number ) :
return self * number
Офлайн
приложу еще в виде файлов
Прикреплённый файлы:
Sputnik.zip (1,1 KБ)
Офлайн
M_earth = 5.9736e-24 масса протона для сравнения 1.672621777e−27
те ваша земля очень легкая, размером со среднюю органическую молекулу. Может поэтому спутник к ней слабо притягивается?
Отредактировано doza_and (Июль 2, 2012 20:27:09)
Офлайн
doza_and, спасибо, и правда. Не должно быть там минуса.
Только дело все равно не в нем
Офлайн
leo_nideэто что ?RR = ( G * M_earth / (R.abs*R.abs*1/R.abs)*R)
leo_nideсформулируй решение задачи
Только дело все равно не в нем
Офлайн
py.user.nextага, это вектор ускорения свободного падения. G * M_earth / (R.abs*R.abs) - скаляр,( 1/R.abs)*R - единичный вектор, ибо далее идет работа с векторами. Ну, я предполагаю, что она должна идти с векторами.
это что ?
Офлайн
1) цикл у тебя не бесконечный, а на 2000001 значение
2) R1 = R + dt*V вот это на чём основано ?
инфа1. виды движений
инфа2. способы задания движения
leo_nideво-первых, скобки не тамага, это вектор ускорения свободного паденияRR = ( G * M_earth / (R.abs*R.abs*1/R.abs)*R)
g = G * M_earth / (R.abs * R.abs) an = g * (1 / R.abs) * R
g = G * M_earth / (R.abs * R.abs) an = g * (-1 * 1 / R.abs) * R
leo_nideдля этого надо сначала всё это вручную сделать на небольшом промежутке, а потом получить функцию, которая возвращает координаты каждой точки траектории в зависимости от передаваемого ей параметра t
Решение задачи - вывести на график траекторию (в декартовой ск), которую чертит спутник
Отредактировано py.user.next (Июль 4, 2012 01:47:35)
Офлайн