Comment définir des fonctionnelles dans Mathematica?

Sep 28 2020

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

4 RonaldMonson Sep 29 2020 at 11:18

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]

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

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.

8 evanb Sep 29 2020 at 03:47

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

Car Sin + Cosvous pouvez définir SubValuespour CirclePlus:

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

Ensuite:

W[Sin ⊕ Cos]

2