Я часто нужно проверить, если expr1==expr2
, где проверка символического равенства трудно, но цифровая проверка достаточнооператор приближенного тестирования равенства в системе Mathematica
Для рассмотрения таких дел было бы опрятно, чтобы иметь TildeTilde
работу, как Equal
но вместо проверки символического равенства он заменил бы неизвестные числовыми значениями и проверил бы числовое равенство в нескольких точках.
Неизвестные вещи, которые являются «похожими» на переменные в выражении. Я могу думать о форме x
, x[1,2]
и Subscript[x,2,3]
. Любые подсказки приветствуются!
редактировать
обычно я делаю что-то вроде ниже, но это требует определения переменных, иногда требует изменения Чоп толерантности, и «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 использует this алгоритм такого равенства тестирования
числовое тестирование было бы столь же сложно, поскольку числа с плавающей запятой а не действительные числа. –
они есть, если вы достаточно сильно жужжаете –
Я вижу две ключевые проблемы: как вы решаете, что такое переменная (x [1,2] выглядит как вызов функции мне), и как вы определяете область этих переменные? – Janus