python中的物理方程

python中的物理方程,python,equation,Python,Equation,我想制作一个程序,可以在用户输入不同参数的情况下计算物理方程:我知道它很简单,比如: v=5 t=7 s=v*t print(s) 它唯一的计算方法是s=v*t;然而,当我想要vif的方程时,请告诉我一个错误。硬编码v=s/t为我提供了正确的结果: s=5 t=7 v=s/t print(v) 我想要一个方程,可以解决不同的用户输入;也就是说,如果用户输入v和t,方程将返回s=v*t,如果用户输入s和t,方程将返回v=s/v,您可以使用关键字参数: def solve_equation(v=

我想制作一个程序,可以在用户输入不同参数的情况下计算物理方程:我知道它很简单,比如:

v=5
t=7
s=v*t
print(s)
它唯一的计算方法是s=v*t;然而,当我想要
v
if的方程时,请告诉我一个错误。硬编码
v=s/t
为我提供了正确的结果:

s=5
t=7
v=s/t
print(v)

我想要一个方程,可以解决不同的用户输入;也就是说,如果用户输入
v
t
,方程将返回
s=v*t
,如果用户输入
s
t
,方程将返回
v=s/v
,您可以使用关键字参数:

def solve_equation(v=None, t=None, s=None):
    if v is not None and t is not None:
        return v * t   # s case
    elif s is not None and t:  # t not None and not 0            
        return s / t   # v case
    else:
        raise ValueError   #"t should be defined or not zero"


print(solve_equation(v=10, t=2))
print(solve_equation(s=2, t=7))
输出:
请注意,如果您使用的是python 2,则必须传递浮点。

您可以使用关键字参数:

def solve_equation(v=None, t=None, s=None):
    if v is not None and t is not None:
        return v * t   # s case
    elif s is not None and t:  # t not None and not 0            
        return s / t   # v case
    else:
        raise ValueError   #"t should be defined or not zero"


print(solve_equation(v=10, t=2))
print(solve_equation(s=2, t=7))
输出:
请注意,如果您使用的是python 2,则必须传递浮点。

我不确定这是否是您想要的,但您可以定义三个单独的函数,每个变量一个。比如说,

def s(v, t):
    return v*t

def v(s, t):
    return s/t

def t(s, v):
    return s/v

我不确定这是否是您想要的,但是您可以定义三个单独的函数,每个变量一个。比如说,

def s(v, t):
    return v*t

def v(s, t):
    return s/t

def t(s, v):
    return s/v

假设你谈论的是零加速度“svt”方程(如果你有更复杂的需求,甚至是恒定加速度“suvat”方程),那么简单的问题就是检测未知的内容,然后填补空白

以下代码提供了一个函数,该函数将与一些测试代码一起执行此操作,以便您可以看到它的实际操作:

# Returns a 3-tuple containing [displacement(s), velocity(v), time(t)],
#    based on the existence of at least two of those.
# If all three are given, the displacement is adjusted so that the
#    equation 's = vt' is correct.

def fillInSvt(s = None, v = None, t = None):
    # Count the unknowns, two or more means no unique solution.

    noneCount = sum(x is None for x in [s, v, t])
    if noneCount > 1: return [None, None, None]

    # Solve for single unknown (or adjust s if none).

    if noneCount == 0 or s is None: return [v*t, v, t]
    if v is None: return [s, s/t, t]
    return [s, v, s/v]

# Test code.

print(fillInSvt(99,4,6))         # Show case that adjusts s.

print(fillInSvt(None,4,6))       # Show cases that fill in unknown.
print(fillInSvt(24,None,6))
print(fillInSvt(24,4,None))

print(fillInSvt(24,None,None))   # Show "not enough info" cases.
print(fillInSvt(None,4,None))
print(fillInSvt(None,None,6))
print(fillInSvt(None,None,None))
输出显示,在存在唯一解决方案的所有情况下,都会填充元组:

[24, 4, 6]
[24, 4, 6]
[24, 4.0, 6]
[24, 4, 6.0]
[None, None, None]
[None, None, None]
[None, None, None]
[None, None, None]

假设你谈论的是零加速度“svt”方程(如果你有更复杂的需求,甚至是恒定加速度“suvat”方程),那么简单的问题就是检测未知的内容,然后填补空白

以下代码提供了一个函数,该函数将与一些测试代码一起执行此操作,以便您可以看到它的实际操作:

# Returns a 3-tuple containing [displacement(s), velocity(v), time(t)],
#    based on the existence of at least two of those.
# If all three are given, the displacement is adjusted so that the
#    equation 's = vt' is correct.

def fillInSvt(s = None, v = None, t = None):
    # Count the unknowns, two or more means no unique solution.

    noneCount = sum(x is None for x in [s, v, t])
    if noneCount > 1: return [None, None, None]

    # Solve for single unknown (or adjust s if none).

    if noneCount == 0 or s is None: return [v*t, v, t]
    if v is None: return [s, s/t, t]
    return [s, v, s/v]

# Test code.

print(fillInSvt(99,4,6))         # Show case that adjusts s.

print(fillInSvt(None,4,6))       # Show cases that fill in unknown.
print(fillInSvt(24,None,6))
print(fillInSvt(24,4,None))

print(fillInSvt(24,None,None))   # Show "not enough info" cases.
print(fillInSvt(None,4,None))
print(fillInSvt(None,None,6))
print(fillInSvt(None,None,None))
输出显示,在存在唯一解决方案的所有情况下,都会填充元组:

[24, 4, 6]
[24, 4, 6]
[24, 4.0, 6]
[24, 4, 6.0]
[None, None, None]
[None, None, None]
[None, None, None]
[None, None, None]

你能更具体一点你想做什么吗。如果您提到所需的输出和相同的输入,那就太好了。您得到的错误消息是什么?另外,你还需要确保你的变量是浮点数,所以你基本上需要用一个方程来求解三个变量中的任何一个,给定另外两个变量。这(通常)不起作用,在Python中肯定不行。Mathematica等使用(或接受/解释)更多符号输入和方程的工具/语言可能能够做到这一点,但Python等编程语言无法做到。我想要一个可以通过用户输入求解的方程。这意味着如果用户输入v和t的数量,方程将是s=v*t,如果用户输入s和t的数量,方程将是v=s/vc,您可以更具体地说明您正在尝试做什么吗。如果您提到所需的输出和相同的输入,那就太好了。您得到的错误消息是什么?另外,你还需要确保你的变量是浮点数,所以你基本上需要用一个方程来求解三个变量中的任何一个,给定另外两个变量。这(通常)不起作用,在Python中肯定不行。Mathematica等使用(或接受/解释)更多符号输入和方程的工具/语言可能能够做到这一点,但Python等编程语言无法做到。我想要一个可以通过用户输入求解的方程。这意味着如果用户输入v和t的数量,方程将是s=v*t,如果用户输入s和t的数量,方程将是v=s/vgot it bro,但我正在寻找一个简单的解决方案。但我认为python不能简单地做到这一点,我必须进行大量硬编码。无论如何,谢谢。@JohnnyDoe,不,Python没有内置的“SolveSuvat”函数。这就是为什么你必须为它编写一个小函数,然后你的代码就有了这样一个野兽:-)明白了,兄弟,但我正在寻找一个简单的解决方案。但我认为python不能简单地做到这一点,我必须进行大量硬编码。无论如何,谢谢。@JohnnyDoe,不,Python没有内置的“SolveSuvat”函数。这就是为什么您必须为它编写一个小函数,之后您的代码确实有这样一个野兽:-)如果“floats必须传递”注释,您可以将其烘焙到函数中,如果您只是将计算更改为类似于
return 1.0*s/t
。无需坚持用户对此负责。感谢您的评论,@paxdiablo,OP很可能使用python 3,这就是为什么我将其作为备注保留的原因。对于“floats必须传递”注释,如果您只需将计算更改为类似于
return 1.0*s/t
,您可以将其烘焙到函数中。无需坚持用户对此负责。谢谢您的评论,@paxdiablo,OP很可能使用python 3,这就是我留下评论的原因。