예제 #1
0
def test__linsolve_float():

    # This should give the exact answer:
    eqs = [y - x, y - 0.0216 * x]
    sol = {x: 0.0, y: 0.0}
    assert _linsolve(eqs, (x, y)) == sol

    # Other cases should be close to eps

    def all_close(sol1, sol2, eps=1e-15):
        close = lambda a, b: abs(a - b) < eps
        assert sol1.keys() == sol2.keys()
        return all(close(sol1[s], sol2[s]) for s in sol1)

    eqs = [
        0.8 * x + 0.8 * z + 0.2, 0.9 * x + 0.7 * y + 0.2 * z + 0.9,
        0.7 * x + 0.2 * y + 0.2 * z + 0.5
    ]
    sol_exact = {x: -29 / 42, y: -11 / 21, z: 37 / 84}
    sol_linsolve = _linsolve(eqs, [x, y, z])
    assert all_close(sol_exact, sol_linsolve)

    eqs = [
        0.9 * x + 0.3 * y + 0.4 * z + 0.6, 0.6 * x + 0.9 * y + 0.1 * z + 0.7,
        0.4 * x + 0.6 * y + 0.9 * z + 0.5
    ]
    sol_exact = {x: -88 / 175, y: -46 / 105, z: -1 / 25}
    sol_linsolve = _linsolve(eqs, [x, y, z])
    assert all_close(sol_exact, sol_linsolve)

    eqs = [
        0.4 * x + 0.3 * y + 0.6 * z + 0.7,
        0.4 * x + 0.3 * y + 0.9 * z + 0.9,
        0.7 * x + 0.9 * y,
    ]
    sol_exact = {x: -9 / 5, y: 7 / 5, z: -2 / 3}
    sol_linsolve = _linsolve(eqs, [x, y, z])
    assert all_close(sol_exact, sol_linsolve)

    eqs = [
        x * (0.7 + 0.6 * I) + y * (0.4 + 0.7 * I) + z * (0.9 + 0.1 * I) + 0.5,
        0.2 * I * x + 0.2 * I * y + z * (0.9 + 0.2 * I) + 0.1,
        x * (0.9 + 0.7 * I) + y * (0.9 + 0.7 * I) + z * (0.9 + 0.4 * I) + 0.4,
    ]
    sol_exact = {
        x: -6157 / 7995 - 411 / 5330 * I,
        y: 8519 / 15990 + 1784 / 7995 * I,
        z: -34 / 533 + 107 / 1599 * I,
    }
    sol_linsolve = _linsolve(eqs, [x, y, z])
    assert all_close(sol_exact, sol_linsolve)
예제 #2
0
def test__linsolve():
    assert _linsolve([], [x]) == {x:x}
    assert _linsolve([S.Zero], [x]) == {x:x}
    assert _linsolve([x-1,x-2], [x]) is None
    assert _linsolve([x-1], [x]) == {x:1}
    assert _linsolve([x-1, y], [x, y]) == {x:1, y:S.Zero}
    assert _linsolve([2*I], [x]) is None
    raises(PolyNonlinearError, lambda: _linsolve([x*(1 + x)], [x]))
예제 #3
0
def test__linsolve_deprecated():
    assert _linsolve([Eq(x**2, x**2+y)], [x, y]) == {x:x, y:S.Zero}
    assert _linsolve([(x+y)**2-x**2], [x]) == {x:-y/2}
    assert _linsolve([Eq((x+y)**2, x**2)], [x]) == {x:-y/2}
예제 #4
0
def test__linsolve():
    assert _linsolve([], [x]) == {x:x}
    assert _linsolve([S.Zero], [x]) == {x:x}