2011-10-30 9 views
7

Jak najlepiej wykonywać następujące czynności w Mathematica?Czy istnieje wbudowana funkcja Mathematica do wyszukiwania operatorów zamiast liczb w równaniach?

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

Out[1] := Plus 
+2

W rzeczywistości można osiągnąć znacznie więcej niż to http://stackoverflow.com/questions/3947937/algorithm-for-permutations-of-operators-and-operands/3948113#3948113 –

+0

połączony pytanie było już wśród moich ulubionych o__O ... thx za link! –

+3

Nie jestem pewien, co zamierzałeś, ale możliwe, że mylisz 'Minus' i' Odejmij', FYI. –

Odpowiedz

8

Składnia wyraz pożądane może być przekształcona w zestawie Solve wyrażeń:

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

Przykład użycia:

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} 

Zaletą tego podejścia jest to, że pełna moc Solve pozostaje dostępna dla bardziej złożonych wyrażeń, np.

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]} 
+2

Również bardzo ładne rozwiązanie, dobra integracja ze standardem Solve – magma

+1

Bardzo ładne. Chciałbym o tym pomyśleć. +1 –

3

Nie jestem świadomy wbudowanej funkcji, ale nie jest trudno napisać samemu. Oto jedno podejście, które można użyć:

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

Nawiasem mówiąc, prawidłowa operator 2-3 jest Subtract nie Minus. Wynik dla przykładu:

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

Proszę mi powiedzieć, czy to robi to, co chcesz:

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

findFunction[f[2, 3] == 5, f ∈ {Plus, Minus, Divide}] 
(* Out[]= {Plus} *)
+2

Przy okazji, wiem, że odpowiedź jest zwracana jako lista, ale ponieważ można sobie wyobrazić, że więcej niż jedna funkcja będzie pasować, myślę, że nie powinna ona zwracać tylko pierwszej. –

+0

@ Mr Ładne rozwiązanie! – magma

Powiązane problemy