Como eu defino funcionais no Mathematica?
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
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]
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.
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[#]&]
Pois Sin + Cosvocê poderia definir SubValuespor CirclePlus:
CirclePlus[f_, g_][x] := f[x] + g[x]
Então:
W[Sin ⊕ Cos]
2