在Python中测试数学表达式的等效性
||
我在Python中有两个字符串,
A m * B s / (A m + C m)
和
C m * B s / (C m + A m)
它们都是无序集合(A,C)和无序集合(B)的等效函数。 m和s表示可以在同一单元之间互换但不能与另一单元互换的单元。
到目前为止,我正在对A,B和C进行排列,并使用eval和SymPy的==运算符对其进行测试。这有多个缺点:
对于更复杂的表达式,我必须生成大量排列(在我的情况下为嵌套8个循环)
我需要将A,B,C定义为符号,当我不知道我将拥有哪些参数时,这并不是最佳选择(因此,我必须生成所有参数->非常低效并弄乱了我的变量名称空间)
是否有Python方法来测试这种等效性?它应该工作任意表达式。
没有找到相关结果
已邀请:
5 个回复
森含械
正如您所指出的那样,这将检查置换下的字符串等效性,而无需考虑数学等效性,但这只是成功的一半。如果您有数学表达式的规范形式,则可以对两个规范形式的表达式使用此方法。也许sympy的Simplify之一可以解决问题。
豆兢
我们正在寻找可以使表达式相同的集合(A,C)的置换。根据它们在str2中首次出现的顺序将A和C重新标记为X1和X2,因此:
因为在str2中C出现在A之前。接下来,创建数组Y,以使y [i]按照在str1中首次出现的顺序是第i个符号A或C。所以:
因为在str1中A出现在C之前。 现在通过用X1和X2替换A和C从str2构造str3:
然后开始用Xi代替Y [i]。首先,X1变为Y [1] = A:
在此阶段,将str3_1和str1比较到任何Xi的第一个匹配项(在本例中为X2),因为这两个字符串相等:
您有机会构建排列。如果它们不相等,那么您将证明不存在适当的排列(因为任何排列都必须至少进行该替换),并且可以推论不等式。但是它们是相等的,因此您继续下一步,将X2替换为Y [2] = C:
这等于str1,因此您有了排列(A-> C,C-> A)并显示了表达式的等价关系。 这仅是针对特定情况的算法演示,但应将其概括。不知道您可以将其降到最低的顺序是什么,但是它应该比n更快!在n个变量上生成所有排列的过程。 如果我正确理解单位的重要性,它们会限制通过排列将哪些变量交换为其他变量。因此,在上述表达式中,A都可以用C代替,因为它们都具有\'m \'单位,而不能被具有\'s \'单位的B代替。您可以通过以下方式处理此问题: 通过删除所有不具有m单位的符号,从str1和str2构造表达式str1_m和str2_m,然后对str1_m和str2_m执行上述算法。如果构造失败,则不存在任何排列。如果构造成功,则保留该置换(称为m置换),并通过删除所有不具有s单位的符号从str1和str2构造str1_s和str2_s,然后再次对str1_s和str2_s执行该算法。如果构建失败,则它们不是等效的。如果成功,则最终的排列将是m排列和s排列的组合(尽管您可能甚至不需要构造它,只要关心它的存在即可)。
稳赣苍卯改
函数,它将自动为您创建符号(无需全部定义它们)。
拭十年
因此,我们解决了:
如果s1!= s2,则证明不存在等价关系 用这种方法不可能说两个表达式是相等的, 但您可以说两者都不相等
好吧..我希望这可以对您有所帮助。
倪蕊悲潍
更多说明: 我怀疑这是一个普遍且可靠地解决的难题。为了正确地检查数学等价关系,您不仅必须尝试排序,而且还必须拥有一个数学等价变换库,并且还必须尝试所有这些变换。 但是,我确实相信这可能是一个可解决的问题,因为Wolfram Alpha似乎具有“替代表达式”部分,这似乎可以解决大多数情况下使用此类等效项在任意表达式上提供所有排列的问题。 总结: 我建议以下内容,并期望它会破裂: