Comment définir des fonctionnelles dans Mathematica?
Quand j'écris W[f_] := Integrate[f[x], {x, 0, π}]je à juste titre conclure que W[Sin] = 2, W[Cos] = 0, W[Log] = π (-1 + Log[π])etc. Mais je suis incapable de définir W[Sin + Cos]ou W[Sin[Sin]]etc. S'il vous plaît aider.
Réponses
Le problème est qu'une fonctionnelle opère sur des fonctions de manière à
W[f_] := Integrate[f[x], {x, 0, Pi}]
Wdoit être alimenté par une fonction. Les expressions Sin+Cosou Sin[Sin]échouent car ce ne sont pas des fonctions WL. En travaillant dans l'espace fonctionnel, nous avons les opérateurs de composition @*et \*ceux-ci ne sont pas suffisants lorsque vous souhaitez utiliser les fonctions intégrées de WL qui sont conçues pour travailler avec des expressions générales. Mais une façon de coopter les fonctions de WL pour opérer dans l'espace fonctionnel est la FunctionalConstructsuivante:
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];
À certains égards, pour ces intégrales définies, il serait plus naturel d'écrire simplement maintenant
Integrate[f, {0, Pi}]
Integrate[ga, {0, Pi}]
Integrate[gb, {0, Pi}]
dans l'espace fonctionnel mais parce qu'en calcul, il est souvent si utile d'utiliser des variables factices (intégrales indéfinies, transformer des expressions en fonctions souhaitées x, yetc.), nous arrivons Wà appliquer automatiquement la fonction à une variable factice avant d'exécuter l'intégrale:
W[f]
W[ga]
W[gb]
2
Pi StruveH [0, 1]
Pi StruveH [0, 1]
Assurez-vous de passer la bonne tête / fonction à W. Par exemple, Sin[Sin] @ xdonne Sin[Sin][x], manifestement méconnaissable par MMA, sans parler de l'évaluation consécutive de l'intégrale. Une solution optionnelle peut donc être celle-ci
W[Sin[#] + Cos[#] &]
W[Sin @* Sin]
où @*est Composition.
Sinest quelque chose qui prend un argument --- Sin[7]est un nombre.
En revanche, ce Sin+Cosn'est pas quelque chose qui prend un argument! Votre fonctionnel essaie d'évaluer par exemple. (Sin+Cos)[7]ce que, sans aide, il ne comprend pas.
Donc, vous devez transformer l'argument de W en quelque chose qui prend correctement l'argument.
Vous pourriez dire
g[x]:= Sin[x]+Cos[x]
W[g]
par exemple. Ou, vous pouvez le faire de manière anonyme en utilisant des fonctions pures (#),
W[Sin[#]+Cos[#]&]
Car Sin + Cosvous pouvez définir SubValuespour CirclePlus:
CirclePlus[f_, g_][x] := f[x] + g[x]
Ensuite:
W[Sin ⊕ Cos]
2