簡體   English   中英

Python公式-錯誤答案

[英]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

為此添加了github回購

固定半徑單位並在顯示中進行校正,如下所示:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM