Re: Procedure to Function
- To: mathgroup at smc.vnet.net
- Subject: [mg8143] Re: [mg8117] Procedure to Function
- From: Allan Hayes <hay at haystack.demon.co.uk>
- Date: Fri, 15 Aug 1997 23:41:54 -0400
- Sender: owner-wri-mathgroup at wolfram.com
Robert Pratt <rpratt at math.unc.edu> in [mg8117] Procedure to Function writes >>>> I am having difficulty rewriting a short procedure as a single function.Can anyone explain why I get the wrong answer using the function instead of the procedure? Given a harmonic function u[x,y], I'm trying to find its harmonic conjugate v[x,y] (so that the Cauchy-Riemann equations hold). PROCEDURE Clear[u, v, x, y, g] u = x^3 - 3 x y^2 + y; v[x_, y_] := Integrate[D[u,x],y] + g[x]; g[x_] := Evaluate[g[x] /.DSolve[D[v[x, y],x] == D[u,y], g[x], x][[1]]]; v[x, y] -x + 3 x^2 y - y^3 + C[1] FUNCTION Clear[u, v, x, y, g, HarmonicConjugate] HarmonicConjugate[u_] := (v[x_, y_] := Integrate[D[u,x],y] + g[x]; g[x_] := Evaluate[g[x] /.DSolve[D[v[x, y],x] == D[u,y], g[x], x][[1]]]; v[x, y]) HarmonicConjugate[x^3 - 3 x y^2 + y] 3 x^2 y - y^3 + x (-1 + 6 x y) + C[1] >>>>>>> Robert, There seems to a typing error in your code DSolve[D[v[x, y],x] == D[u,y] should, I think, be DSolve[D[v[x, y],x] == - D[u,y] But the interesting difference between procedural and functional forms looks as if is due to scoping causing the introduction of new variables: When we evaluate HarmonicConjugate[x^3 - 3 x y^2 + y] The use of HarmonicConjugate[u_] := ..... causes x^3 - 3 x y^2 + y to be substituted for u on the right side. The first problem is that when this substitution is being looked at for u in v[x_, y_] := Integrate[D[u,x],y] + g[x]; (**) it is recognised that the x and y in x^3 - 3 x y^2 + y would be within the scope of x an y on the left side (v[x_, y_]) and so, *before* the substitution is made, the occurrences of x and y in (**) are replaced by new variables x$ and y$ . So the definition actually stored is v[x$_, y$_] := Integrate[D[x^3 - 3 x y^2 + y,x$],y$] + g[x$]; You can see this by looking at TracePrint[HarmonicConjugate[x^3 - 3 x y^2 + y],_SetDelayed] A similar problem arises from g[x_] := Evaluate[g[x] /.DSolve[D[v[x, y],x] == D[u,y], g[x], x][[1]]] If you evaluated these forms you will get the odd answer. SOLUTION: A general way of avoiding this kind of problem is to prevent the direct substition. Thus: Clear[u, v, x, y, g, HarmonicConjugate] HarmonicConjugate[u_] := (uu=u; v[x_, y_] := Integrate[D[uu,x],y] + g[x]; g[x_] := Evaluate[g[x] /.DSolve[D[v[x, y],x] == D[uu,y], g[x], x][[1]]]; v[x, y]) HarmonicConjugate[x^3 - 3 x y^2 + y]; x - 3*x^2*y - y^3 + C[1] Here is another function, though it does not include the arbitrary constant in the result, HarmonicConjugate2[u_,{x_,y_}]:= (# + Integrate[-D[#,x]-D[u,y],x])&[Integrate[D[u,x],y]] HarmonicConjugate2[x^3 - 3 x y^2 + y,{x,y}] -x + 3*x^2*y - y^3 Allan Allan Hayes hay at haystack.demon.co.uk http://www.haystack.demon.co.uk/training.html voice:+44 (0)116 2714198 fax: +44 (0)116 2718642 Leicester, UK