2014-02-04 2 views
-4
import scipy as sp 
import numpy as np 
import pylab as pl 
import scipy.integrate as spi 
import matplotlib.pyplot as plt 


G=6.67*10**(-11) 
M=6.4*(10**23) 
R=3.4*(10**6) 
m=260 
#define the gravitational constant G, radius (R) and mass (M) of Mars and the mass of the satellite (m) 

#called with the variables to be differentiated 
def f(a,t): 
    xx=a[0] 
    vx=a[1] 
    yy=a[2] 
    vy=a[3] 
    ax=-(G*M*xx)/((xx**2+yy**2)**1.5) 
    ay=(-G*M*yy)/((xx**2+yy**2)**1.5) 
    return [vx,ax,vy,ay] 
#returns differentiated values, function defines values and returns new values 

d=((xx**2+yy*2)**(0.5)) 

if d<r: 
    vx,vy,ax,ay=0,0,0,0 
    return [vx,ax,vy,ay] 

#first initial conditions- blue curve 

t1=sp.linspace(0.,259200,10000) #three years 

initial1=[3*R,2000,3*R,500] 

solution1=spi.odient(f,initial1,t1) 

x1=solution1[:,0] 
y1=solution1[:,2] 

pl.figure(1) 
pl.plot(x1,y1) 
pl.xlabel("x") 
pl.ylabel("y") 
pl.show() 

Привет, пожалуйста, не могли бы вы помочь мне запустить этот код! Он написан на python и является достаточно простым, у меня есть ошибка со второй функцией возврата, она говорит «return» вне функции. Другая ошибка - «объект модуля» не имеет атрибута «odient».Код не работает (python)

+1

, потому что ... это не в функции? –

+0

неправильное форматирование, и вы обязательно вызываете возврат вне функции. –

+0

Я не обращаюсь к вашему вопросу. Я просто хочу указать, что более простой (менее вычислительный) способ выражения ваших констант - с научной нотацией, например, '' G = 6.67e-11'' и '' M = 6.4e23''. – Wolf

ответ

1
if d<r: 
    vx,vy,ax,ay=0,0,0,0 
    return [vx,ax,vy,ay] 

Это не функция, поэтому вы не можете использовать return. Если вы хотите добавить эти значения в список, вы можете создать новый список:

new_list = [vx,ax,vy,ay] 

Вам не нужно использовать возврат вне функции, потому что эти переменные уже в области. Когда вы используете переменные внутри функции, они не в той же области, что и остальная часть вашей программы. Например:

>>> def foo(): 
     a =10 
>>> a = 1 
>>> foo() 
>>> a 
1 

a внутри функции не влияет на a снаружи. В вашем заявлении if вам не нужен return, потому что он находится в том же объеме. Назначение переменных не нужно возвращать из любого места, потому что это та же область.

И как @Hugh Босуэлл отметил, у вас есть опечатка в вызове функции должны быть:

scipy.integrate.odeint() 
Смежные вопросы