2

次の式を前提として、時間tでの粒子の位置をプロットする必要があります。s(t) = -0.5*g(s)*t^2+v0*tここで、g(s) = G*M/(R+s(t))^2G、、MおよびRは定数でsあり、関数ではなく値ですs(t))。パーティクルは垂直に発射されているので、地面に着くまで1秒ごとに現在の位置を印刷したいと思います。しかし、定義する前に他の関数を使用せずに1つの関数を定義する方法を理解することはできません。これはこれまでの私のコードです:

G =  6.6742*10^(-11)
M = 5.9736*10^24
R = 6371000
s0 = 0
v0 = 300
t = 0
dt = 0.005

def g(s):
    def s(t):
        s(t) = -0.5*g(s)*t^2+v0*t
    g(s) = G*M/(R+s(t))^2


def v(t):
    v(t) = v(t-dt)-g(s(t-dt))*dt


while s(t) >= 0:
    s(t) = s(t-dt)+v(t)*dt
    t = t+dt

if t == int(t):
    print s(t)

関数を実行すると、関数呼び出しを割り当てることができないと表示されます。

4

2 に答える 2

6

s(t) = xエラーは、が関数であるために記述できないことを意味しs(t)、関数の割り当ては。で実行されdef ...ます。代わりに、値を返したいので、次のように書き直します。

def g(s):
    def s(t):
        return -0.5*g(s)*t^2+v0*t
    return G*M/(R+s(t))^2

ただし、これには他にも問題があります。計算の観点から、この計算は決して終了しません。Pythonは代数システムではなく、特定の値を解決することはできません。s(t)g(s)およびg(s)内で呼び出しようとするとs(t)、終了条件を定義しない限り、終了することはありません。それ以外の場合は、再帰スタックがいっぱいになってエラーがスローされるまで、相互に呼び出しを続けます。

s(t)また、内で定義g(s)したので、コードのさらに下で数回行うように、外部から呼び出すことはできません。

Pythonのいくつかの構文とセマンティックの詳細について混乱しているようです。正確に何をしたいのかを尋ねて、その数式を提供していただければ、より良い答えを作成する方が簡単かもしれません。

編集:

ある時点でのパーティクルの位置を決定するにはt、次のコードが必要になります(コードをPython構文に再フォーマットし、 andステートメント**の代わりに使用します)。^return

G = 6.6742*10**(-11)
M = 5.9736*10**24
R = 6371000
s0 = 0
v0 = 300
t = 0
dt = 0.005

sc = s0 # Current position of the particle, initially at s0

def g(s):
    return -G*M/(R+s)**2

def s(t):
    return 0.5*g(sc)*t**2 + v0*t + s0

count = 0
while s(t) >= 0:
    if count % 200 == 0:
        print(sc)
    sc = s(t)
    count += 1
    t = dt*count
于 2013-02-25T00:34:56.837 に答える
2

Python関数は相互に呼び出すことができますが、それは関数が値を返す方法ではありません。関数が特定の値を返すようにするにはreturn、たとえば、

def v(t):
   return v(t - dt) - g(s(t - dt)) * dt

さらに、私はあなたがこれで何をしようとしているのか本当に理解していませんが、おそらくあなたは自分自身を別の方法で表現する必要があるでしょう:

while s(t) >= 0:
    s(t) = s(t-dt)+v(t)*dt
    t = t+dt
于 2013-02-25T00:27:03.493 に答える