[英]Python Equation - Wrong Answer
我對此方程式感到麻煩。
from __future__ import division
import math
pi = 3.14159265
g = 6.67428*(10**-11)
user_circum = raw_input("Circumference (km) of planet? ")
user_acc = raw_input("Acceleration due to gravity (m/s^2)?")
def display_results(radius , mass , velocity):
print "Radius of the planet" , radius ,"km"
print "Mass of the planet" , float(mass/10**15) ,"(10^21 kg)"
print "Escape velocity of the planet" , velocity/1000 , "(km/s)"
def escape_velocity(circumference , acceleration):
circumference = float(circumference)
acceleration = float(acceleration)
radius = circumference/(2*pi)
mass = (acceleration * radius ** 2)/g
vEscape = ((2*g*mass)/radius) ** 0.5
display_results(radius , mass , vEscape)
escape_velocity(user_circum, user_acc)
使用38000和9.8的用戶輸入:
Circumference (km) of planet? 38000
Acceleration due to gravity (m/s^2)? 9.8
我應該得到這個答案:
Calculating the escape velocity...
Planet radius = 6047.9 km
Planet mass = 5370.7 x 10^21 kg
Escape velocity = 10.9 km/s
但是我得到了逃逸速度的答案。 前兩個是正確的。
Escape velocity of the planet 0.344294353352 (km/s)
這是逃逸速度的公式√2gm/ r知道如何解決這個問題嗎? 非常感謝。 如何將答案四舍五入到小數點后一位? 謝謝。
我認為您正在混淆單位。 用戶以公里為單位輸入周長,但您使用的重力常數以米為單位。 如果我改為以米為單位輸入周長,則逃逸速度會給出您期望的結果:
Circumference (km) of planet? 38000000
Acceleration due to gravity (m/s^2)?9.8
Radius of the planet 6047887.8444 km
Mass of the planet 5370677950.42 (10^21 kg)
Escape velocity of the planet 10.8875434213 (km/s)
當然,前兩個結果已經不好了。 因此,或者將引力常數調整為以千米為單位,或者更好的是,始終使用米。 為方便起見,您始終可以要求用戶輸入以千米為單位的周長,並將其自己轉換為米。
如果您有一個圖書館可以為您管理單位,聽起來您的生活會變得更加輕松。 這樣的事情會給你一個領先的機會:
from collections import Counter
class UnitsThing(object):
UNITS = ["kg", "km", "m", "s"]
def __init__(self, measure, units):
self.measure = measure
if type(units) is str:
if "/" not in units:
over, under = units, ""
else:
over, under = units.split("/")
o, u = self.unitize(over), self.unitize(under)
o.subtract(u)
self.units = o
else:
self.units = units
p = self.units.get("km")
if p:
self.units["m"] += p
self.units["km"] = 0
self.measure *= 1000.0 ** p
def __mul__(self, x):
if type(x) is UnitsThing:
new_units = self.units.copy()
new_units.update(x.units)
return UnitsThing(self.measure * x.measure, new_units)
else:
return UnitsThing(self.measure * x, self.units.copy())
def __div__(self, x):
if type(x) is UnitsThing:
new_units = self.units.copy()
new_units.subtract(x.units)
return UnitsThing(self.measure / x.measure, new_units)
else:
print self.measure
return UnitsThing(self.measure / x, self.units.copy())
def __plus__(self, x):
assert type(x) is UnitsThing
assert x.units == self.units
return UnitsThing(self.measure + x, self.units)
def __sub__(self, x):
assert type(x) is UnitsThing
assert x.units == self.units
return UnitsThing(self.measure - x, self.units)
def unitize(self, units):
c = Counter()
for u in self.UNITS:
while u in units:
c[u] += 1
i = units.index(u)
units = units[:i] + units[i + len(u):]
return c
def unit_format(self, c):
return "".join("{0}^{1}".format(k, v) for k, v in c.items() if v)
def __str__(self):
u = self.unit_format(self.units)
return "{0} {1}".format(self.measure, u)
def sqrt(self):
return UnitsThing(self.measure ** 0.5, self.units)
然后,您可以編寫如下代碼:
from math import pi
g = UnitsThing(6.67428e-11, "mmm/kgss")
user_circum = UnitsThing(40075, "km")
user_acc = UnitsThing(9.81, "m/ss")
radius = user_circum / (2 * pi)
mass = (user_acc * (radius * radius))/g
vEscape = ((g * mass * 2.0) / radius).sqrt()
您會得到如下結果:
>>> print vEscape
11186.5542433 m^2s^-2
固定半徑單位並在顯示中進行校正,如下所示:
from __future__ import print_function
from __future__ import division
from math import pi
G = 6.67428*(10**-11)
user_circum = raw_input("Circumference (km) of planet? ")
user_acc = raw_input("Acceleration due to gravity (m/s^2)?")
def display_results(radius, mass, velocity):
print("Radius of the planet {:.1f}km".format(radius/1000))
print("Mass of the planet {:.1f}(10^21 kg)".format(mass/10**21))
print("Escape velocity of the planet {:.1f}(km.s)".format(velocity/1000))
def escape_velocity(circumference, acceleration):
circumference = float(circumference)
acceleration = float(acceleration)
radius = circumference*1000/(2*pi)
mass = (acceleration * radius ** 2)/G
vEscape = ((2*G*mass)/radius) ** 0.5
display_results(radius, mass, vEscape)
escape_velocity(user_circum, use_acc)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.