| 1 | initial version |
For now, I find it more useful to define my own units instead of using the build-in Sage units. For example, I would rewrite this code as follows:
# Setup units
# Define base units (kilogram, meter, second) and secondary units (lbf, inch, sec)
kilogram = var('kilogram', domain='positive'); assume(kilogram,'real');
meter = var('meter', domain='positive'); assume(meter,'real');
second = var('second', domain='positive'); assume(second,'real');
lbf = 4.44822162*kilogram*meter/second^2
inch = 0.0254*meter
sec = 1*second;
psi = lbf / inch^2;
gal = 231.0*inch^3;
min = 60.0*sec;
gpm = gal/min;
hole = gpm/sqrt(psi);
# Define the given constraints
FLext = 20000.0*lbf;
vext = 15.0*inch/sec;
FLret = -10000.0*lbf;
vret = -15.0*inch/sec;
# Assumed values
Ps = 3000.0*psi;
pv = 1.0;
pc = 1.4;
# System of 3 equations, 3 unknowns
ABE = var('A_BE');
ARE = var('A_RE');
kv = var('k_v');
eq1 = vext^2 == (Ps*ABE - FLext) * kv^2 / ABE^3 / (1 + pv^2 * pc^(-3));
eq2 = vret^2 == (FLret + Ps*ARE) * kv^2 / ARE^3 / (1 + pv^2 * pc^3);
eq3 = pc == ABE / ARE;
soln = solve([eq1, eq2, eq3], [ABE, ARE, kv], solution_dict=True);
sol = soln[1];
show(sol[ABE])
show(sol[ARE])
show(sol[kv])
# Showing the units of various variables
# Use .full_simplify()._convert(RR) to provide simplified results
show(sol[kv].full_simplify()._convert(RR))
show(hole.full_simplify()._convert(RR))
show((sol[kv]/hole).full_simplify()._convert(RR) ) # this should be dimensionless
# This final result is now dimensionless, as desired.
I am still playing around, but the main idea is define one's own units (as shown at the beginning of the above example) using "domain" and "assume" to ensure they are positive real. Methods such as ".full_simplify()" and "._convert(RR)" can then be used to produce simple numerical results with all the units correctly cancelled out.
Copyright Sage, 2010. Some rights reserved under creative commons license. Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.