Jak zdefiniować funkcjonały w Mathematica?

Sep 28 2020

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

4 RonaldMonson Sep 29 2020 at 11:18

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]

12 ΑλέξανδροςΖεγγ Sep 29 2020 at 03:27

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.

8 evanb Sep 29 2020 at 03:47

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[#]&]
4 CarlWoll Sep 29 2020 at 04:21

Dla Sin + Cosmożna zdefiniować SubValuesdla CirclePlus:

CirclePlus[f_, g_][x] := f[x] + g[x]

Następnie:

W[Sin ⊕ Cos]

2