Avec le problème que vous décrivez, je ne vois pas une façon simple de le faire. Une chose que vous pourriez faire pour le refondre pour le rendre beaucoup plus facile serait de redéfinir A
donc c'est une fonction des dérivés de F
et G
. Si vous avez
A[{dFdx_,dFdy_}, {dGdx_,dGdy_}] := dFdx*dFdy
vous serez dans une très bonne position pour calculer les dérivés de F
que vous avez besoin et ensuite définir AF
d'une manière qui est générique par rapport à A
, comme ceci:
With[{ dFdx = D[F,x], dFdy = D[F,y] },
AF[G_] := A[{dFdx, dFdy}, {D[G, x], D[G, y]}]]
Vous pouvez utiliser With
pour substituer des pièces évaluées dans le côté droit non évalué d'un formulaire SetDelayed (une définition utilisant ": =") comme indiqué. Cependant, si vous ne pouvez pas faire ce changement, les choses vont devenir poilues, et vous devrez faire quelques suppositions sur ce que A
est.
Si A
est un symbole DownValues défini pour elle, et a une définition simple, vous pouvez faire l'évaluation partielle que vous voulez en utilisant un Hold
, faire des substitutions de règles, et puis en faisant un ReleaseHold
, comme ceci:
ReleaseHold[
Hold[AF[G_] := A[F, G]] /. DownValues[A] /.
HoldPattern[D[F, var_]] :> With[{eval = D[F, var]}, eval /; True]]
le bit With[...]
dans la deuxième règle est une astuce pour forcer l'évaluation de quelque chose correspondant à un modèle dans un Hold
appelé "Trott-Strzebonski method", ce qui est obscur, mais extrêmement utile pour des tâches comme celle-ci. Cependant, cela va vraiment limiter votre interface, ce qui signifie que vous ne pouvez pas, par exemple, passer une fonction pure pour A
, et avec une définition plus compliquée, cette astuce ne fonctionnera probablement pas non plus. Si vous parvenez à spécifier que votre forme différentielle sera une fonction des dérivées réelles, je vous recommande fortement de le faire.
EDIT: J'ai pensé à une manière plus générale et plus robuste de le faire.
L'astuce est alors de supprimer temporairement la définition de D
(l'opérateur dérivé) en utilisant Block
, de sorte que les dérivés dans la définition de A
restent non évalués, puis utilisez-le remplacement de la règle de remplacer les valeurs pour les dérivés de F
tout en enveloppant tout dans une pure fonction pour obtenir le remplacement de bon nom, comme ceci:
With[{fRules =
{HoldPattern[D[F, x]] :> Evaluate[D[F, x]]}},
Block[{D},
With[{fn = Function[G, Evaluate[A[F, G] /. fRules]]},
AF[G_] := fn[G]]]]
Merci! Cela a fonctionné parfaitement. J'ai cependant fait quelques changements non-essentiels pour prendre en compte la possibilité d'avoir plus d'une variable x, y, etc. Donc le code que j'ai utilisé est AF = With [{fRules = {HoldPattern [D [F, x_]]:> Evaluer [D [F, x]]}}, Bloquer [{D}, Fonction [G, Evaluer [A [F, G] /. fRules]]]]; – cefstat