Como eu defino funcionais no Mathematica?

Sep 28 2020

Quando eu escrevo W[f_] := Integrate[f[x], {x, 0, π}]eu posso justamente concluir que W[Sin] = 2, W[Cos] = 0, W[Log] = π (-1 + Log[π])etc. Mas eu sou incapaz de definir W[Sin + Cos]ou W[Sin[Sin]]etc. Por favor, ajuda.

Respostas

4 RonaldMonson Sep 29 2020 at 11:18

O problema é que um funcional opera em funções assim em

W[f_] := Integrate[f[x], {x, 0, Pi}]

Wprecisa ser alimentado com uma função. As expressões Sin+Cosou Sin[Sin]falham porque não são funções WL. Trabalhando no espaço funcional temos os operadores de composição @*e \*mas estes não são suficientes quando se quer usar o WL funções internas que são voltadas para o trabalho com expressões gerais. Mas uma forma de cooptar as funções de WL para operar no espaço funcional é a FunctionalConstructseguinte:

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];

De certa forma, para essas integrais definidas, seria mais natural simplesmente escrever agora

Integrate[f, {0, Pi}]
Integrate[ga, {0, Pi}]
Integrate[gb, {0, Pi}]

no espaço funcional, mas porque no cálculo é frequentemente tão útil usar variáveis ​​fictícias (integrais indefinidas, transformando expressões em funções desejadas wrt x, yetc.), podemos Waplicar automaticamente a função a uma variável fictícia antes de realizar a integral:

W[f]
W[ga]
W[gb]

2

Pi StruveH [0, 1]

Pi StruveH [0, 1]

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

Certifique-se de passar a cabeça / função correta para W. Por exemplo, Sin[Sin] @ xdá Sin[Sin][x], obviamente irreconhecível pelo MMA, sem falar na avaliação posterior da integral. Portanto, uma solução opcional pode ser essas

W[Sin[#] + Cos[#] &]
W[Sin @* Sin]

onde @*está a composição.

8 evanb Sep 29 2020 at 03:47

Siné algo que leva um argumento --- Sin[7]é um número.

Em contraste, Sin+Cosnão é algo que leva um argumento! Seu funcional está tentando avaliar, por exemplo. (Sin+Cos)[7]que, sem ajuda, não entende.

Portanto, você precisa transformar o argumento de W em algo que receba argumento adequadamente.

Você poderia dizer

g[x]:= Sin[x]+Cos[x]
W[g]

por exemplo. Ou você pode fazer isso anonimamente usando funções puras (#),

W[Sin[#]+Cos[#]&]
4 CarlWoll Sep 29 2020 at 04:21

Pois Sin + Cosvocê poderia definir SubValuespor CirclePlus:

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

Então:

W[Sin ⊕ Cos]

2