{VERSION 5 0 "SGI MIPS UNIX" "5.0" } {USTYLETAB {CSTYLE "Maple Input" -1 0 "Courier" 0 1 255 0 0 1 0 1 0 0 1 0 0 0 0 1 }{CSTYLE "2D Math" -1 2 "Times" 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 1 }{CSTYLE "2D Comment" 2 18 "" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 } {CSTYLE "2D Output" 2 20 "" 0 1 0 0 255 1 0 0 0 0 0 0 0 0 0 1 } {CSTYLE "" -1 256 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 257 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 258 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{PSTYLE "Normal" -1 0 1 {CSTYLE "" -1 -1 "Tim es" 1 12 0 0 0 1 2 2 2 2 2 2 1 1 1 1 }1 1 0 0 0 0 1 0 1 0 2 2 0 1 } {PSTYLE "Heading 1" -1 3 1 {CSTYLE "" -1 -1 "Times" 1 18 0 0 0 1 2 1 2 2 2 2 1 1 1 1 }1 1 0 0 8 4 1 0 1 0 2 2 0 1 }{PSTYLE "Error" -1 8 1 {CSTYLE "" -1 -1 "Courier" 1 10 255 0 255 1 2 2 2 2 2 1 1 1 3 1 }1 1 0 0 0 0 1 0 1 0 2 2 0 1 }{PSTYLE "Maple Output" -1 11 1 {CSTYLE "" -1 -1 "Times" 1 12 0 0 0 1 2 2 2 2 2 2 1 1 1 1 }3 3 0 0 0 0 1 0 1 0 2 2 0 1 }{PSTYLE "" 11 12 1 {CSTYLE "" -1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }1 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }} {SECT 0 {EXCHG {PARA 3 "" 0 "" {TEXT -1 47 "Maple Summer Workshop '04: Programing Tutorial " }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 27 "Michael \+ Monagan, June 2004." }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 233 "This work sheet shows how to program a symbolic differentiation routine in Maple .\nThe program is recursive, it shows the use of the type command, Map le's recursive representation of formulae, and the use of various comm ands for loops." }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 51 "First, Maple e xpressions can be analyzed using the " }{TEXT 256 4 "type" }{TEXT -1 17 " command and the " }{TEXT 257 2 "op" }{TEXT -1 5 " and " }{TEXT 258 4 "nops" }{TEXT -1 67 " command. We illustrate this first by \"di sassembling\" the formula " }{XPPEDIT 18 0 "2*x*exp(-x)+x^2+1;" "6#,(* (\"\"#\"\"\"%\"xGF&-%$expG6#,$F'!\"\"F&F&*$F'F%F&F&F&" }{TEXT -1 2 " . " }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 25 "f := 2*x*exp(-x^2)+x^2+ 1;" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"fG,(*(\"\"#\"\"\"%\"xGF(-%$e xpG6#,$*$)F)F'F(!\"\"F(F(F.F(F(F(" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 21 "type(f,`+`); nops(f);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#%%trueG" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"$" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 26 "op(1,f); op(2,f); op(3,f);" }} {PARA 11 "" 1 "" {XPPMATH 20 "6#,$*(\"\"#\"\"\"%\"xGF&-%$expG6#,$*$)F' F%F&!\"\"F&F&" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#*$)%\"xG\"\"#\"\"\"" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 35 "g := op(1,f); type(g,`*`); nops(g);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"gG,$*(\"\"#\"\"\"%\"xGF(-%$expG6#,$*$)F)F'F(!\" \"F(F(" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#%%trueG" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"$" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 26 "op( 1,g); op(2,g); op(3,g);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"#" }} {PARA 11 "" 1 "" {XPPMATH 20 "6#%\"xG" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#-%$expG6#,$*$)%\"xG\"\"#\"\"\"!\"\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 40 "h := op(3,g); type(h,function); op(0,h);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"hG-%$expG6#,$*$)%\"xG\"\"#\"\"\"!\"\"" }} {PARA 11 "" 1 "" {XPPMATH 20 "6#%%trueG" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#%$expG" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 17 "nops(h); op (1,h);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"\"" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#,$*$)%\"xG\"\"#\"\"\"!\"\"" }}}{EXCHG {PARA 0 "> " 0 " " {MPLTEXT 1 0 35 "f := op(1,h); type(f,`*`); nops(f);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"fG,$*$)%\"xG\"\"#\"\"\"!\"\"" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#%%trueG" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"#" }} }{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 17 "op(1,f); op(2,f);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#!\"\"" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#*$) %\"xG\"\"#\"\"\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 35 "g := op (2,f); type(g,`^`); op(2,g);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"gG *$)%\"xG\"\"#\"\"\"" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#%%trueG" }} {PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"#" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 52 "op(1,g); op(2,g); op(3,g); # the error is deliberate " }}{PARA 11 "" 1 "" {XPPMATH 20 "6#%\"xG" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"#" }}{PARA 8 "" 1 "" {TEXT -1 41 "Error, improper o p or subscript selector\n" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 27 "h := op(1,g); type(h,name);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>% \"hG%\"xG" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#%%trueG" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 30 "h := op(2,g); type(h,integer);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"hG\"\"#" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#%%trueG" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 139 "The starting point is a routine which ca n return \"unevaluated\", i.e., it doesn't know anything. This is don e by using 'quotes' as follows." }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 7 "sin(0);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"!" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 9 "'sin'(0);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#-%$sinG6#\"\"!" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 43 "DIFF := proc(f,x::name)\n 'DIFF'(f,x)\nend:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 68 "DIFF(1,x), DIFF(x,x), DIFF(y,x), DIFF(2*x +x*y+1,x), DIFF(x^2+x+2,x);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6'-%%DIFF G6$\"\"\"%\"xG-F$6$F'F'-F$6$%\"yGF'-F$6$,(*&\"\"#F&F'F&F&*&F'F&F,F&F&F &F&F'-F$6$,(*$)F'F1F&F&F'F&F1F&F'" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 120 "Now we add the rule for differentiating a sum. We use the type, op and nops commands to access the terms in a sum and " }{TEXT -1 46 " program the differentiation rule using a loop" }}}{EXCHG {PARA 0 "> \+ " 0 "" {MPLTEXT 1 0 170 "DIFF := proc(f,x::name) local s,i; \n if ty pe(f,`+`) then\n s := 0; \n for i to nops(f) do s := s+DIFF( op(i,f),x) od;\n return s;\n fi; \n 'DIFF'(f,x)\nend:" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 29 "f := x^2+3*x*y+1; \nDIFF(f,x );" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"fG,(*$)%\"xG\"\"#\"\"\"F**( \"\"$F*F(F*%\"yGF*F*F*F*" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#,,*(\"\"# \"\"\"-%%DIFFG6$%\"xGF*F&F*F&F&*(-F(6$\"\"$F*F&F*F&%\"yGF&F&*(F.F&F'F& F/F&F&*(F.F&F*F&-F(6$F/F*F&F&-F(6$F&F*F&" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 124 "Now we add the rules for differentiation of products. Th is illustrates the use of subsop for deleting a factor in a product." }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 14 "g := 2*y*x^2; " }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"gG,$*(\"\"#\"\"\"%\"yGF()%\"xGF'F(F(" }} }{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 12 "type(g,`*`);" }}{PARA 11 " " 1 "" {XPPMATH 20 "6#%%trueG" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 8 "op(2,g);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#%\"yG" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 14 "subsop(2=1,g);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#,$*&\"\"#\"\"\")%\"xGF%F&F&" }}}{EXCHG {PARA 0 "> " 0 " " {MPLTEXT 1 0 289 "DIFF := proc(f,x::name) local s,i,u,v; \n if typ e(f,`+`) then\n s := 0; \n for i to nops(f) do s := s+DIFF(o p(i,f),x) od;\n return s;\n fi;\n if type(f,`*`) then\n \+ u := op(1,f);\n v := subsop(1=1,f);\n return DIFF(u,x)*v + u *DIFF(v,x);\n fi;\n 'DIFF'(f,x)\nend:" }}}{EXCHG {PARA 0 "> " 0 " " {MPLTEXT 1 0 10 "DIFF(g,x);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#,(*(- %%DIFFG6$\"\"#%\"xG\"\"\"%\"yGF*)F)F(F*F**(F(F*-F&6$F+F)F*F,F*F**(F(F* F+F*-F&6$*$F,F*F)F*F*" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 18 "Now the \+ power rule" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 411 "DIFF := proc (f,x::name) local s,i,u,v,n; \n if type(f,`+`) then\n s := 0; \+ \n for i to nops(f) do s := s+DIFF(op(i,f),x) od;\n return s ;\n fi;\n if type(f,`*`) then\n u := op(1,f);\n v := f/u ;\n return DIFF(u,x)*v + u*DIFF(v,x);\n fi;\n if type(f,`^`) \+ and type(op(2,f),integer) then\n u := op(1,f);\n n := op(2,f );\n return n*DIFF(u,x)*u^(n-1);\n fi;\n 'DIFF'(f,x)\nend:" } }}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 10 "DIFF(h,x);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#-%%DIFFG6$\"\"#%\"xG" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 10 "DIFF(g,x);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#,(*(-%% DIFFG6$\"\"#%\"xG\"\"\"%\"yGF*)F)F(F*F**(F(F*-F&6$F+F)F*F,F*F***\"\"%F *F+F*-F&6$F)F)F*F)F*F*" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 10 "D IFF(f,x);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#,,*(\"\"#\"\"\"-%%DIFFG6$ %\"xGF*F&F*F&F&*(-F(6$\"\"$F*F&F*F&%\"yGF&F&*(F.F&F'F&F/F&F&*(F.F&F*F& -F(6$F/F*F&F&-F(6$F&F*F&" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 98 "All t hat is left to do is define differentiation of numbers. And differen tiation of variables. " }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 556 "DIFF := proc(f,x::name) local s,i,u,v,n;\n if type(f,integer) or ty pe(f,fraction) or type(f,float) then return 0 fi;\n if type(f,name) \+ then if f=x then return 1; else return 0; fi; fi;\n if type(f,`+`) t hen\n s := 0; \n for i to nops(f) do s := s+DIFF(op(i,f),x) \+ od;\n return s;\n fi;\n if type(f,`*`) then\n u := op(1, f);\n v := f/u;\n return DIFF(u,x)*v + u*DIFF(v,x);\n fi; \n if type(f,`^`) and type(op(2,f),integer) then\n u := op(1,f) ;\n n := op(2,f);\n return n*DIFF(u,x)*u^(n-1);\n fi;\n \+ 'DIFF'(f,x)\nend:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 22 "Diff(f ,x) = DIFF(f,x);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#/-%%DiffG6$,(*$)% \"xG\"\"#\"\"\"F,*(\"\"$F,F*F,%\"yGF,F,F,F,F*,&*&F+F,F*F,F,*&F.F,F/F,F ," }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 22 "Diff(g,x) = DIFF(g,x); " }}{PARA 11 "" 1 "" {XPPMATH 20 "6#/-%%DiffG6$,$*(\"\"#\"\"\"%\"yGF*) %\"xGF)F*F*F-,$*(\"\"%F*F-F*F+F*F*" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 391 "Now we optimize. The types integer, fraction and float togeth er are of type numeric. We use the add command to treat a sum. We us e a structured type to simplify the test for a power of a numerical co nstant and the typematch command to assign the components for us. And we reprogram the product rule for an n factor product. We use a diff erent forms of the add command as illustrated now" }}}{EXCHG {PARA 0 " > " 0 "" {MPLTEXT 1 0 32 "add( F(op(i,f)), i=1..nops(f) );" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#,(-%\"FG6#*$)%\"xG\"\"#\"\"\"F+-F%6#,$*(\"\" $F+F)F+%\"yGF+F+F+-F%6#F+F+" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 17 "add( F(u), u=f );" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#,(-%\"FG6#*$) %\"xG\"\"#\"\"\"F+-F%6#,$*(\"\"$F+F)F+%\"yGF+F+F+-F%6#F+F+" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 367 "DIFF := proc(f,x::name) local s,i, u,v,n;\n if type(f,numeric) then return 0 fi;\n if type(f,name) th en if f=x then return 1; else return 0; fi; fi;\n if type(f,`+`) the n return add( DIFF(u,x), u=f ) fi;\n if type(f,`*`) then return add( DIFF(u,x)*f/u, u=f ) fi;\n if typematch(f,(u::anything)^(n::numeric )) then return n*DIFF(u,x)*u^(n-1) fi;\n 'DIFF'(f,x)\nend:" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 22 "Diff(f,x) = DIFF(f,x);" }} {PARA 11 "" 1 "" {XPPMATH 20 "6#/-%%DiffG6$,(*$)%\"xG\"\"#\"\"\"F,*(\" \"$F,F*F,%\"yGF,F,F,F,F*,&*&F+F,F*F,F,*&F.F,F/F,F," }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 22 "Diff(g,x) = DIFF(g,x);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#/-%%DiffG6$,$*(\"\"#\"\"\"%\"yGF*)%\"xGF)F*F*F-,$*(\"\" %F*F-F*F+F*F*" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 122 "Finally, we add rules for ln(x), exp(x), sin(x), cos(x), and generalize the constants from numbers to arbitrary constants." }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 21 "type(sin(1),numeric);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#%&falseG" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 22 "type(sin( 1),constant);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#%%trueG" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 53 "h := ln(x)*exp(x)+sqrt(2)*exp(-2*x^ 2)+tan(1)*ln(x)^2;" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"hG,(*&-%#lnG 6#%\"xG\"\"\"-%$expGF)F+F+*&\"\"##F+F/-F-6#,$*&F/F+)F*F/F+!\"\"F+F+*&- %$tanG6#F+F+)F'F/F+F+" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 10 "DI FF(h,x);" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#,,*&-%%DIFFG6$-%#lnG6#%\"x GF+\"\"\"-%$expGF*F,F,*&-F&6$F-F+F,F(F,F,*&-F&6$-F.6#,$*&\"\"#F,)F+F9F ,!\"\"F+F,F9#F,F9F,*&-F&6$-%$tanG6#F,F+F,)F(F9F,F,**F9F,F%F,F(F,F@F,F, " }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 634 "DIFF := proc(f,x::name ) local s,i,u,v,n;\n if type(f,constant) then return 0 fi;\n if ty pe(f,name) then if f=x then return 1; else return 0; fi; fi;\n if ty pe(f,`+`) then return add( DIFF(u,x), u=f ) fi;\n if type(f,`*`) the n return add( DIFF(u,x)*f/u, u=f ) fi;\n if typematch(f,(u::anything )^(n::constant)) then return n*DIFF(u,x)*u^(n-1) fi;\n if op(0,f)=ex p then u := op(1,f); return DIFF(u,x)*exp(u); fi;\n if op(0,f)=ln th en u := op(1,f); return DIFF(u,x)/u; fi;\n if typematch(f,sin(u::any thing)) then return DIFF(u,x)*cos(u) fi;\n if typematch(f,cos(u::any thing)) then return -DIFF(u,x)*sin(u) fi;\n 'DIFF'(f,x)\nend:" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 10 "DIFF(h,x);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#,**&%\"xG!\"\"-%$expG6#F%\"\"\"F**&-%#lnGF)F*F'F*F** *\"\"%F*F%F*-F(6#,$*&\"\"#F*)F%F4F*F&F*F4#F*F4F&**F4F*F%F&F,F*-%$tanG6 #F*F*F*" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 10 "diff(h,x);" }} {PARA 11 "" 1 "" {XPPMATH 20 "6#,**&%\"xG!\"\"-%$expG6#F%\"\"\"F**&-%# lnGF)F*F'F*F***\"\"%F*F%F*-F(6#,$*&\"\"#F*)F%F4F*F&F*F4#F*F4F&**F4F*F% F&F,F*-%$tanG6#F*F*F*" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 70 "There is more. We'll do partial derivatives of unknown functions now." }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 53 "f := DIFF(DIFF(F(x,y),x),y) \+ - DIFF(DIFF(F(x,y),y),x);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"fG,&- %%DIFFG6$-F'6$-%\"FG6$%\"xG%\"yGF.F/\"\"\"-F'6$-F'6$F+F/F.!\"\"" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 36 "g := DIFF(DIFF(DIFF(F(x,y),x ),y),x);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"gG-%%DIFFG6$-F&6$-F&6$ -%\"FG6$%\"xG%\"yGF/F0F/" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 73 "h := DIFF(DIFF(DIFF(F(x,y,z),x),y),z) - DIFF(DIFF(DIFF(F(x,y,z),z),y) ,x);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"hG,&-%%DIFFG6$-F'6$-F'6$-% \"FG6%%\"xG%\"yG%\"zGF0F1F2\"\"\"-F'6$-F'6$-F'6$F-F2F1F0!\"\"" }}} {EXCHG {PARA 0 "" 0 "" {TEXT -1 209 "It is a challenge for my students to make partial derivatives commute. One way to do this is to reorde r the derivatives if the variables are out of order. We can do this u sing sets which are sorted by Maple." }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 23 "s := \{x,y\}; t := \{y,x\};" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"sG<$%\"xG%\"yG" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#> %\"tG<$%\"xG%\"yG" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 503 "DIFF \+ := proc(f,x::name) local s,i,u,v,n,y;\n if type(f,constant) then ret urn 0 fi;\n if type(f,name) then if f=x then return 1; else return 0 ; fi; fi;\n if type(f,`+`) then return add( DIFF(u,x), u=f ) fi;\n \+ if type(f,`*`) then return add( DIFF(u,x)*f/u, u=f ) fi;\n if typem atch(f,(u::anything)^(n::constant)) then return n*DIFF(u,x)*u^(n-1) fi ;\n if op(0,f)=DIFF then\n u := op(1,f);\n y := op(2,f); \+ \n if op(1,\{y,x\}) <> y then return DIFF(DIFF(u,x),y) fi;\n fi ;\n 'DIFF'(f,x)\nend:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 2 "f ;" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"!" }}}{EXCHG {PARA 0 "> " 0 " " {MPLTEXT 1 0 2 "g;" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#-%%DIFFG6$-F$6 $-F$6$-%\"FG6$%\"xG%\"yGF-F-F." }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 2 "h;" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"!" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 67 "Why does this work? What sorting algorithm is it implicitly using?" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 145 "We can opt imize this code too to use typematch but we have to be carefull becaus e DIFF(u::anything,y::name) if evaluated will result in an error." }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 26 "DIFF(u::anything,y::name);" }}{PARA 8 "" 1 "" {TEXT -1 97 "Error, invalid input: DIFF expects its \+ 2nd argument, x, to be of type name, but received y::name\n" }}} {EXCHG {PARA 0 "" 0 "" {TEXT -1 70 "We want to match a structure and \+ we use quotes to prevent evaluation." }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 28 "'DIFF'(u::anything,y::name);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#-%%DIFFG6$'%\"uG%)anythingG'%\"yG%%nameG" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 421 "DIFF := proc(f,x::name) local s,i, u,v,n,y;\n if type(f,constant) then 0\n elif type(f,name) then if \+ f=x then 1; else 0; fi\n elif type(f,`+`) then add( DIFF(u,x), u=f ) \n elif type(f,`*`) then add( DIFF(u,x)*f/u, u=f )\n elif typematc h(f,(u::anything)^(n::constant)) then n*DIFF(u,x)*u^(n-1)\n elif typ ematch(f,'DIFF'(u::anything,y::name)) and op(1,\{y,x\}) <> y then DIFF (DIFF(u,x),y)\n else 'DIFF'(f,x)\n fi;\nend:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 8 "f; g; h;" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\" \"!" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#-%%DIFFG6$-F$6$-F$6$-%\"FG6$%\" xG%\"yGF-F-F." }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"!" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}}{MARK "2 0 0" 0 }{VIEWOPTS 1 1 0 1 1 1803 1 1 1 1 }{PAGENUMBERS 0 1 2 33 1 1 }