Re: Traditional Ordering of Equations
- To: mathgroup at smc.vnet.net
- Subject: [mg88818] Re: Traditional Ordering of Equations
- From: Szabolcs Horvát <szhorvat+mathgroup at gmail.com>
- Date: Sat, 17 May 2008 05:31:46 -0400 (EDT)
- Organization: University of Bergen
- References: <g0jk79$ta$1@smc.vnet.net>
Joost Keuskamp wrote:
> As a beginner in Mathematica I am using Mathematica 6.0 for integration and simplification of a number of functions which I subsequently use in a Fortran program. Now I have two questions which I cannot find the answer to in the documentation or forums:
>
> - Is there a way to prevent Mathematica from reordering a function to its standard order upon evaluation?
>
> - I want to list all resulting functions in one cell, as can be done using the Print and Fortranform commands. I want the list to look like this:
>
>
> FunctionName1 = Function1
> FunctionName2 = Function2
> FunctionName3 = Function3
> etc.
>
> All these functions were defined earlier in the notebook using the following syntax:
>
> FunctionName1 = Function1
>
> I tried writing a new Mathematica function to do this:
>
> FortranFormulas[ff_] :=
This line,
> Print[HoldForm[ff] "=" FortranForm[ff]]
is equivalent to Print[ HoldForm[ff] * "=" * FortranForm[ff] ].
Multiplication is commutative, so Mathematica will automatically sort
the three terms. You probably meant
Print[HoldForm[ff], "=", FortranForm[ff]]
instead.
> FunctionNameList = {NO3inYt, NO3outYt}
> Scan[FortranFormulas, FunctionNameList]
>
> However, this generates an output like:
> = Function1inFortranForm Function1
> = Function2inFortranForm Function2
>
> The alternative:
> FortranFormulas[ff_] :=
> Print[ff] "=" FortranForm[Release[ff]]]
Again, the syntax appears to be incorrect here ...
> FunctionNameList = {HoldForm[NO3inYt], HoldForm[NO3outYt]}
> Scan[FortranFormulas, FunctionNameList]
>
> generates an output like:
> = FunctionName1 FunctionName1
> = FunctionName2 FunctionName2
>
> Both are incorrect and in the wrong order.
>
> I don't know what to do now and was hoping that anyone had a suggestion.. ..many thanks in advance!
>
Here's a way to do this:
First, let's produce some pretty formulae to experiment with:
y = HornerForm[LegendreP[6, x]]
z = TrigExpand[Cos[6 x]]
The key is to set the attribute HoldAll on the function:
ClearAll[fortranFormulas]
SetAttributes[fortranFormulas, HoldAll]
fortranFormulas[ff_] := Print[HoldForm[ff], " = ", FortranForm[ff]]
Now one way to use the function on a list is to wrap all symbols in
Hold, as you did:
fortranFormulas @@@ {Hold[y], Hold[z]}
But it may be more convenient (less typing with long lists) to just use
strings:
Scan[ToExpression[#, InputForm, fortranFormulas] &, {"y", "z"}]