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使用此算法进行此类等式测试
如果您将其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!
| 归档时间: |
|
| 查看次数: |
1048 次 |
| 最近记录: |