为什么两个相似的代码片段对符号方程产生不同的结果?

问题描述 投票:0回答:1

我遇到一个问题,两段几乎相同的代码给出了不同的结果,我不确定为什么。如果您能帮助我理解这背后的原因,我将不胜感激。

我有一个符号方程列表,每个方程定义为:

a1 * x1 + a2 * x2 + ... + a30 * x30 = b

我有正确的 𝑥 值,这些方程的答案保存在 values_of_equation 中。为了测试方程是否正确求解,我进行了两个测试:

测试1:将正确的值代入方程,然后用常数值减去结果𝑏:

   for i in range(len(List_of_symbolic_equation)):
       eq = List_of_symbolic_equation[i].subs(values_of_eqaution)
       equations_.append(eq) 
   for i in range(len(equations_)):
       print(equations_[i]-List_of_Constant_values[i])
  1. 将方程定义为:a1 * x1 + a2 * x2 + ... + a30 * x30 - b = 0,然后将值代入方程:

    for i in range(len(List_of_symbolic_equation)):
        eq = List_of_symbolic_equation[i].subs(values_of_eqaution)
        equations_.append(eq)
    
    
    for i in range(len(equations_)):
        print(equations_[i]-List_of_Constant_values[i])
    

预计这两种方法会产生相同的结果,因为它们本质上是相同的代码,但结果不同。一种方法正确地得到零,而另一种则不然。在下图中,右侧显示代码 2 的答案,左侧显示右侧的答案。

enter image description here

python math sympy symlink equation-solving
1个回答
0
投票

这些应该不同的唯一原因是您是否替换浮点值。原因很可能就是 SymPy 处理参数的顺序。使用值字典评估符号表达式的最佳方法是

expr.evalf(subs=values)
,例如小事
x.evalf(subs={x:1})->1.0
。这样做将不断提高精度,以(尝试)确保您获得有意义且准确的结果。

尝试的实验

  1. nsimplify(v, rational=True)
    应用于每个浮点数并比较两种方法。无论哪种方式,它们都应该给出相同的结果,因为有理计算比从浮点数获得的计算更精确(并且更慢)

  2. 在方法一中用 float 代替来计算 lhs,然后执行

    (lhs - b).evalf(subs={b: bval})
    看看是否得到与方法 tow 相同的结果,使用
    expr.evalf(subs=dict_of_all_values)

需要能够清楚地证明问题的数据才能在此问题上取得进展:只需填写编辑后的 OP 的详细信息即可。

© www.soinside.com 2019 - 2024. All rights reserved.