Jak zdefiniować funkcjonały w Mathematica?
Kiedy piszę W[f_] := Integrate[f[x], {x, 0, π}]mogę stwierdzić, że słusznie
W[Sin] = 2, W[Cos] = 0, W[Log] = π (-1 + Log[π])itd. Ale nie jestem w stanie określić W[Sin + Cos]czy W[Sin[Sin]]itd. Proszę o pomoc.
Odpowiedzi
Problem polega na tym, że funkcjonalność działa na funkcjach tak w
W[f_] := Integrate[f[x], {x, 0, Pi}]
Wmusi być karmiony funkcją. Wyrażenia Sin+Coslub Sin[Sin]zawodzą, ponieważ nie są to funkcje WL. Praca w przestrzeni funkcjonalnej mamy operatory kompozycji @*i \*nie są one jednak wystarczające, gdy chcemy wykorzystać WL wbudowanej funkcji, które są ukierunkowane na pracę z wyrażeń ogólnych. Ale jednym ze sposobów wykorzystania funkcji WL do działania w przestrzeni funkcjonalnej jest FunctionalConstruct:
FunctionalConstruct[op_, fs__] := Function[x, op @@ Through[{fs}[x]]];
FunctionalConstruct[op_] := op;
f = FunctionalConstruct[Plus, Sin, Cos];
ga = FunctionalConstruct[Sin, Sin];
gb = FunctionalConstruct[Sin@*Sin];
W pewnym sensie dla tych całek oznaczonych byłoby bardziej naturalne, gdybyśmy je teraz zapisali
Integrate[f, {0, Pi}]
Integrate[ga, {0, Pi}]
Integrate[gb, {0, Pi}]
w przestrzeni funkcjonalnej, ale dlatego, że w rachunku często jest tak przydatne do wykorzystania zmiennych binarnych (całki nieoznaczone, zamieniając wyraz w pożądane funkcje wrt x, yitd.) otrzymujemy Wautomatycznie zastosować funkcję do zmiennej manekina przed wykonaniem całki:
W[f]
W[ga]
W[gb]
2
Pi StruveH [0, 1]
Pi StruveH [0, 1]
Upewnij się, że przekazujesz prawą głowę / funkcję do W. Na przykład Sin[Sin] @ xdaje Sin[Sin][x], oczywiście nierozpoznawalne przez MMA, nie wspominając o wynikowej ocenie całki. Więc jednym opcjonalnym rozwiązaniem mogą być te
W[Sin[#] + Cos[#] &]
W[Sin @* Sin]
gdzie @*jest kompozycja.
Sinjest czymś, co przyjmuje argument --- Sin[7]jest liczbą.
W przeciwieństwie do tego Sin+Cosnie jest czymś, co wymaga kłótni! Twoja funkcjonalność próbuje ocenić np. (Sin+Cos)[7]którego bez pomocy nie rozumie.
Musisz więc przekształcić argument W w coś, co właściwie przyjmuje argument.
Można powiedzieć
g[x]:= Sin[x]+Cos[x]
W[g]
na przykład. Lub możesz to zrobić anonimowo, używając czystych funkcji (#),
W[Sin[#]+Cos[#]&]
Dla Sin + Cosmożna zdefiniować SubValuesdla CirclePlus:
CirclePlus[f_, g_][x] := f[x] + g[x]
Następnie:
W[Sin ⊕ Cos]
2