AUTHOR: Timothy Clemans, [email protected]
Support for elementary mathematics in SAGE is currently very limited. I have done little bit of work on supporting equations for Python. I want to create a pure Python library of classes around expressions and equations. This way it could be included in SAGE, [http://code.google.com/p/sympy/ Sympy], and a standalone web server package just for elementary mathematics education.
The lead implementer of basic symbolic computation in SAGE is Bobby Moretti. He will be giving a short [http://sage.math.washington.edu/home/moretti/days3/talks/calculus.pdf talk] on work in this area at SAGE Days 3. Neither SAGE nor Sympy support equations.
I started trying to support equations in SAGE using strings. That is a very bad idea and string input should be parsed at the interface level. Personally I think a Python Elementary Algebra package should be composed of several hundred classes. Examples of these classes could be variable, independent variable, dependent variable, coefficient, term, expression, equation, linear equation, equation_of_line, equation_of_line_in_slope_intercept_form, or quadratic equation class.
For example lets say you have the following system of linear equations that you want to solve using elimination:
- (equation1) 2*x + 3*y = 1
- (equation2) -x + y = -3
class line_equation_in_general_form(object):
def __init__(self,A,B,C):
self.A = A
self.B = B
self.C = C
def __str__(self):
return '%dx + %dy == %d' % (self.A,self.B,self.C)
__repr__ = __str__
def __add__(self,other):
return self.__class__(self.A+other.A,self.B+other.B,self.C+other.C)
def __mul__(self,n):
return self.__class__(self.A*n,self.B*n,self.C*n)equation1 = line_equation_in_general_form(2,3,1) equation2 = line_equation_in_general_form(-1,1,-3) equation1 + equation2*2
0x + 5y == -5
Another example is about building terms, which could lead to expressions and in turn equations.
class Term(object):
def __init__(self,coefficient,variable_degree_dictionary):
self.coefficient = coefficient
self.vdd_input = variable_degree_dictionary
self.variable_degree_pairs = []
for each_variable_key in sorted(self.vdd_input):
if self.vdd_input[each_variable_key] != 0:
self.variable_degree_pairs.append((each_variable_key,self.vdd_input[each_variable_key]))
def __str__(self):
string = str(self.coefficient)
for i in range(len(self.variable_degree_pairs)):
if self.variable_degree_pairs[i][1] == 1:
string += '*%s' % (str(self.variable_degree_pairs[i][0]))
else:
string += '*%s**%s' % (str(self.variable_degree_pairs[i][0]),str(self.variable_degree_pairs[i][1]))
return string
__repr__ = __str__
def __add__(self,other):
if self.variable_degree_pairs == other.variable_degree_pairs:
if type(self.coefficient) == int or type(self.coefficient) == float:
if type(other.coefficient) == int or type(other.coefficient) == float:
return Term(self.coefficient + other.coefficient,self.vdd_input)term1 = Term(3,{'y':3,'x':1}); term13*x*y**3
term2 = Term(7,{'x':1,'y':3}); term27*x*y**3
term1 + term2
10*x*y**3
So I'm trying to build a Python elementary mathematics package not a SAGE package. I will probably look at supporting classification of numbers by natural, integer, rational, real, and complex in a subset setup allowing the teacher to restrict her students by grade level.
