Given some product of units, it can be desirable to find a nicest way of expressing it, where nicest can mean least total degree or that certain units are preferred or something else. This is an integer linear programming problem, and a while ago I fell over this email by Daniel Lichtblau (of Mathematica) about how to do it with toric Grobner bases. His approach is to use the Grobner basis as a test set of the integer linear program, if I've read it correctly.
http://groups.google.com/group/comp.soft-sys.math.mathematica/msg/95b54267a665a595 Cheers Bjarke H. Roune www.broune.com On Aug 12, 10:58 am, Stan Schymanski <schym...@gmail.com> wrote: > Converting of units is one useful function, but I'd also like a > possibility to perform simple unit checks on functions. For example, if > one gets a nice equation for the total energy of a system after some > symbolic acrobatics, one would like to know whether the units of this > equation are still the units of energy. Or, what units I would get out > if I use non-SI units for the variables. > > EXAMPLE: > > ---------------------------------------------------------------------- > | Sage Version 4.1, Release Date: 2009-07-09 | > | Type notebook() for the GUI, and license() for information. | > ---------------------------------------------------------------------- > sage: var('S T P V M mu g h rho') > (S, T, P, V, M, mu, g, h, rho) > sage: Etot = T*S - P*V + M*mu + h*g*M > sage: var('J K N m kg K s') # units > (J, K, N, m, kg, K, s) > sage: unitsdict = {S: J/K, T: K, P:N/m^2, V: m^3, M: kg, mu: J/kg, g: > m/s^2, h: m} # couple units with variables > sage: Etot.subs(unitsdict) > -N*m + 2*J + kg*m^2/s^2 > sage: physdict = {N: kg*m/s^2, J: kg*m/s^2*m} # convert to base units > sage: Etot.subs(unitsdict).subs(physdict) > 2*kg*m^2/s^2 > > The above tells me that the expression for Etot returns units of kg * > m^2/s^2 if I use SI units for all the variables. These are indeed the > same as J. However, this method would not work if I only had the first > two terms of the expression for Etot: > > sage: ( T*S - P*V ).subs(unitsdict).subs(physdict) > 0 > > A unit package that does not simply add and subtract units from each > other, but checks whether each summand has the same units would be very > helpful here. For example, it could return the units of every summand, > allowing the user to find which one of them has the wrong units and > where to look for the error. > > I think that SI units would be a nice and coherent choice for the > 'simplest possible unit'. Obviously, m^2/s^2 could not be converted > automatically to J/kg, but it would be easy for the user to verify that > J/kg is indeed the same as m^2/s^2. Therefore, I would be happy if we > had a function that shows the basic units of an expression, in terms of > mass (or particle number), length and time. For this, I would strongly > favour the SI units kg, moles, m and s, but it should be possible to > allow the user to set his/her preferred system. I wouldn't know how > something like the above example could be done with non-SI units, though. > > I hope that this can be made part of the units package. > > Good luck! > > Cheers, > Stan > > Fredrik Johansson wrote: > > On Wed, Aug 12, 2009 at 9:19 AM, William Stein<wst...@gmail.com> wrote: > > >> On Wed, Aug 12, 2009 at 12:11 AM, Fredrik > >> Johansson<fredrik.johans...@gmail.com> wrote: > > >>> On Wed, Aug 12, 2009 at 8:44 AM, William Stein<wst...@gmail.com> wrote: > > >>>> On Tue, Aug 11, 2009 at 11:30 PM, Jason > >>>> Grout<jason-s...@creativetrax.com> wrote: > > >>>>> William Stein wrote: > > >>>>>> Hi, > > >>>>>> I just wanted to let people know that David Ackerman -- a UW student > >>>>>> who > >>>>>> took my course on Sage last quarter -- is working (funded by NSF) on > >>>>>> creating a "units package" for Sage right _now_. If anybody has any > >>>>>> pseudo-sage code that involves units that they wished work, please post > >>>>>> it to this thread. What do you want units to *do*? > > >>>>> Is he doing something from scratch or is he working from the packages > >>>>> that have come up from time to time here? > > >>>> He is doing something from scratch. > > >>>> I had planned to have him work on integrating some existing package, > >>>> but after evaluating that approach he said it didn't seem to make > >>>> sense (at least he has a lot of experience using Sage, since he took > >>>> my class). I didn't have an opinion one way or the other, but we > >>>> decided to ask -- "what is a so called units package supposed to do > >>>> anyways" since I honestly couldn't really tell you. I would use one > >>>> to convert between Fahrenheit and Celcius, and maybe dollars and euros > >>>> :-). We google around and found that Matlab didn't seem to come with > >>>> a units package, but there were several third party packages -- anyway > >>>> Sage isn't much like Matlab so looking there seemed pointless. Then > >>>> we looked at Mathematica's included units package and read all the > >>>> documentation and examples of it. That was enlightening, and > >>>> suggested doing almost precisely what Robert Dodier keeps telling us > >>>> to do, which is make the different units just be symbolic variables, > >>>> plus have some extra table somewhere of conversions (where everything > >>>> is kept as exact fractions), and add a few functions to do > >>>> conversions. > > >>> +1 on this design. > > >>> It's similar to what sympy does, except sympy always expands units to > >>> multiples of base units. > > >> Sage definitely will not always expand units to multiples of base > >> units. Some backward people in the world like to work with miles and > >> feet... :-) > > > Agreed. Even in the metric parts of the world, non-SI units are > > standard in fields like particle physics and astronomy. > > > On a related note, it would be handy to have a function that > > automatically converts a given quantity to the simplest possible unit: > > for example kg*m/s^2 -> N and kg*m/(A*s^3) -> V/m. > > > Of course, the "simplest possible unit" isn't uniquely defined, so > > such a function probably requires additional parameters. You have to > > decide on the set of base units, and derived units are not unique (for > > example V/m = N/C). > > > It would perhaps be sufficient if convert accepts partial units so > > that (kg*m/(A*s^3)).convert(V) -> V/m, but I'd expect convert to raise > > an exception when given incompatible units, so it's not quite the same > > thing. > > >> That said, I would be fine with Sage having a mode where it could > >> always expand to base units -- that's massively easier to implement > >> anyways. > > > Fredrik --~--~---------~--~----~------------~-------~--~----~ To post to this group, send an email to sage-devel@googlegroups.com To unsubscribe from this group, send an email to sage-devel-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/sage-devel URLs: http://www.sagemath.org -~----------~----~----~----~------~----~------~--~---