Ask Your Question

Revision history [back]

Here's a way to see why the explicit split into real and imaginary parts is necessary. If the variables are given to solve as a list,

var('x, y')
z = 1/(i*x + 1/(i*y + 1))
Equation = z == 2
solve(Equation, [x, y])

[[x == (-I*r1 + 1)/(2*r1 - 2*I), y == r1]]

then it's clear that solve is returning a fully complex answer with a dummy variable r1. With references to this dummy variable and the result of solve, one can then find solutions that make the imaginary part of x zero:

var('x, y, r1')
z = 1/(i*x + 1/(i*y + 1))
Equation = z == 2
f = solve(Equation, [x, y])
solve( imaginary(f[0][0].rhs()), r1 )

[r1 == -1, r1 == 1]

With an additional reference to this second result, the desired solution form can be achieved with nested lists:

var('x, y, r1')
z = 1/(i*x + 1/(i*y + 1))
Equation = z == 2
f = solve(Equation, [x, y])
g = solve( imaginary(f[0][0].rhs()), r1 )
[[f[0][i].subs(g[j]) for i in (0,1)] for j in (0,1)]

[[x == (-1/2), y == -1], [x == (1/2), y == 1]]

Here's a link to a live example.