Mathematica中近似等式测试的运算符

Yar*_*tov 3 wolfram-mathematica

我经常需要检查expr1==expr2检查符号相等性是否困难,但数字检查是否足够

为了处理这样的情况,TildeTilde工作就好了,Equal但不是检查符号相等,而是用数值替换未知数,并在几个点检查数字相等.

未知数是表达式中"看起来像"变量的东西.我能想到的就是形式x,x[1,2]而且Subscript[x,2,3].欢迎任何提示!

编辑

通常我会做类似下面的事情,但它需要指定变量,有时需要改变Chop容差,"10个样本"似乎是任意的.一个理想的测试人员将是一个功能,Equals并保证有意义的False答案.(补充Equals哪些有意义的True答案)

approxEqual[expr1_, expr2_, vars_] := 
  Chop[(expr1 - expr2 /. Thread[vars -> #]) & /@ 
     RandomReal[{-1, 1}, {10, Length[vars]}]] == Table[0, {10}];
expr1 = 1/Sqrt[2] Log[Cosh[q + x/Sqrt[2]] Sech[q - x/Sqrt[2]]];
expr2 = Sqrt[2] ArcTanh[Tanh[q] Tanh[x/Sqrt[2]]];
approxEqual[expr1, expr2, {q, x}]

作为旁注,显然Maple使用算法进行此类等式测试

Mic*_*lat 6

如果您将其FindMaximum用作起点,这有点简单:

In[64]:= FindMaximum[expr1 - expr2, q, x]

During evaluation of In[64]:= FindMaximum::fmgz: Encountered a gradient that
is effectively zero. The result returned may not be a maximum; it may be a 
minimum or a saddle point. >>

Out[64]= {1.11022*10^-16, {q -> 1., x -> 1.}}
Run Code Online (Sandbox Code Playgroud)

从而:

approxEqual[lhs_, rhs_, tol_: 10^-10] :=
 Module[{vars},
  vars = DeleteDuplicates[
    Cases[{lhs,rhs}, s_Symbol /; Not[ValueQ[s]], Infinity]
  ];
  Chop[
    First[
     Quiet[FindMaximum[Abs[lhs - rhs], Evaluate[Sequence @@ vars]]]
    ], 
    tol] == 0
  ]

In[65]:= approxEqual[expr1, expr2]
Out[65]= True

In[66]:= approxEqual[expr1, expr2, 10^-20]
Out[66]= False
Run Code Online (Sandbox Code Playgroud)

显然,一般情况下,这可能会遇到各种数字错误问题,您可以使用AccuracyGoal/ PrecisionGoal/ WorkingPrecision/等选项来解决这些问题FindMaximum.您还可以为FindMaximum变量重复多个起点.

顺便说一句,请注意TildeTilde,(ie ~~)是中缀运算符StringExpression.

HTH!