Exemplo n.º 1
0
def test_issue_4825():
    raises(ValueError, lambda: dsolve(f(x, y).diff(x) - y * f(x, y), f(x)))
    assert classify_ode(f(x, y).diff(x) - y*f(x, y), f(x), dict=True) == \
        {'order': 0, 'default': None, 'ordered_hints': ()}
    # See also issue 3793, test Z13.
    raises(ValueError, lambda: dsolve(f(x).diff(x), f(y)))
    assert classify_ode(f(x).diff(x), f(y), dict=True) == \
        {'order': 0, 'default': None, 'ordered_hints': ()}
Exemplo n.º 2
0
def test_2nd_power_series_ordinary():
    C1, C2 = symbols("C1 C2")

    eq = f(x).diff(x, 2) - x * f(x)
    assert classify_ode(eq) == ('2nd_linear_airy', '2nd_power_series_ordinary')
    sol = Eq(f(x), C2 * (x**3 / 6 + 1) + C1 * x * (x**3 / 12 + 1) + O(x**6))
    assert dsolve(eq, hint='2nd_power_series_ordinary') == sol
    assert checkodesol(eq, sol) == (True, 0)

    sol = Eq(
        f(x),
        C2 * ((x + 2)**4 / 6 + (x + 2)**3 / 6 - (x + 2)**2 + 1) + C1 *
        (x + (x + 2)**4 / 12 - (x + 2)**3 / 3 + S(2)) + O(x**6))
    assert dsolve(eq, hint='2nd_power_series_ordinary', x0=-2) == sol
    # FIXME: Solution should be O((x+2)**6)
    # assert checkodesol(eq, sol) == (True, 0)

    sol = Eq(f(x), C2 * x + C1 + O(x**2))
    assert dsolve(eq, hint='2nd_power_series_ordinary', n=2) == sol
    assert checkodesol(eq, sol) == (True, 0)

    eq = (1 + x**2) * (f(x).diff(x, 2)) + 2 * x * (f(x).diff(x)) - 2 * f(x)
    assert classify_ode(eq) == ('2nd_hypergeometric',
                                '2nd_hypergeometric_Integral',
                                '2nd_power_series_ordinary')

    sol = Eq(f(x), C2 * (-x**4 / 3 + x**2 + 1) + C1 * x + O(x**6))
    assert dsolve(eq, hint='2nd_power_series_ordinary') == sol
    assert checkodesol(eq, sol) == (True, 0)

    eq = f(x).diff(x, 2) + x * (f(x).diff(x)) + f(x)
    assert classify_ode(eq) == ('2nd_power_series_ordinary', )
    sol = Eq(
        f(x),
        C2 * (x**4 / 8 - x**2 / 2 + 1) + C1 * x * (-x**2 / 3 + 1) + O(x**6))
    assert dsolve(eq) == sol
    # FIXME: checkodesol fails for this solution...
    # assert checkodesol(eq, sol) == (True, 0)

    eq = f(x).diff(x, 2) + f(x).diff(x) - x * f(x)
    assert classify_ode(eq) == ('2nd_power_series_ordinary', )
    sol = Eq(
        f(x),
        C2 * (-x**4 / 24 + x**3 / 6 + 1) + C1 * x *
        (x**3 / 24 + x**2 / 6 - x / 2 + 1) + O(x**6))
    assert dsolve(eq) == sol
    # FIXME: checkodesol fails for this solution...
    # assert checkodesol(eq, sol) == (True, 0)

    eq = f(x).diff(x, 2) + x * f(x)
    assert classify_ode(eq) == ('2nd_linear_airy', '2nd_power_series_ordinary')
    sol = Eq(
        f(x),
        C2 * (x**6 / 180 - x**3 / 6 + 1) + C1 * x * (-x**3 / 12 + 1) + O(x**7))
    assert dsolve(eq, hint='2nd_power_series_ordinary', n=7) == sol
    assert checkodesol(eq, sol) == (True, 0)
Exemplo n.º 3
0
def test_nth_order_linear_euler_eq_nonhomogeneous_undetermined_coefficients():
    x, t = symbols('x t')
    a, b, c, d = symbols('a b c d', integer=True)
    our_hint = "nth_linear_euler_eq_nonhomogeneous_undetermined_coefficients"

    eq = x**4*diff(f(x), x, 4) - 13*x**2*diff(f(x), x, 2) + 36*f(x) + x
    assert our_hint in classify_ode(eq, f(x))

    eq = a*x**2*diff(f(x), x, 2) + b*x*diff(f(x), x) + c*f(x) + d*log(x)
    assert our_hint in classify_ode(eq, f(x))

    _ode_solver_test(_get_examples_ode_sol_euler_undetermined_coeff())
Exemplo n.º 4
0
def test_Liouville_ODE():
    hint = 'Liouville'
    not_Liouville1 = classify_ode(diff(f(x), x)/x + f(x)*diff(f(x), x, x)/2 -
        diff(f(x), x)**2/2, f(x))
    not_Liouville2 = classify_ode(diff(f(x), x)/x + diff(f(x), x, x)/2 -
        x*diff(f(x), x)**2/2, f(x))
    assert hint not in not_Liouville1
    assert hint not in not_Liouville2
    assert hint + '_Integral' not in not_Liouville1
    assert hint + '_Integral' not in not_Liouville2

    _ode_solver_test(_get_examples_ode_sol_liouville())
Exemplo n.º 5
0
def test_nth_order_linear_euler_eq_homogeneous():
    x, t, a, b, c = symbols('x t a b c')
    y = Function('y')
    our_hint = "nth_linear_euler_eq_homogeneous"

    eq = diff(f(t), t, 4) * t**4 - 13 * diff(f(t), t, 2) * t**2 + 36 * f(t)
    assert our_hint in classify_ode(eq)

    eq = a * y(t) + b * t * diff(y(t), t) + c * t**2 * diff(y(t), t, 2)
    assert our_hint in classify_ode(eq)

    _ode_solver_test(_get_examples_ode_sol_euler_homogeneous())
Exemplo n.º 6
0
def test_nth_order_linear_euler_eq_nonhomogeneous_variation_of_parameters():
    x, t = symbols('x, t')
    a, b, c, d = symbols('a, b, c, d', integer=True)
    our_hint = "nth_linear_euler_eq_nonhomogeneous_variation_of_parameters"

    eq = Eq(x**2*diff(f(x),x,2) - 8*x*diff(f(x),x) + 12*f(x), x**2)
    assert our_hint in classify_ode(eq, f(x))

    eq = Eq(a*x**3*diff(f(x),x,3) + b*x**2*diff(f(x),x,2) + c*x*diff(f(x),x) + d*f(x), x*log(x))
    assert our_hint in classify_ode(eq, f(x))

    _ode_solver_test(_get_examples_ode_sol_euler_var_para())
Exemplo n.º 7
0
def test_issue_23425():
    x = symbols('x')
    y = Function('y')
    eq = Eq(-E**x*y(x).diff().diff() + y(x).diff(), 0)
    assert classify_ode(eq) == \
        ('Liouville', 'nth_order_reducible', \
        '2nd_power_series_ordinary', 'Liouville_Integral')
Exemplo n.º 8
0
def test_issue_4785():
    from sympy.abc import A
    eq = x + A*(x + diff(f(x), x) + f(x)) + diff(f(x), x) + f(x) + 2
    assert classify_ode(eq, f(x)) == ('1st_exact', '1st_linear',
        'almost_linear', '1st_power_series', 'lie_group',
        'nth_linear_constant_coeff_undetermined_coefficients',
        'nth_linear_constant_coeff_variation_of_parameters',
        '1st_exact_Integral', '1st_linear_Integral', 'almost_linear_Integral',
        'nth_linear_constant_coeff_variation_of_parameters_Integral')
    # issue 4864
    eq = (x**2 + f(x)**2)*f(x).diff(x) - 2*x*f(x)
    assert classify_ode(eq, f(x)) == ('1st_exact',
        '1st_homogeneous_coeff_best',
        '1st_homogeneous_coeff_subs_indep_div_dep',
        '1st_homogeneous_coeff_subs_dep_div_indep',
        '1st_power_series',
        'lie_group', '1st_exact_Integral',
        '1st_homogeneous_coeff_subs_indep_div_dep_Integral',
        '1st_homogeneous_coeff_subs_dep_div_indep_Integral')
Exemplo n.º 9
0
def _test_all_examples_for_one_hint(our_hint, all_examples=[], runxfail=None):
    if all_examples == []:
        all_examples = _get_all_examples()
    match_list, unsolve_list, exception_list = [], [], []
    for ode_example in all_examples:
        eq = ode_example['eq']
        expected_sol = ode_example['sol']
        example = ode_example['example_name']
        xfail = our_hint in ode_example['XFAIL']
        xpass = True
        if runxfail and not xfail:
            continue
        if our_hint in classify_ode(eq):
            match_list.append(example)
            try:
                dsolve_sol = dsolve(eq, hint=our_hint)
                expected_checkodesol = [(True, 0)
                                        for i in range(len(expected_sol))]
                if len(expected_sol) == 1:
                    expected_checkodesol = (True, 0)

                if checkodesol(eq, dsolve_sol) != expected_checkodesol:
                    unsolve_list.append(example)
                    message = dsol_incorrect_msg.format(hint=our_hint,
                                                        eq=eq,
                                                        sol=expected_sol,
                                                        dsolve_sol=dsolve_sol)
                    if runxfail is not None:
                        raise AssertionError(message)
            except Exception as e:
                exception_list.append(example)
                if runxfail is not None:
                    print(
                        exception_msg.format(e=str(e),
                                             hint=our_hint,
                                             example=example,
                                             eq=eq))
                    traceback.print_exc()
                xpass = False
        if xpass and xfail:
            print(example, "is now passing for the hint", our_hint)
    if runxfail is None:
        match_count = len(match_list)
        solved = len(match_list) - len(unsolve_list) - len(exception_list)
        msg = check_hint_msg.format(hint=our_hint,
                                    matched=match_count,
                                    solve=solved,
                                    unsolve=unsolve_list,
                                    exceptions=exception_list)
        print(msg)
Exemplo n.º 10
0
def test_issue_22523():
    N, s = symbols('N s')
    rho = Function('rho')
    # intentionally use 4.0 to confirm issue with nfloat
    # works here
    eqn = 4.0*N*sqrt(N - 1)*rho(s) + (4*s**2*(N - 1) + (N - 2*s*(N - 1))**2
        )*Derivative(rho(s), (s, 2))
    match = classify_ode(eqn, dict=True, hint='all')
    assert match['2nd_power_series_ordinary']['terms'] == 5
    C1, C2 = symbols('C1,C2')
    sol = dsolve(eqn, hint='2nd_power_series_ordinary')
    # there is no r(2.0) in this result
    assert filldedent(sol) == filldedent(str('''
        Eq(rho(s), C2*(1 - 4.0*s**4*sqrt(N - 1.0)/N + 0.666666666666667*s**4/N
        - 2.66666666666667*s**3*sqrt(N - 1.0)/N - 2.0*s**2*sqrt(N - 1.0)/N +
        9.33333333333333*s**4*sqrt(N - 1.0)/N**2 - 0.666666666666667*s**4/N**2
        + 2.66666666666667*s**3*sqrt(N - 1.0)/N**2 -
        5.33333333333333*s**4*sqrt(N - 1.0)/N**3) + C1*s*(1.0 -
        1.33333333333333*s**3*sqrt(N - 1.0)/N - 0.666666666666667*s**2*sqrt(N
        - 1.0)/N + 1.33333333333333*s**3*sqrt(N - 1.0)/N**2) + O(s**6))'''))
Exemplo n.º 11
0
def _ode_solver_test(ode_examples):
    our_hint = ode_examples['hint']
    for example in ode_examples['examples']:
        eq = ode_examples['examples'][example]['eq']
        sol = ode_examples['examples'][example]['sol']
        if our_hint not in classify_ode(eq):
            message = hint_message.format(example=example,
                                          eq=eq,
                                          our_hint=our_hint)
            raise AssertionError(message)

        dsolve_sol = dsolve(eq, hint=our_hint)
        if dsolve_sol not in sol:
            message = expected_sol_message.format(example=example,
                                                  eq=eq,
                                                  sol=sol,
                                                  dsolve_sol=dsolve_sol)
            raise AssertionError(message)

        expected_checkodesol = [(True, 0) for i in range(len(sol))]
        if checkodesol(eq, sol) != expected_checkodesol:
            message = checkodesol.format(example=example, eq=eq)
            raise AssertionError(message)
Exemplo n.º 12
0
def test_classify_ode_ics():
    # Dummy
    eq = f(x).diff(x, x) - f(x)

    # Not f(0) or f'(0)
    ics = {x: 1}
    raises(ValueError, lambda: classify_ode(eq, f(x), ics=ics))

    ############################
    # f(0) type (AppliedUndef) #
    ############################

    # Wrong function
    ics = {g(0): 1}
    raises(ValueError, lambda: classify_ode(eq, f(x), ics=ics))

    # Contains x
    ics = {f(x): 1}
    raises(ValueError, lambda: classify_ode(eq, f(x), ics=ics))

    # Too many args
    ics = {f(0, 0): 1}
    raises(ValueError, lambda: classify_ode(eq, f(x), ics=ics))

    # point contains f
    # XXX: Should be NotImplementedError
    ics = {f(0): f(1)}
    raises(ValueError, lambda: classify_ode(eq, f(x), ics=ics))

    # Does not raise
    ics = {f(0): 1}
    classify_ode(eq, f(x), ics=ics)

    #####################
    # f'(0) type (Subs) #
    #####################

    # Wrong function
    ics = {g(x).diff(x).subs(x, 0): 1}
    raises(ValueError, lambda: classify_ode(eq, f(x), ics=ics))

    # Contains x
    ics = {f(y).diff(y).subs(y, x): 1}
    raises(ValueError, lambda: classify_ode(eq, f(x), ics=ics))

    # Wrong variable
    ics = {f(y).diff(y).subs(y, 0): 1}
    raises(ValueError, lambda: classify_ode(eq, f(x), ics=ics))

    # Too many args
    ics = {f(x, y).diff(x).subs(x, 0): 1}
    raises(ValueError, lambda: classify_ode(eq, f(x), ics=ics))

    # Derivative wrt wrong vars
    ics = {Derivative(f(x), x, y).subs(x, 0): 1}
    raises(ValueError, lambda: classify_ode(eq, f(x), ics=ics))

    # point contains f
    # XXX: Should be NotImplementedError
    ics = {f(x).diff(x).subs(x, 0): f(0)}
    raises(ValueError, lambda: classify_ode(eq, f(x), ics=ics))

    # Does not raise
    ics = {f(x).diff(x).subs(x, 0): 1}
    classify_ode(eq, f(x), ics=ics)

    ###########################
    # f'(y) type (Derivative) #
    ###########################

    # Wrong function
    ics = {g(x).diff(x).subs(x, y): 1}
    raises(ValueError, lambda: classify_ode(eq, f(x), ics=ics))

    # Contains x
    ics = {f(y).diff(y).subs(y, x): 1}
    raises(ValueError, lambda: classify_ode(eq, f(x), ics=ics))

    # Too many args
    ics = {f(x, y).diff(x).subs(x, y): 1}
    raises(ValueError, lambda: classify_ode(eq, f(x), ics=ics))

    # Derivative wrt wrong vars
    ics = {Derivative(f(x), x, z).subs(x, y): 1}
    raises(ValueError, lambda: classify_ode(eq, f(x), ics=ics))

    # point contains f
    # XXX: Should be NotImplementedError
    ics = {f(x).diff(x).subs(x, y): f(0)}
    raises(ValueError, lambda: classify_ode(eq, f(x), ics=ics))

    # Does not raise
    ics = {f(x).diff(x).subs(x, y): 1}
    classify_ode(eq, f(x), ics=ics)
Exemplo n.º 13
0
def test_classify_ode():
    assert classify_ode(f(x).diff(x, 2), f(x)) == \
        (
        'nth_algebraic',
        'nth_linear_constant_coeff_homogeneous',
        'nth_linear_euler_eq_homogeneous',
        'Liouville',
        '2nd_power_series_ordinary',
        'nth_algebraic_Integral',
        'Liouville_Integral',
        )
    assert classify_ode(f(x),
                        f(x)) == ('nth_algebraic', 'nth_algebraic_Integral')
    assert classify_ode(
        Eq(f(x).diff(x), 0),
        f(x)) == ('nth_algebraic', 'separable', '1st_exact', '1st_linear',
                  'Bernoulli', '1st_homogeneous_coeff_best',
                  '1st_homogeneous_coeff_subs_indep_div_dep',
                  '1st_homogeneous_coeff_subs_dep_div_indep',
                  '1st_power_series', 'lie_group',
                  'nth_linear_constant_coeff_homogeneous',
                  'nth_linear_euler_eq_homogeneous', 'nth_algebraic_Integral',
                  'separable_Integral', '1st_exact_Integral',
                  '1st_linear_Integral', 'Bernoulli_Integral',
                  '1st_homogeneous_coeff_subs_indep_div_dep_Integral',
                  '1st_homogeneous_coeff_subs_dep_div_indep_Integral')
    assert classify_ode(
        f(x).diff(x)**2,
        f(x)) == ('factorable', 'nth_algebraic', 'separable', '1st_exact',
                  '1st_linear', 'Bernoulli', '1st_homogeneous_coeff_best',
                  '1st_homogeneous_coeff_subs_indep_div_dep',
                  '1st_homogeneous_coeff_subs_dep_div_indep',
                  '1st_power_series', 'lie_group',
                  'nth_linear_euler_eq_homogeneous', 'nth_algebraic_Integral',
                  'separable_Integral', '1st_exact_Integral',
                  '1st_linear_Integral', 'Bernoulli_Integral',
                  '1st_homogeneous_coeff_subs_indep_div_dep_Integral',
                  '1st_homogeneous_coeff_subs_dep_div_indep_Integral')
    # issue 4749: f(x) should be cleared from highest derivative before classifying
    a = classify_ode(Eq(f(x).diff(x) + f(x), x), f(x))
    b = classify_ode(f(x).diff(x) * f(x) + f(x) * f(x) - x * f(x), f(x))
    c = classify_ode(f(x).diff(x) / f(x) + f(x) / f(x) - x / f(x), f(x))
    assert a == ('1st_exact', '1st_linear', 'Bernoulli', 'almost_linear',
                 '1st_power_series', "lie_group",
                 'nth_linear_constant_coeff_undetermined_coefficients',
                 'nth_linear_constant_coeff_variation_of_parameters',
                 '1st_exact_Integral', '1st_linear_Integral',
                 'Bernoulli_Integral', 'almost_linear_Integral',
                 'nth_linear_constant_coeff_variation_of_parameters_Integral')
    assert b == ('factorable', '1st_linear', 'Bernoulli', '1st_power_series',
                 'lie_group',
                 'nth_linear_constant_coeff_undetermined_coefficients',
                 'nth_linear_constant_coeff_variation_of_parameters',
                 '1st_linear_Integral', 'Bernoulli_Integral',
                 'nth_linear_constant_coeff_variation_of_parameters_Integral')
    assert c == ('1st_linear', 'Bernoulli', '1st_power_series', 'lie_group',
                 'nth_linear_constant_coeff_undetermined_coefficients',
                 'nth_linear_constant_coeff_variation_of_parameters',
                 '1st_linear_Integral', 'Bernoulli_Integral',
                 'nth_linear_constant_coeff_variation_of_parameters_Integral')

    assert classify_ode(
        2 * x * f(x) * f(x).diff(x) + (1 + x) * f(x)**2 - exp(x),
        f(x)) == ('1st_exact', 'Bernoulli', 'almost_linear', 'lie_group',
                  '1st_exact_Integral', 'Bernoulli_Integral',
                  'almost_linear_Integral')
    assert 'Riccati_special_minus2' in \
        classify_ode(2*f(x).diff(x) + f(x)**2 - f(x)/x + 3*x**(-2), f(x))
    raises(ValueError,
           lambda: classify_ode(x + f(x, y).diff(x).diff(y), f(x, y)))
    # issue 5176
    k = Symbol('k')
    assert classify_ode(f(x).diff(x)/(k*f(x) + k*x*f(x)) + 2*f(x)/(k*f(x) +
        k*x*f(x)) + x*f(x).diff(x)/(k*f(x) + k*x*f(x)) + z, f(x)) == \
        ('separable', '1st_exact', '1st_linear', 'Bernoulli',
        '1st_power_series', 'lie_group', 'separable_Integral', '1st_exact_Integral',
        '1st_linear_Integral', 'Bernoulli_Integral')
    # preprocessing
    ans = (
        'nth_algebraic', 'separable', '1st_exact', '1st_linear', 'Bernoulli',
        '1st_homogeneous_coeff_best',
        '1st_homogeneous_coeff_subs_indep_div_dep',
        '1st_homogeneous_coeff_subs_dep_div_indep', '1st_power_series',
        'lie_group', 'nth_linear_constant_coeff_undetermined_coefficients',
        'nth_linear_euler_eq_nonhomogeneous_undetermined_coefficients',
        'nth_linear_constant_coeff_variation_of_parameters',
        'nth_linear_euler_eq_nonhomogeneous_variation_of_parameters',
        'nth_algebraic_Integral', 'separable_Integral', '1st_exact_Integral',
        '1st_linear_Integral', 'Bernoulli_Integral',
        '1st_homogeneous_coeff_subs_indep_div_dep_Integral',
        '1st_homogeneous_coeff_subs_dep_div_indep_Integral',
        'nth_linear_constant_coeff_variation_of_parameters_Integral',
        'nth_linear_euler_eq_nonhomogeneous_variation_of_parameters_Integral')
    #     w/o f(x) given
    assert classify_ode(diff(f(x) + x, x) + diff(f(x), x)) == ans
    #     w/ f(x) and prep=True
    assert classify_ode(diff(f(x) + x, x) + diff(f(x), x), f(x),
                        prep=True) == ans

    assert classify_ode(Eq(2*x**3*f(x).diff(x), 0), f(x)) == \
        ('factorable', 'nth_algebraic', 'separable', '1st_exact',
         '1st_linear', 'Bernoulli', '1st_power_series',
         'lie_group', 'nth_linear_euler_eq_homogeneous',
         'nth_algebraic_Integral', 'separable_Integral', '1st_exact_Integral',
         '1st_linear_Integral', 'Bernoulli_Integral')


    assert classify_ode(Eq(2*f(x)**3*f(x).diff(x), 0), f(x)) == \
        ('factorable', 'nth_algebraic', 'separable', '1st_exact', '1st_linear',
         'Bernoulli', '1st_power_series', 'lie_group', 'nth_algebraic_Integral',
         'separable_Integral', '1st_exact_Integral', '1st_linear_Integral',
         'Bernoulli_Integral')
    # test issue 13864
    assert classify_ode(Eq(diff(f(x), x) - f(x)**x, 0), f(x)) == \
        ('1st_power_series', 'lie_group')
    assert isinstance(classify_ode(Eq(f(x), 5), f(x), dict=True), dict)

    #This is for new behavior of classify_ode when called internally with default, It should
    # return the first hint which matches therefore, 'ordered_hints' key will not be there.
    assert sorted(classify_ode(Eq(f(x).diff(x), 0), f(x), dict=True).keys()) == \
        ['default', 'nth_algebraic', 'nth_algebraic_Integral', 'order']
    a = classify_ode(2 * x * f(x) * f(x).diff(x) + (1 + x) * f(x)**2 - exp(x),
                     f(x),
                     dict=True,
                     hint='Bernoulli')
    assert sorted(a.keys()) == [
        'Bernoulli', 'Bernoulli_Integral', 'default', 'order', 'ordered_hints'
    ]
Exemplo n.º 14
0
def test_lie_group_issue15219():
    eqn = exp(f(x).diff(x) - f(x))
    assert 'lie_group' not in classify_ode(eqn, f(x))
Exemplo n.º 15
0
def _test_particular_example(our_hint,
                             ode_example=None,
                             solver_flag=False,
                             example_name=None):
    if example_name is not None:
        all_examples = _get_all_examples()
        for example in all_examples:
            if example['example_name'] == example_name:
                eq = example['eq']
                dsolve(eq, hint=our_hint)
    else:
        eq = ode_example['eq']
        expected_sol = ode_example['sol']
        example = ode_example['example_name']
        xfail = our_hint in ode_example['XFAIL']
        func = ode_example['func']
        result = {'msg': '', 'xpass_msg': ''}
        xpass = True
        if solver_flag:
            if our_hint not in classify_ode(eq, func):
                message = hint_message.format(example=example,
                                              eq=eq,
                                              our_hint=our_hint)
                raise AssertionError(message)

        if our_hint in classify_ode(eq, func):
            result['match_list'] = example
            try:
                dsolve_sol = dsolve(eq, func, hint=our_hint)
                if solver_flag:
                    expect_sol_check = False
                    if type(dsolve_sol) == list:
                        if any(sub_sol not in dsolve_sol
                               for sub_sol in expected_sol):
                            expect_sol_check = True
                    else:
                        expect_sol_check = dsolve_sol not in expected_sol
                    if expect_sol_check:
                        message = expected_sol_message.format(
                            example=example,
                            eq=eq,
                            sol=expected_sol,
                            dsolve_sol=dsolve_sol)
                        raise AssertionError(message)

                expected_checkodesol = [(True, 0)
                                        for i in range(len(expected_sol))]
                if len(expected_sol) == 1:
                    expected_checkodesol = (True, 0)

                if checkodesol(eq, dsolve_sol) != expected_checkodesol:
                    result['unsolve_list'] = example
                    xpass = False
                    message = dsol_incorrect_msg.format(hint=our_hint,
                                                        eq=eq,
                                                        sol=expected_sol,
                                                        dsolve_sol=dsolve_sol)
                    if solver_flag:
                        message = checkodesol.format(example=example, eq=eq)
                        raise AssertionError(message)
                    else:
                        result['msg'] = 'AssertionError: ' + message
            except Exception as e:
                result['exception_list'] = example
                if not solver_flag:
                    traceback.print_exc()
                    result['msg'] = exception_msg.format(e=str(e),
                                                         hint=our_hint,
                                                         example=example,
                                                         eq=eq)
                xpass = False
        if xpass and xfail:
            result[
                'xpass_msg'] = example + "is now passing for the hint" + our_hint
        return result
Exemplo n.º 16
0
def _test_particular_example(our_hint, ode_example, solver_flag=False):
    eq = ode_example['eq']
    expected_sol = ode_example['sol']
    example = ode_example['example_name']
    xfail = our_hint in ode_example['XFAIL']
    func = ode_example['func']
    result = {'msg': '', 'xpass_msg': ''}
    checkodesol_XFAIL = ode_example['checkodesol_XFAIL']
    xpass = True
    if solver_flag:
        if our_hint not in classify_ode(eq, func):
            message = hint_message.format(example=example, eq=eq, our_hint=our_hint)
            raise AssertionError(message)

    if our_hint in classify_ode(eq, func):
        result['match_list'] = example
        try:
            dsolve_sol = dsolve(eq, func, hint=our_hint)

        except Exception as e:
            dsolve_sol = []
            result['exception_list'] = example
            if not solver_flag:
                traceback.print_exc()
                result['msg'] = exception_msg.format(e=str(e), hint=our_hint, example=example, eq=eq)
            xpass = False

        if solver_flag and dsolve_sol!=[]:
            expect_sol_check = False
            if type(dsolve_sol)==list:
                for sub_sol in expected_sol:
                    if sub_sol.has(Dummy):
                        expect_sol_check = not _test_dummy_sol(sub_sol, dsolve_sol)
                    else:
                        expect_sol_check = sub_sol not in dsolve_sol
                    if expect_sol_check:
                        break
            else:
                expect_sol_check = dsolve_sol not in expected_sol
                for sub_sol in expected_sol:
                    if sub_sol.has(Dummy):
                        expect_sol_check = not _test_dummy_sol(sub_sol, dsolve_sol)

            if expect_sol_check:
                message = expected_sol_message.format(example=example, eq=eq, sol=expected_sol, dsolve_sol=dsolve_sol)
                raise AssertionError(message)

            expected_checkodesol = [(True, 0) for i in range(len(expected_sol))]
            if len(expected_sol) == 1:
                expected_checkodesol = (True, 0)

            if not checkodesol_XFAIL:
                if checkodesol(eq, dsolve_sol, solve_for_func=False) != expected_checkodesol:
                    result['unsolve_list'] = example
                    xpass = False
                    message = dsol_incorrect_msg.format(hint=our_hint, eq=eq, sol=expected_sol,dsolve_sol=dsolve_sol)
                    if solver_flag:
                        message = checkodesol_msg.format(example=example, eq=eq)
                        raise AssertionError(message)
                    else:
                        result['msg'] = 'AssertionError: ' + message

        if xpass and xfail:
            result['xpass_msg'] = example + "is now passing for the hint" + our_hint
    return result
Exemplo n.º 17
0
def test_issue_22462():
    for de in [
            Eq(f(x).diff(x), -20*f(x)**2 - 500*f(x)/7200),
            Eq(f(x).diff(x), -2*f(x)**2 - 5*f(x)/7)]:
        assert 'Bernoulli' in classify_ode(de, f(x))