gpt4 book ai didi

wolfram-mathematica - 在 Mathematica 中进行近似相等测试的运算符

转载 作者:行者123 更新时间:2023-12-04 08:13:15 25 4
gpt4 key购买 nike

我经常需要检查是否 expr1==expr2,其中很难检查符号是否相等,但数字检查就足够了

要处理这种情况,让 TildeTildeEqual 一样工作会很好,但不是检查符号相等性,而是用数值替换未知数并检查数字相等性在几个点上。

未知数是表达式中“看起来像”变量的东西。我能想到的形式有 xx[1,2]Subscript[x,2,3]。欢迎任何提示!

编辑

通常我会做类似下面的事情,但它需要指定变量,有时需要更改 Chop 公差,并且“10 个样本”似乎是任意的。一个理想的测试器应该是一个像 Equals 一样工作并保证有意义的 False 答案的函数。 (补充具有有意义的 True 答案的 Equals)

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 使用 this这种相等性测试的算法

最佳答案

如果您使用 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.}}

因此:

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

显然,通常这会受到各种数值错误问题的影响,您可以使用 AccuracyGoal/PrecisionGoal/WorkingPrecision/等选项来解决这些问题到 FindMaximum。您还可以为变量的多个起点重复 FindMaximum

另外,请注意 TildeTilde(即 ~~)是 StringExpression 的中缀运算符.

喂!

关于wolfram-mathematica - 在 Mathematica 中进行近似相等测试的运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4201346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com