Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
定义和求解无冗余方程(Python)_Python_Math_Physics_Equation_Solver - Fatal编程技术网

定义和求解无冗余方程(Python)

定义和求解无冗余方程(Python),python,math,physics,equation,solver,Python,Math,Physics,Equation,Solver,建立物理方程的标准方法似乎是以下方法: 取你的等式,在stackoverflow帖子中,它是s=v*t,或者写多个函数,如下所示: def s(v, t): return v*t def v(s, t): return s/t def t(s, v): return s/v 或者你在一个大的分支方程中也做同样的事情 def solve_svt_equation(v=None, t=None, s=None): if v is not None and t i

建立物理方程的标准方法似乎是以下方法: 取你的等式,在stackoverflow帖子中,它是
s=v*t
,或者写多个函数,如下所示:

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

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

def t(s, v):
    return s/v
或者你在一个大的分支方程中也做同样的事情

def solve_svt_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
    elif s is not None and v: # v not None and not 0
        return s / v

print(solve_svt_equation(v=10, t=2))
print(solve_svt_equation(s=2, t=7))
如果只有一个物理方程,程序员将不得不实现,这将是一个可行的方法,没有更多的担心。然而,如果您需要实现许多等式,这种方法很容易出错,并且很快就会变得混乱

对于我即将进行的编码项目,大约有50个这样的方程。我想我正处于许多程序员已经处于的一种常见情况

由于
v*t-s=0
完全定义了方程,因此可能存在一种解决方案,程序员只需编写一次方程。它可以看起来像是这个虚构的想法(或其他任何东西):


因此,我的问题是,Python库中是否有这样的解决方案,是否有一个干净可行的标准方法,还是我必须自己想出一个解决方案?

Python生态系统中有许多库来处理这些问题

一是

代码可能如下所示:

导入sympy
def解算svt方程(v=None,t=None,s=None):
速度、空间、时间=符号(“v s t”)
expr=速度*时间-空间
如果v:
expr=expr.subs(速度,v)
如果t:
expr=expr.subs(时间,t)
如果是:
expr=expr.subs(空格,s)
返回sympy.solve(expr)
打印(解方程(v=10,t=2))#[20]
打印(求解方程(s=2,t=7))#[2/7],sympy默认为有理数
打印(求解方程(s=2,t=7,v=1))#[],无解
print(求解方程(s=2))#[{t:2/v}],t的符号解
一个可能更容易概括的替代方案是:

def求解svt方程(v=None,t=None,s=None):
速度、空间、时间=符号(“v s t”)
expr=速度*时间-空间
VAL={速度:v,空间:s,时间:t}
对于符号,vals.items()中的val:
如果val:
expr=expr.subs(符号,val)
返回sympy.solve(expr)
如果要从字符串生成表达式,可以使用

svt_expr=sympy.parsing.sympy_parser.parse_expr(“v*t-s”)
svt_expr=svt_expr.subs(“s”,12)
svt_expr=svt_expr.subs(“v”,6)
打印(sympy.solve(svt_expr,“t”)#[2]
另一个伟大的库是,它是一个SMT解算器,而不是一个符号操作库,但可以轻松解决这些简单的问题。如果你有符号方程,我会建议你使用sympy,只是把它作为一种选择

导入z3
v、 s,t=z3.Reals(“VST”)
方程=v*t==s
z3.solve([方程,s==12,v==6])#打印[v=6,s=12,t=2]
Equation svt = Equation("v*t - s")
svt['s'] = 12
svt['v'] = 6
print(svt.get('t'))