Generally, you need more than one function to make a decent IFS graph.
ifs = [f1, f2, f4]
def lin(x, y): x, y = rotate(x, y, 45) return x/2, y/2The key to stability here is "x/2, y/2" as it makes the picture smaller. Conversely, "2*x, 2*y" will blow up after a few iterations, as the size doubles every time. So it is generally better to keep the factors less than 1.
Note that rotation does not affect stability — it doesn't make the picture bigger or smaller.
The above example is called a linear function, because it works like the equation of a straight line: f(x) = a*x + b. These are easy to understand, but you can still make interesting art if you use a few different functions together. For example, see some of mine made with four linear functions each.
Anything with powers or special functions is nonlinear. These can get very interesting, but they are more difficult when it comes to stability. One linear and one nonlinear function is often a good combination.
Sin and cos are generally OK in IFS, because their output is always between -1 and 1, so the picture does not blow up. For example:
def liss(x, y): return math.sin(2*x), math.cos(3*x)(Named so because it is related to Lissajous curves — nice examples of math art themselves.)
Square roots are similarly OK. However, remember that they won't work for negative numbers. But you can use them along with the absolute value, for example
def sroot(x, y): return math.sqrt(abs(x)), math.sqrt(abs(y))