示例#1
0
 def testSubstitution2(self):
     e = parse_expr("INT x:[0,1]. exp(6*x)")
     e = rules.Substitution1("u", parse_expr("6 * x")).eval(e)
     e = rules.Linearity().eval(e)
     e = rules.OnSubterm(rules.CommonIntegral()).eval(e)
     e = rules.Simplify().eval(e)
     self.assertEqual(str(e.normalize()), "-1/6 + 1/6 * exp(6)")
示例#2
0
 def testSubstitution(self):
     e = parse_expr("INT x:[0,1]. (3 * x + 1) ^ (-2)")
     e = rules.Substitution1("u", parse_expr("3 * x + 1")).eval(e)
     e = rules.Linearity().eval(e)
     e = rules.OnSubterm(rules.CommonIntegral()).eval(e)
     e = rules.Simplify().eval(e)
     self.assertEqual(e, Const(Fraction("1/4")))
示例#3
0
 def testSubstitution6(self):
     e = parse_expr("INT x:[-2, 0]. (x + 2)/(x^2 + 2*x + 2)")
     e.body = rules.Equation(
         e.body, parse_expr("((x+1) + 1)/((x+1)*(x+1) + 1)")).eval(e.body)
     e = rules.Substitution1("u", parse_expr("x+1")).eval(e)
     self.assertEqual(
         e,
         parse_expr(
             "INT u:[-1,1]. u * (2 * u + (-1 + u) ^ 2) ^ -1 + (2 * u + (-1 + u) ^ 2) ^ -1"
         ))
示例#4
0
def substitution(integral, subst):
    new_var = gen_rand_letter(integral.var)
    rule = rules.Substitution1(new_var, subst)
    new_e = rule.eval(integral)
    steps = [
        calc.SubstitutionStep(e=new_e,
                              var_name=new_var,
                              var_subst=subst,
                              f=rule.f,
                              loc=[])
    ]
    return new_e, steps
示例#5
0
 def testSubstitution10(self):
     e = parse_expr("INT x:[0, 441]. (pi * sin(pi*sqrt(x))) / sqrt(x)")
     e = rules.Substitution1("u", parse_expr("pi * sqrt(x)")).eval(e)
     self.assertEqual(e, parse_expr("INT u:[0,21 * pi]. 2 * sin(u)"))
示例#6
0
 def testSubstitution9(self):
     e = parse_expr("INT x:[1, exp(2)]. 1/(x * sqrt(1 + log(x)))")
     e = rules.Substitution1("u", parse_expr("1 + log(x)")).eval(e)
     self.assertEqual(e, parse_expr("INT u:[1,3]. u ^ (-1/2)"))
示例#7
0
 def testSubstitution8(self):
     e = parse_expr("INT x:[1, exp(1)]. sin(log(x))")
     e = rules.Substitution1("u", parse_expr("log(x)")).eval(e)
     self.assertEqual(e.normalize(),
                      parse_expr("INT u:[0,1]. exp(u) * sin(u)"))
示例#8
0
 def testSubstitution7(self):
     e = parse_expr("INT x:[3/4, 1]. 1/(sqrt(1-x) - 1)")
     e = rules.Substitution1("u", parse_expr("sqrt(1 - x)")).eval(e)
     self.assertEqual(str(e), "INT u:[0,1/2]. 2 * u * (-1 + u) ^ -1")
示例#9
0
 def testSubstitution5(self):
     e = parse_expr("INT t:[0, 1]. t * exp(-(t^2/2))")
     e = rules.Substitution1("u", parse_expr("-t^2/2")).eval(e)
     self.assertEqual(e, parse_expr("INT u:[-1/2,0]. exp(u)"))
示例#10
0
 def testSubstitution4(self):
     e = parse_expr("INT x:[1, 4]. 1/(1+sqrt(x))")
     e = rules.Substitution1("u", parse_expr("sqrt(x)")).eval(e)
     self.assertEqual(str(e), "INT u:[1,2]. 2 * u * (1 + u) ^ -1")
示例#11
0
 def testSubstitution3(self):
     e = parse_expr("INT x:[0, pi/2].sqrt(cos(x))*sin(x)")
     e = rules.Substitution1("u", parse_expr("cos(x)")).eval(e)
     self.assertEqual(e, parse_expr("INT u:[0,1]. sqrt(u)"))
示例#12
0
def perform_steps(node):
    """
    Perform the real solving steps. 
    """
    real_steps = []

    current = node.root

    for step in node.trace():
        loc = step.loc
        if step.reason == "Simplification":
            rule = rules.FullSimplify()
            current = rules.OnLocation(rule, loc).eval(current)
            real_steps.append({
                "text": str(current),
                "latex": latex.convert_expr(current),
                "reason": step.reason,
                "location": str(loc)
            })
        elif step.reason == "Substitution":
            rule = rules.Substitution1(step.var_name, step.var_subst)
            current = rules.OnLocation(rule, loc).eval(current)
            real_steps.append({
                "text": str(current),
                "latex": latex.convert_expr(current),
                "location": str(loc),
                "params": {
                    "f": str(step.f),
                    "g": str(step.var_subst),
                    "var_name": step.var_name
                },
                "_latex_reason": "Substitute \\(%s\\) for  \\(%s\\)" %\
                                    (latex.convert_expr(Var(step.var_name)), latex.convert_expr(step.var_subst)),
                "reason": step.reason
            })
        elif step.reason == "Integrate by parts":
            rule = rules.IntegrationByParts(step.u, step.v)
            current = rules.OnLocation(rule, loc).eval(current)
            real_steps.append({
                "text": str(current),
                "latex": latex.convert_expr(current),
                "location": str(loc),
                "reason": step.reason,
                "_latex_reason": "Integrate by parts, \\(u = %s, v = %s\\)" %\
                    (latex.convert_expr(step.u), latex.convert_expr(step.v)),
                "params": {
                    "parts_u": str(step.u),
                    "parts_v": str(step.v)
                }
            })
        elif step.reason == "Rewrite trigonometric":
            rule = rules.RewriteTrigonometric(step.rule_name)
            current = rules.OnLocation(rule, loc).eval(current)
            real_steps.append({
                "reason":
                step.reason,
                "text":
                str(current),
                "latex":
                latex.convert_expr(current),
                "params": {
                    "rule": step.rule_name
                },
                "_latex_reason":
                "Rewrite trigonometric \\(%s\\) to \\(%s\\)" %
                (latex.convert_expr(
                    step.before_trig), latex.convert_expr(step.after_trig)),
                # If there is only one integral in the full expression, location begins from the body;
                # Else from the integral
                "location":
                str(step.loc)
            })
        elif step.reason == "Elim abs":
            rule = rules.ElimAbs()
            current = rules.OnLocation(rule, loc).eval(current)
            info = {
                "reason": step.reason,
                "text": str(current),
                "latex": latex.convert_expr(current),
                "location": str(loc)
            }
            if step.zero_point is not None:
                info["params"] = {"c": str(step.zero_point)}
            real_steps.append(info)
        elif step.reason == "Substitution inverse":
            rule = rules.Substitution2(step.var_name, step.var_subst)
            current = rules.OnLocation(rule, loc).eval(current)
            real_steps.append({
                "text": str(current),
                "latex": latex.convert_expr(current),
                "_latex_reason": "Substitute \\(%s\\) for \\(%s\\)" % \
                                    (latex.convert_expr(Var(step.var_name)), latex.convert_expr(step.var_subst)),
                "reason": step.reason,
                "location": str(loc),
                "params": {
                    "a": str(step.e.lower),
                    "b": str(step.e.upper),
                    "g": str(step.var_subst),
                    "var_name": str(step.var_name)
                }
            })
        elif step.reason == "Unfold power":
            rule = rules.UnfoldPower()
            current = rules.OnLocation(rule, loc).eval(current)
            real_steps.append({
                "text": str(current),
                "latex": latex.convert_expr(current),
                "reason": "Unfold power",
                "location": str(loc)
            })
        elif step.reason == "Rewrite fraction":
            rule = rules.PolynomialDivision()
            current = rules.OnLocation(rule, loc).eval(current)
            real_steps.append({
                "text": str(current),
                "latex": latex.convert_expr(current),
                "reason": step.reason,
                "params": {
                    "rhs": str(step.rhs),
                    "denom": str(step.denom),
                },
                "location": str(step.loc)
            })
        elif step.reason == "Split region":
            rule = rules.SplitRegion(step.zero_point)
            current = rules.OnLocation(rule, loc).eval(current)
            real_steps.append({
                "text": str(current),
                "latex": latex.convert_expr(current),
                "reason": step.reason,
                "location": str(step.loc),
                "params": {
                    "c": str(step.zero_point)
                }
            })
        else:
            raise NotImplementedError(step.reason)

    last_expr = parse_expr(real_steps[-1]["text"])
    if last_expr.is_constant() and last_expr.normalize() == last_expr:
        return real_steps
    final_expr = rules.FullSimplify().eval(last_expr)
    real_steps.append({
        "text": str(final_expr),
        "latex": latex.convert_expr(final_expr),
        "reason": "Simplification",
        "location": "."
    })

    return real_steps