我遇到一个问题,两段几乎相同的代码给出了不同的结果,我不确定为什么。如果您能帮助我理解这背后的原因,我将不胜感激。
我有一个符号方程列表,每个方程定义为:
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])
将方程定义为: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 的答案,左侧显示右侧的答案。
这些应该不同的唯一原因是您是否替换浮点值。原因很可能就是 SymPy 处理参数的顺序。使用值字典评估符号表达式的最佳方法是
expr.evalf(subs=values)
,例如小事x.evalf(subs={x:1})->1.0
。这样做将不断提高精度,以(尝试)确保您获得有意义且准确的结果。
尝试的实验
将
nsimplify(v, rational=True)
应用于每个浮点数并比较两种方法。无论哪种方式,它们都应该给出相同的结果,因为有理计算比从浮点数获得的计算更精确(并且更慢)
在方法一中用 float 代替来计算 lhs,然后执行
(lhs - b).evalf(subs={b: bval})
看看是否得到与方法 tow 相同的结果,使用 expr.evalf(subs=dict_of_all_values)
需要能够清楚地证明问题的数据才能在此问题上取得进展:只需填写编辑后的 OP 的详细信息即可。