2016-04-28 18 views
1

モデルロケットの高度を計算するために書いたコードは次のとおりです。 49行目で、数学的なドメインエラーメッセージが表示されています。ここでは、エラーメッセージへのリンクです:あなたはlog操作をライン49上数学領域エラーの原因は何ですか?

1

from math import * 

motor_type = raw_input("What is the motor letter") 

b4 = { "th" : 13.2, "i" : 5.00, "ti" : 0.8} 
b6 = { "th" : 12.1, "i" : 5.00, "ti" : 0.8} 
c = { "th" : 15.3, "i" : 10.00, "ti" : 1.6} 
d = { "th" : 32.9, "i" : 20.00, "ti" : 1.6} 
e = { "th" : 25.0, "i" : 30.00, "ti" : 2.8} 

    ####################################################### 
a1 = b4["th"] 
a2 = b4["i"] 
a3 = b4["ti"] 

b1 = b6["th"] 
b2 = b6["i"] 
b3 = b6["ti"] 

c1 = c["th"] 
c2 = c["i"] 
c3 = c["ti"] 

d1 = d["th"] 
d2 = d["i"] 
d3 = d["ti"] 

e1 = e["th"] 
e2 = e["i"] 
e3 = e["ti"] 

    ####################################################### 
def get_altitude(th, i, ti): 
    Cd = float(.075)#drag coefficient = 0.75 for average rocket 
    rho = float(1.22)#air density = 1.22 kg/m3 
    g = float(9.81)#acceleration of gravity = 9.81 m/s2 
    v = float(0.0)#burnout velocity in m/s 
    y1 = float(0.0)#altitude at burnout 
    yc = float(0.0)#coasting distance 
    ta = float(0.0)#coasting time => delay time for motor 
    m = float(raw_input("What is the mass in Kg of the rocket with the motor loaded ")) #rocket mass in kg 
    a = pi * (((float(int(raw_input("What is the diameter of the rocket body in cm"))))/200)**2) #rocket cross-sectional area in m2 
    ####################################################### 
    k = rho*Cd*a*0.5 
    q = (th - m * g)/k 
    x = ((2*k*q)/ m) 
    v = q * ((1 - exp(-x * ti))/(1 + exp(-x * ti))) 
    yc = (m/(2*k)) * log((m*g+k * (v**2))/(m*g)) 
    y1 = (-m/(2*k))*log((th - m * g - k * (v**2))/(th - (m * g))) 
    qa = sqrt(m*g/k) 
    qb = sqrt(g*k/m) 
    ta = atan(v/qa)/qb 
    altitude = y1 + yc 
    print "Time from burnout to apogee" 
    print ta 
    print "Max altitude" 
    print altitude 

if motor_type == "b4": 
    get_altitude(a1, a2, a3) 
elif motor_type == "b6": 
    get_altitude(b1, b2, b3) 
elif motor_type == "c": 
    get_altitude(c1, c2, c3) 
elif motor_type == "d": 
    get_altitude(d1, d2, d3) 
elif motor_type == "e": 
    get_altitude(e1, e2, e3) 

答えて

2

行っているが、logのみだから、0より大きい数字に定義されている、あなたは数学のドメインを取得しますエラー。値を確認してください。意図的に、このエラーの原因の一例として、ランダム

....

のそれぞれの値は、Iは単位cm kgであり、直径は質量のために0.0005を入力し、1モータのための「B4」を入力しましょうlogの式は-3.6 * 10^6で、これのログは定義されていません。

また、あなたの変数に対してfloat(0.0)を実行するだけで、コードをグロス表示することに気づいたことはありません。0.0は既に浮動小数点数です。同様に、他のフロートについては。

+0

ありがとうございます。チェック値を言うとき、値が0より大きいかどうかチェックすることを意味しますか? –

+0

そうでなければ、0より大きい値に対してのみログが定義されるため、数学的なドメインエラーが発生します – Pythonista

+0

そのチェックのコードは何ですか? –

関連する問題