72 lines
1.8 KiB
Python
72 lines
1.8 KiB
Python
import re
|
|
from sympy.concrete.products import product
|
|
from sympy.concrete.summations import Sum
|
|
from sympy.core.sympify import sympify
|
|
from sympy.functions.elementary.trigonometric import (cos, sin)
|
|
|
|
|
|
class MaximaHelpers:
|
|
def maxima_expand(expr):
|
|
return expr.expand()
|
|
|
|
def maxima_float(expr):
|
|
return expr.evalf()
|
|
|
|
def maxima_trigexpand(expr):
|
|
return expr.expand(trig=True)
|
|
|
|
def maxima_sum(a1, a2, a3, a4):
|
|
return Sum(a1, (a2, a3, a4)).doit()
|
|
|
|
def maxima_product(a1, a2, a3, a4):
|
|
return product(a1, (a2, a3, a4))
|
|
|
|
def maxima_csc(expr):
|
|
return 1/sin(expr)
|
|
|
|
def maxima_sec(expr):
|
|
return 1/cos(expr)
|
|
|
|
sub_dict = {
|
|
'pi': re.compile(r'%pi'),
|
|
'E': re.compile(r'%e'),
|
|
'I': re.compile(r'%i'),
|
|
'**': re.compile(r'\^'),
|
|
'oo': re.compile(r'\binf\b'),
|
|
'-oo': re.compile(r'\bminf\b'),
|
|
"'-'": re.compile(r'\bminus\b'),
|
|
'maxima_expand': re.compile(r'\bexpand\b'),
|
|
'maxima_float': re.compile(r'\bfloat\b'),
|
|
'maxima_trigexpand': re.compile(r'\btrigexpand'),
|
|
'maxima_sum': re.compile(r'\bsum\b'),
|
|
'maxima_product': re.compile(r'\bproduct\b'),
|
|
'cancel': re.compile(r'\bratsimp\b'),
|
|
'maxima_csc': re.compile(r'\bcsc\b'),
|
|
'maxima_sec': re.compile(r'\bsec\b')
|
|
}
|
|
|
|
var_name = re.compile(r'^\s*(\w+)\s*:')
|
|
|
|
|
|
def parse_maxima(str, globals=None, name_dict={}):
|
|
str = str.strip()
|
|
str = str.rstrip('; ')
|
|
|
|
for k, v in sub_dict.items():
|
|
str = v.sub(k, str)
|
|
|
|
assign_var = None
|
|
var_match = var_name.search(str)
|
|
if var_match:
|
|
assign_var = var_match.group(1)
|
|
str = str[var_match.end():].strip()
|
|
|
|
dct = MaximaHelpers.__dict__.copy()
|
|
dct.update(name_dict)
|
|
obj = sympify(str, locals=dct)
|
|
|
|
if assign_var and globals:
|
|
globals[assign_var] = obj
|
|
|
|
return obj
|