1- <usg>VariationalD::usage</usg> = "VariationalD[f, u[x], x] or
2- VariationalD[f, u[x,y,...], {x,y,...}] returns the first variational
3- derivative of the functional defined by the integrand f";
1+ (* Mathematica Package *)
2+ (* <cs>:Title:</cs> Variational Methods Package *)
3+ (* <cs>:Context:</cs> VariationalMethods` *)
44
5- (* Implementation of the package *)
6- VariationalD[<pat>f_</pat>, (<pat>y_</pat>)[<pat>x_</pat>, <pat>r___</pat>], <pat>w</pat>:{<pat>x_</pat>, <pat>r___</pat>}]/;integrandQ[<pat>f</pat>] :=
7- Module[{<mod>Dfuncs</mod>, <mod>Dtimes</mod>, <mod>dummyfunc</mod>},
5+ VariationalD<usg>::usage</usg> = "VariationalD[f, u[x], x] or ...";
6+ VariationalD<msg>::args</msg> = "VariationalD takes a single integrand...";
7+ VariationalD<msg>::argx</msg> = "The second argument of VariationalD ...";
8+
9+ VariationalD[<pat>f</pat>_, (<pat>y</pat>_)[<pat>x</pat>_, <pat>r</pat>___], <pat>w</pat>:{<pat>x</pat>_, <pat>r</pat>___}]/;integrandQ[<pat>f</pat>] :=
10+ <k>Module</k>[{<mod>Dfuncs</mod>, <mod>Dtimes</mod>, <mod>dummyfunc</mod>},
811 <mod>Dfuncs</mod> = <k>Union</k>[<k>Cases</k>[{<pat>f</pat>}, <k>Derivative</k>[__][<pat>y</pat>][__], <k>Infinity</k>]];
912 <mod>Dtimes</mod> = (<k>Head</k>[<k>Head</k>[<slot>#1</slot>]] & ) /@ <mod>Dfuncs</mod> /. <k>Derivative</k> -> <k>List</k>;
1013 <k>Simplify</k>[<k>D</k>[<pat>f</pat>, <pat>y</pat>[<pat>x</pat>, <pat>r</pat>]] + (<k>ReleaseHold</k>[<k>Thread</k>[<mod>dummyfunc</mod>[(<k>D</k>[<pat>f</pat>,
@@ -13,7 +16,12 @@ VariationalD[<pat>f_</pat>, (<pat>y_</pat>)[<pat>x_</pat>, <pat>r___</pat>], <pa
1316 (<k>Thread</k>[{<pat>w</pat>, <slot>#1</slot>}] & ) /@ <mod>Dtimes</mod>]]] /. <mod>dummyfunc</mod> -> <k>D</k>) .
1417 <fn>((-1)^<slot>#1</slot> & ) /@ (<k>Apply</k>[<k>Plus</k>, <slot>#1</slot>] &</fn> ) /@ <mod>Dtimes</mod>] ]
1518
16- VariationalD[<pat>f_ </pat>, <pat>v</pat>:{(<pat>y_</pat>)[<pat>x_</pat>, <pat>r___</pat>], <pat>___</pat>}, <pat>w</pat>:{<pat>x_</pat>, <pat>r___</pat>}] :=
19+ VariationalD[<pat>f </pat>_ , <pat>v</pat>:{(<pat>y_</pat>)[<pat>x_</pat>, <pat>r___</pat>], <pat>___</pat>}, <pat>w</pat>:{<pat>x_</pat>, <pat>r___</pat>}] :=
1720 (VariationalD[<pat>f</pat>, <slot>#1</slot>, <pat>w</pat>] & ) /@ <pat>v</pat> /;
18- <k>If</k>[<k>Apply</k>[<k>And</k>, (<k>MatchQ</k>[<slot>#1</slot>, <pat>_</pat>[<k>Apply</k>[<k>Sequence</k>, <pat>w</pat>]]] & ) /@ <pat>v</pat>],
19- <k>True</k>, <k>Message</k>[<msg>VariationalD::argx</msg>, <pat>w</pat>]]
21+ <k>If</k>[<k>Apply</k>[<k>And</k>, (<k>MatchQ</k>[<slot>#1</slot>, <pat>_</pat>[<k>Apply</k>[<k>Sequence</k>, <pat>w</pat>]]] & ) /@ <pat>v</pat>],
22+ <k>True</k>, <k>Message</k>[VariationalD<msg>::argx</msg>, <pat>w</pat>]]
23+
24+ EulerEquations[<pat>f</pat>_, <pat>funcs</pat>_, <pat>vars</pat>_]/;integrandQ[<pat>f</pat>] :=
25+ <k>Block</k>[{<blk>result</blk>=iEulerEquations[<pat>f</pat>, <pat>funcs</pat>, <pat>vars</pat>]},
26+ <blk>result</blk> /; <blk>result</blk> =!= <k>$Failed</k>
27+ ]
0 commit comments