Есть ли встроенная функция Mathematica для нахождения операторов, а не чисел в уравнениях? - PullRequest
7 голосов
/ 30 октября 2011

Как лучше всего достичь следующих результатов в Mathematica?

 In[1] := Solve[f[2,3]==5,f ∈ {Plus,Minus,Divide}]

Out[1] := Plus

Ответы [ 3 ]

8 голосов
/ 30 октября 2011

Нужный синтаксис выражения можно преобразовать в набор Solve выражений:

fSolve[expr_, f_ ∈ functions_List] :=
  Map[Solve[(expr /. f -> #) && f == #, f] &, functions] // Flatten

Пример использования:

In[6]:= fSolve[f[2,3] == 5, f ∈ {Plus, Subtract, Divide}]
Out[6]= {f -> Plus}

In[7]:= fSolve[f[4,2] == 2, f ∈ {Plus, Subtract, Divide}]
Out[7]= {f -> Subtract, f -> Divide}

Преимущество этого подхода состоит в том, что полная мощность Solve остается доступной для более сложных выражений, например

In[8]:= fSolve[D[f[x], x] < f[x], f ∈ {Log, Exp}]
Out[8]= {f -> ConditionalExpression[Log, x Log[x]∈Reals && x>E^ProductLog[1]]}

In[9]:= fSolve[D[f[x], x] <= f[x], f ∈ {Log, Exp}]
Out[9]= {f -> ConditionalExpression[Log, x Log[x]∈Reals && x>=E^ProductLog[1]],
         f -> ConditionalExpression[Exp, E^x ∈ Reals]}
6 голосов
/ 30 октября 2011

Скажите, пожалуйста, если это делает то, что вы хотите:

findFunction[expr_, head_ ∈ {ops__}] :=
    Quiet@Pick[{ops}, expr /. head -> # & /@ {ops}]

findFunction[f[2, 3] == 5, f ∈ {Plus, Minus, Divide}]
(* Out[]= {Plus} *)
3 голосов
/ 30 октября 2011

Я не знаю о встроенной функции, но написать ее не сложно.Вот один подход, который вы можете использовать:

Clear@correctOperatorQ;
correctOperatorQ[expr_, value_, 
  operators_] := (expr == value) /. Head[expr] -> # & /@ operators

Кстати, правильный оператор для 2-3 это Subtract, а не Minus.Результат для вашего примера:

correctOperatorQ[f[2, 3], 5, {Plus,Subtract,Divide}]
Out[1]={True, False, False}
...