123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477 |
- from sympy.core.add import Add
- from sympy.core.function import (Function, expand)
- from sympy.core.numbers import (I, Rational, nan, oo, pi)
- from sympy.core.singleton import S
- from sympy.core.symbol import (Symbol, symbols)
- from sympy.functions.elementary.complexes import (conjugate, transpose)
- from sympy.functions.elementary.exponential import (exp, log)
- from sympy.functions.elementary.miscellaneous import sqrt
- from sympy.functions.elementary.trigonometric import (cos, sin)
- from sympy.integrals.integrals import Integral
- from sympy.series.order import O, Order
- from sympy.core.expr import unchanged
- from sympy.testing.pytest import raises
- from sympy.abc import w, x, y, z
- def test_caching_bug():
- #needs to be a first test, so that all caches are clean
- #cache it
- O(w)
- #and test that this won't raise an exception
- O(w**(-1/x/log(3)*log(5)), w)
- def test_free_symbols():
- assert Order(1).free_symbols == set()
- assert Order(x).free_symbols == {x}
- assert Order(1, x).free_symbols == {x}
- assert Order(x*y).free_symbols == {x, y}
- assert Order(x, x, y).free_symbols == {x, y}
- def test_simple_1():
- o = Rational(0)
- assert Order(2*x) == Order(x)
- assert Order(x)*3 == Order(x)
- assert -28*Order(x) == Order(x)
- assert Order(Order(x)) == Order(x)
- assert Order(Order(x), y) == Order(Order(x), x, y)
- assert Order(-23) == Order(1)
- assert Order(exp(x)) == Order(1, x)
- assert Order(exp(1/x)).expr == exp(1/x)
- assert Order(x*exp(1/x)).expr == x*exp(1/x)
- assert Order(x**(o/3)).expr == x**(o/3)
- assert Order(x**(o*Rational(5, 3))).expr == x**(o*Rational(5, 3))
- assert Order(x**2 + x + y, x) == O(1, x)
- assert Order(x**2 + x + y, y) == O(1, y)
- raises(ValueError, lambda: Order(exp(x), x, x))
- raises(TypeError, lambda: Order(x, 2 - x))
- def test_simple_2():
- assert Order(2*x)*x == Order(x**2)
- assert Order(2*x)/x == Order(1, x)
- assert Order(2*x)*x*exp(1/x) == Order(x**2*exp(1/x))
- assert (Order(2*x)*x*exp(1/x)/log(x)**3).expr == x**2*exp(1/x)*log(x)**-3
- def test_simple_3():
- assert Order(x) + x == Order(x)
- assert Order(x) + 2 == 2 + Order(x)
- assert Order(x) + x**2 == Order(x)
- assert Order(x) + 1/x == 1/x + Order(x)
- assert Order(1/x) + 1/x**2 == 1/x**2 + Order(1/x)
- assert Order(x) + exp(1/x) == Order(x) + exp(1/x)
- def test_simple_4():
- assert Order(x)**2 == Order(x**2)
- def test_simple_5():
- assert Order(x) + Order(x**2) == Order(x)
- assert Order(x) + Order(x**-2) == Order(x**-2)
- assert Order(x) + Order(1/x) == Order(1/x)
- def test_simple_6():
- assert Order(x) - Order(x) == Order(x)
- assert Order(x) + Order(1) == Order(1)
- assert Order(x) + Order(x**2) == Order(x)
- assert Order(1/x) + Order(1) == Order(1/x)
- assert Order(x) + Order(exp(1/x)) == Order(exp(1/x))
- assert Order(x**3) + Order(exp(2/x)) == Order(exp(2/x))
- assert Order(x**-3) + Order(exp(2/x)) == Order(exp(2/x))
- def test_simple_7():
- assert 1 + O(1) == O(1)
- assert 2 + O(1) == O(1)
- assert x + O(1) == O(1)
- assert 1/x + O(1) == 1/x + O(1)
- def test_simple_8():
- assert O(sqrt(-x)) == O(sqrt(x))
- assert O(x**2*sqrt(x)) == O(x**Rational(5, 2))
- assert O(x**3*sqrt(-(-x)**3)) == O(x**Rational(9, 2))
- assert O(x**Rational(3, 2)*sqrt((-x)**3)) == O(x**3)
- assert O(x*(-2*x)**(I/2)) == O(x*(-x)**(I/2))
- def test_as_expr_variables():
- assert Order(x).as_expr_variables(None) == (x, ((x, 0),))
- assert Order(x).as_expr_variables(((x, 0),)) == (x, ((x, 0),))
- assert Order(y).as_expr_variables(((x, 0),)) == (y, ((x, 0), (y, 0)))
- assert Order(y).as_expr_variables(((x, 0), (y, 0))) == (y, ((x, 0), (y, 0)))
- def test_contains_0():
- assert Order(1, x).contains(Order(1, x))
- assert Order(1, x).contains(Order(1))
- assert Order(1).contains(Order(1, x)) is False
- def test_contains_1():
- assert Order(x).contains(Order(x))
- assert Order(x).contains(Order(x**2))
- assert not Order(x**2).contains(Order(x))
- assert not Order(x).contains(Order(1/x))
- assert not Order(1/x).contains(Order(exp(1/x)))
- assert not Order(x).contains(Order(exp(1/x)))
- assert Order(1/x).contains(Order(x))
- assert Order(exp(1/x)).contains(Order(x))
- assert Order(exp(1/x)).contains(Order(1/x))
- assert Order(exp(1/x)).contains(Order(exp(1/x)))
- assert Order(exp(2/x)).contains(Order(exp(1/x)))
- assert not Order(exp(1/x)).contains(Order(exp(2/x)))
- def test_contains_2():
- assert Order(x).contains(Order(y)) is None
- assert Order(x).contains(Order(y*x))
- assert Order(y*x).contains(Order(x))
- assert Order(y).contains(Order(x*y))
- assert Order(x).contains(Order(y**2*x))
- def test_contains_3():
- assert Order(x*y**2).contains(Order(x**2*y)) is None
- assert Order(x**2*y).contains(Order(x*y**2)) is None
- def test_contains_4():
- assert Order(sin(1/x**2)).contains(Order(cos(1/x**2))) is True
- assert Order(cos(1/x**2)).contains(Order(sin(1/x**2))) is True
- def test_contains():
- assert Order(1, x) not in Order(1)
- assert Order(1) in Order(1, x)
- raises(TypeError, lambda: Order(x*y**2) in Order(x**2*y))
- def test_add_1():
- assert Order(x + x) == Order(x)
- assert Order(3*x - 2*x**2) == Order(x)
- assert Order(1 + x) == Order(1, x)
- assert Order(1 + 1/x) == Order(1/x)
- # TODO : A better output for Order(log(x) + 1/log(x))
- # could be Order(log(x)). Currently Order for expressions
- # where all arguments would involve a log term would fall
- # in this category and outputs for these should be improved.
- assert Order(log(x) + 1/log(x)) == Order((log(x)**2 + 1)/log(x))
- assert Order(exp(1/x) + x) == Order(exp(1/x))
- assert Order(exp(1/x) + 1/x**20) == Order(exp(1/x))
- def test_ln_args():
- assert O(log(x)) + O(log(2*x)) == O(log(x))
- assert O(log(x)) + O(log(x**3)) == O(log(x))
- assert O(log(x*y)) + O(log(x) + log(y)) == O(log(x) + log(y), x, y)
- def test_multivar_0():
- assert Order(x*y).expr == x*y
- assert Order(x*y**2).expr == x*y**2
- assert Order(x*y, x).expr == x
- assert Order(x*y**2, y).expr == y**2
- assert Order(x*y*z).expr == x*y*z
- assert Order(x/y).expr == x/y
- assert Order(x*exp(1/y)).expr == x*exp(1/y)
- assert Order(exp(x)*exp(1/y)).expr == exp(x)*exp(1/y)
- def test_multivar_0a():
- assert Order(exp(1/x)*exp(1/y)).expr == exp(1/x)*exp(1/y)
- def test_multivar_1():
- assert Order(x + y).expr == x + y
- assert Order(x + 2*y).expr == x + y
- assert (Order(x + y) + x).expr == (x + y)
- assert (Order(x + y) + x**2) == Order(x + y)
- assert (Order(x + y) + 1/x) == 1/x + Order(x + y)
- assert Order(x**2 + y*x).expr == x**2 + y*x
- def test_multivar_2():
- assert Order(x**2*y + y**2*x, x, y).expr == x**2*y + y**2*x
- def test_multivar_mul_1():
- assert Order(x + y)*x == Order(x**2 + y*x, x, y)
- def test_multivar_3():
- assert (Order(x) + Order(y)).args in [
- (Order(x), Order(y)),
- (Order(y), Order(x))]
- assert Order(x) + Order(y) + Order(x + y) == Order(x + y)
- assert (Order(x**2*y) + Order(y**2*x)).args in [
- (Order(x*y**2), Order(y*x**2)),
- (Order(y*x**2), Order(x*y**2))]
- assert (Order(x**2*y) + Order(y*x)) == Order(x*y)
- def test_issue_3468():
- y = Symbol('y', negative=True)
- z = Symbol('z', complex=True)
- # check that Order does not modify assumptions about symbols
- Order(x)
- Order(y)
- Order(z)
- assert x.is_positive is None
- assert y.is_positive is False
- assert z.is_positive is None
- def test_leading_order():
- assert (x + 1 + 1/x**5).extract_leading_order(x) == ((1/x**5, O(1/x**5)),)
- assert (1 + 1/x).extract_leading_order(x) == ((1/x, O(1/x)),)
- assert (1 + x).extract_leading_order(x) == ((1, O(1, x)),)
- assert (1 + x**2).extract_leading_order(x) == ((1, O(1, x)),)
- assert (2 + x**2).extract_leading_order(x) == ((2, O(1, x)),)
- assert (x + x**2).extract_leading_order(x) == ((x, O(x)),)
- def test_leading_order2():
- assert set((2 + pi + x**2).extract_leading_order(x)) == {(pi, O(1, x)),
- (S(2), O(1, x))}
- assert set((2*x + pi*x + x**2).extract_leading_order(x)) == {(2*x, O(x)),
- (x*pi, O(x))}
- def test_order_leadterm():
- assert O(x**2)._eval_as_leading_term(x) == O(x**2)
- def test_order_symbols():
- e = x*y*sin(x)*Integral(x, (x, 1, 2))
- assert O(e) == O(x**2*y, x, y)
- assert O(e, x) == O(x**2)
- def test_nan():
- assert O(nan) is nan
- assert not O(x).contains(nan)
- def test_O1():
- assert O(1, x) * x == O(x)
- assert O(1, y) * x == O(1, y)
- def test_getn():
- # other lines are tested incidentally by the suite
- assert O(x).getn() == 1
- assert O(x/log(x)).getn() == 1
- assert O(x**2/log(x)**2).getn() == 2
- assert O(x*log(x)).getn() == 1
- raises(NotImplementedError, lambda: (O(x) + O(y)).getn())
- def test_diff():
- assert O(x**2).diff(x) == O(x)
- def test_getO():
- assert (x).getO() is None
- assert (x).removeO() == x
- assert (O(x)).getO() == O(x)
- assert (O(x)).removeO() == 0
- assert (z + O(x) + O(y)).getO() == O(x) + O(y)
- assert (z + O(x) + O(y)).removeO() == z
- raises(NotImplementedError, lambda: (O(x) + O(y)).getn())
- def test_leading_term():
- from sympy.functions.special.gamma_functions import digamma
- assert O(1/digamma(1/x)) == O(1/log(x))
- def test_eval():
- assert Order(x).subs(Order(x), 1) == 1
- assert Order(x).subs(x, y) == Order(y)
- assert Order(x).subs(y, x) == Order(x)
- assert Order(x).subs(x, x + y) == Order(x + y, (x, -y))
- assert (O(1)**x).is_Pow
- def test_issue_4279():
- a, b = symbols('a b')
- assert O(a, a, b) + O(1, a, b) == O(1, a, b)
- assert O(b, a, b) + O(1, a, b) == O(1, a, b)
- assert O(a + b, a, b) + O(1, a, b) == O(1, a, b)
- assert O(1, a, b) + O(a, a, b) == O(1, a, b)
- assert O(1, a, b) + O(b, a, b) == O(1, a, b)
- assert O(1, a, b) + O(a + b, a, b) == O(1, a, b)
- def test_issue_4855():
- assert 1/O(1) != O(1)
- assert 1/O(x) != O(1/x)
- assert 1/O(x, (x, oo)) != O(1/x, (x, oo))
- f = Function('f')
- assert 1/O(f(x)) != O(1/x)
- def test_order_conjugate_transpose():
- x = Symbol('x', real=True)
- y = Symbol('y', imaginary=True)
- assert conjugate(Order(x)) == Order(conjugate(x))
- assert conjugate(Order(y)) == Order(conjugate(y))
- assert conjugate(Order(x**2)) == Order(conjugate(x)**2)
- assert conjugate(Order(y**2)) == Order(conjugate(y)**2)
- assert transpose(Order(x)) == Order(transpose(x))
- assert transpose(Order(y)) == Order(transpose(y))
- assert transpose(Order(x**2)) == Order(transpose(x)**2)
- assert transpose(Order(y**2)) == Order(transpose(y)**2)
- def test_order_noncommutative():
- A = Symbol('A', commutative=False)
- assert Order(A + A*x, x) == Order(1, x)
- assert (A + A*x)*Order(x) == Order(x)
- assert (A*x)*Order(x) == Order(x**2, x)
- assert expand((1 + Order(x))*A*A*x) == A*A*x + Order(x**2, x)
- assert expand((A*A + Order(x))*x) == A*A*x + Order(x**2, x)
- assert expand((A + Order(x))*A*x) == A*A*x + Order(x**2, x)
- def test_issue_6753():
- assert (1 + x**2)**10000*O(x) == O(x)
- def test_order_at_infinity():
- assert Order(1 + x, (x, oo)) == Order(x, (x, oo))
- assert Order(3*x, (x, oo)) == Order(x, (x, oo))
- assert Order(x, (x, oo))*3 == Order(x, (x, oo))
- assert -28*Order(x, (x, oo)) == Order(x, (x, oo))
- assert Order(Order(x, (x, oo)), (x, oo)) == Order(x, (x, oo))
- assert Order(Order(x, (x, oo)), (y, oo)) == Order(x, (x, oo), (y, oo))
- assert Order(3, (x, oo)) == Order(1, (x, oo))
- assert Order(x**2 + x + y, (x, oo)) == O(x**2, (x, oo))
- assert Order(x**2 + x + y, (y, oo)) == O(y, (y, oo))
- assert Order(2*x, (x, oo))*x == Order(x**2, (x, oo))
- assert Order(2*x, (x, oo))/x == Order(1, (x, oo))
- assert Order(2*x, (x, oo))*x*exp(1/x) == Order(x**2*exp(1/x), (x, oo))
- assert Order(2*x, (x, oo))*x*exp(1/x)/log(x)**3 == Order(x**2*exp(1/x)*log(x)**-3, (x, oo))
- assert Order(x, (x, oo)) + 1/x == 1/x + Order(x, (x, oo)) == Order(x, (x, oo))
- assert Order(x, (x, oo)) + 1 == 1 + Order(x, (x, oo)) == Order(x, (x, oo))
- assert Order(x, (x, oo)) + x == x + Order(x, (x, oo)) == Order(x, (x, oo))
- assert Order(x, (x, oo)) + x**2 == x**2 + Order(x, (x, oo))
- assert Order(1/x, (x, oo)) + 1/x**2 == 1/x**2 + Order(1/x, (x, oo)) == Order(1/x, (x, oo))
- assert Order(x, (x, oo)) + exp(1/x) == exp(1/x) + Order(x, (x, oo))
- assert Order(x, (x, oo))**2 == Order(x**2, (x, oo))
- assert Order(x, (x, oo)) + Order(x**2, (x, oo)) == Order(x**2, (x, oo))
- assert Order(x, (x, oo)) + Order(x**-2, (x, oo)) == Order(x, (x, oo))
- assert Order(x, (x, oo)) + Order(1/x, (x, oo)) == Order(x, (x, oo))
- assert Order(x, (x, oo)) - Order(x, (x, oo)) == Order(x, (x, oo))
- assert Order(x, (x, oo)) + Order(1, (x, oo)) == Order(x, (x, oo))
- assert Order(x, (x, oo)) + Order(x**2, (x, oo)) == Order(x**2, (x, oo))
- assert Order(1/x, (x, oo)) + Order(1, (x, oo)) == Order(1, (x, oo))
- assert Order(x, (x, oo)) + Order(exp(1/x), (x, oo)) == Order(x, (x, oo))
- assert Order(x**3, (x, oo)) + Order(exp(2/x), (x, oo)) == Order(x**3, (x, oo))
- assert Order(x**-3, (x, oo)) + Order(exp(2/x), (x, oo)) == Order(exp(2/x), (x, oo))
- # issue 7207
- assert Order(exp(x), (x, oo)).expr == Order(2*exp(x), (x, oo)).expr == exp(x)
- assert Order(y**x, (x, oo)).expr == Order(2*y**x, (x, oo)).expr == exp(x*log(y))
- # issue 19545
- assert Order(1/x - 3/(3*x + 2), (x, oo)).expr == x**(-2)
- def test_mixing_order_at_zero_and_infinity():
- assert (Order(x, (x, 0)) + Order(x, (x, oo))).is_Add
- assert Order(x, (x, 0)) + Order(x, (x, oo)) == Order(x, (x, oo)) + Order(x, (x, 0))
- assert Order(Order(x, (x, oo))) == Order(x, (x, oo))
- # not supported (yet)
- raises(NotImplementedError, lambda: Order(x, (x, 0))*Order(x, (x, oo)))
- raises(NotImplementedError, lambda: Order(x, (x, oo))*Order(x, (x, 0)))
- raises(NotImplementedError, lambda: Order(Order(x, (x, oo)), y))
- raises(NotImplementedError, lambda: Order(Order(x), (x, oo)))
- def test_order_at_some_point():
- assert Order(x, (x, 1)) == Order(1, (x, 1))
- assert Order(2*x - 2, (x, 1)) == Order(x - 1, (x, 1))
- assert Order(-x + 1, (x, 1)) == Order(x - 1, (x, 1))
- assert Order(x - 1, (x, 1))**2 == Order((x - 1)**2, (x, 1))
- assert Order(x - 2, (x, 2)) - O(x - 2, (x, 2)) == Order(x - 2, (x, 2))
- def test_order_subs_limits():
- # issue 3333
- assert (1 + Order(x)).subs(x, 1/x) == 1 + Order(1/x, (x, oo))
- assert (1 + Order(x)).limit(x, 0) == 1
- # issue 5769
- assert ((x + Order(x**2))/x).limit(x, 0) == 1
- assert Order(x**2).subs(x, y - 1) == Order((y - 1)**2, (y, 1))
- assert Order(10*x**2, (x, 2)).subs(x, y - 1) == Order(1, (y, 3))
- def test_issue_9351():
- assert exp(x).series(x, 10, 1) == exp(10) + Order(x - 10, (x, 10))
- def test_issue_9192():
- assert O(1)*O(1) == O(1)
- assert O(1)**O(1) == O(1)
- def test_issue_9910():
- assert O(x*log(x) + sin(x), (x, oo)) == O(x*log(x), (x, oo))
- def test_performance_of_adding_order():
- l = [x**i for i in range(1000)]
- l.append(O(x**1001))
- assert Add(*l).subs(x,1) == O(1)
- def test_issue_14622():
- assert (x**(-4) + x**(-3) + x**(-1) + O(x**(-6), (x, oo))).as_numer_denom() == (
- x**4 + x**5 + x**7 + O(x**2, (x, oo)), x**8)
- assert (x**3 + O(x**2, (x, oo))).is_Add
- assert O(x**2, (x, oo)).contains(x**3) is False
- assert O(x, (x, oo)).contains(O(x, (x, 0))) is None
- assert O(x, (x, 0)).contains(O(x, (x, oo))) is None
- raises(NotImplementedError, lambda: O(x**3).contains(x**w))
- def test_issue_15539():
- assert O(1/x**2 + 1/x**4, (x, -oo)) == O(1/x**2, (x, -oo))
- assert O(1/x**4 + exp(x), (x, -oo)) == O(1/x**4, (x, -oo))
- assert O(1/x**4 + exp(-x), (x, -oo)) == O(exp(-x), (x, -oo))
- assert O(1/x, (x, oo)).subs(x, -x) == O(-1/x, (x, -oo))
- def test_issue_18606():
- assert unchanged(Order, 0)
- def test_issue_22165():
- assert O(log(x)).contains(2)
- def test_issue_23231():
- # This test checks Order for expressions having
- # arguments containing variables in exponents/powers.
- assert O(x**x + 2**x, (x, oo)) == O(exp(x*log(x)), (x, oo))
- assert O(x**x + x**2, (x, oo)) == O(exp(x*log(x)), (x, oo))
- assert O(x**x + 1/x**2, (x, oo)) == O(exp(x*log(x)), (x, oo))
- assert O(2**x + 3**x , (x, oo)) == O(exp(x*log(3)), (x, oo))
- def test_issue_9917():
- assert O(x*sin(x) + 1, (x, oo)) == O(x, (x, oo))
|