The complex linearization theorem

The objective here is to illustrate the complex linearization theorem. Namely:

Theorem:
Suppose that f is analytic at zero with f(0)=0 and f'(0)=λ, where 0<\[VerticalSeparator]λ\[VerticalSeparator]<1. Then, there is a neighborhood U of zero and an analytic function φ:U->ℂ that conjugates L(z)=λ z to f.

Of course, there’s nothing special about the point zero - we obtain the same result about any fixed point by a simple shift. The point is that, in the neighborhood of a fixed point, an analytic function looks like z->λ z, where λ is the value of the derivative of the function at the fixed point. We are used to this intuition from calculus and real analysis, but the statement is really much stronger than it is in the real context because the function φ is also analytic.

Zooming in

Let’s illustrate the theorem with the following function:

f[z_] = z^2 - z/2;

This function is certainly non-linear, though it does obey the hypotheses of our theorem.

{f[0],f'[0]}

From a purely intuitive perspective, the theorem asserts that, the closer we look at the origin, the more linear the function should look. Of course, the standard way to visualize a function near the origin is to graph its effect on a small polar grid. In the following sequence of images, we show how f affects polar grids of decreasing radius. The final image is the image of a small polar grid under the identity map. As we can see in the penultimate image the affect of f on a small disk is to scale by the factor |f'(0)|=1/2 and rotate through the angle arg(f'(0))=(180^°), since

images = Table[
ParametricPlot[{Re[f[r*Exp[I*theta]]],Im[f[r*Exp[I*theta]]]},
{r,0,R},{theta,0,2Pi}, Mesh->True, ImageSize -> 250, 
BoundaryStyle->Thick,
PlotRange-> R, PlotPoints -> 50, PlotRangePadding -> .01,
Axes -> None, PlotLabel -> "r="<>ToString[R]],
{R,{0.8,0.4,0.2,0.1,0.05}}];
images = Append[images, ParametricPlot[{Re[r*Exp[I*theta]],Im[r*Exp[I*theta]]},
{r,0,0.05},{theta,0,2Pi}, Mesh->True, ImageSize -> 250, Axes->None,
PlotRange-> 0.05, PlotPoints -> 50, PlotRangePadding -> .01,BoundaryStyle->Thick,
PlotLabel -> "Identity"]];
Grid[Partition[images,3]]

Computing the conjugacy via a series

The general construction

One standard proof of the linearization theorem goes something like so: Since f is analytic at zero, it can be expanded in a Taylor series. The conditions f(0)=0 and f'(0)=λ give us a bit of information on the coefficients, but they’re mostly arbitrary:

f(z)=λ z + (∑_(k=2)^∞)(Subscript[a, k])(z^k).

Now, we seek an analytic function φ as the conjugacy, thus we assume that it’s given by a power series:

φ(z)=(∑_(k=0)^∞)(Subscript[c, k])(z^k).

We hope to choose the coefficients (Subscript[c, k]) such that

φ∘f(z)=L∘φ(z).

Now, the right hand side is pretty simple:

L(φ(z)) = λ((Subscript[c, 0])+(Subscript[c, 1])z+(Subscript[c, 2])(z^2)+(Subscript[c, 3])(z^3)+⋯)= λ (Subscript[c, 0])+λ (Subscript[c, 1])z + λ (Subscript[c, 2])(z^2)+λ (Subscript[c, 3])(z^3)+⋯.

The expression on the left is a bit trickier:

({{φ(f(z)) = (Subscript[c, 0]), +  (Subscript[c, 1])(λ z + (Subscript[a, 2])(z^2)+(Subscript[a, 3])(z^3)+ (Subscript[a, 4])(z^4)+⋯)}, { , +  (Subscript[c, 2])(((λ z + (Subscript[a, 2])(z^2)+(Subscript[a, 3])(z^3)+ (Subscript[a, 4])(z^4)+⋯))^2)}, { , +  (Subscript[c, 3])(((λ z + (Subscript[a, 2])(z^2)+(Subscript[a, 3])(z^3)+ (Subscript[a, 4])(z^4)+⋯))^3)}, { , +  (Subscript[c, 4])(((λ z + (Subscript[a, 2])(z^2)+(Subscript[a, 3])(z^3)+ (Subscript[a, 4])(z^4)+⋯))^4)+⋯}})

Nonetheless, we can compare coefficients of powers of z to see what the (Subscript[c, k])s must be in order to make the conjugacy work. The constant term on the right is λ (Subscript[c, 0]), while on the left it’s just (Subscript[c, 0]). The only way that can work is if (Subscript[c, 0])=0. The coefficient of z on both sides is λ (Subscript[c, 1]). I guess that means that (Subscript[c, 1])can be any non-zero value. This just means that there are many possible choices for the conjugacy parametrized by the choice of (Subscript[c, 1]). We’ll make the simplest possible choice for (Subscript[c, 1]), namely (Subscript[c, 1])=1.

The coefficient of (z^2) on the right is λ (Subscript[c, 2]) while on the left it’s (Subscript[c, 1])(Subscript[a, 2])+(Subscript[c, 2])(λ^2). Since we already know that (Subscript[c, 1])=1, this yields

(Subscript[c, 2])=((Subscript[a, 2])/(λ-(λ^2))).

In general, when we compare the coefficients of (z^n), we obtain an equation involving (Subscript[c, 0]),(Subscript[c, 1]),…,(Subscript[c, n]) as well as some of the (Subscript[a, k])s, which are known. Since (Subscript[c, 0]),(Subscript[c, 1]),…,(Subscript[c, n-1]) are already known, we can solve for (Subscript[c, n]) to obtain a recursive procedure to find all the (Subscript[c, k])s. Pushing the computations we have so far one step further to illustrate the point, we find that the coefficient of (z^3) on the right λ (Subscript[c, 3]) while on the left it’s (Subscript[c, 1])(Subscript[a, 3])+2(Subscript[c, 2])λ (Subscript[a, 2])+(Subscript[c, 3])(λ^3). Using the known values for (Subscript[c, 1]) and (Subscript[c, 2]), we get

(Subscript[c, 3])=((Subscript[a, 3])+2λ((Subscript[a, 2]^2)/(λ-(λ^2))))/(λ-(λ^3)).

Computation for our function

The computation of the conjugacy function can be automated. We first specify how many terms we want and compute that many terms of the power series of f, storing the result in the polynomial p. While this step might seem a bit silly for our simple polynomial, it allows the process to work for a general analytic function.

n = 8;
p[z_] = Normal[Series[f[z],{z,0,n}]]

The linearized version should be this simple linear function:

L[z_]= f'[0]z

I guess that φ should have the following form:

φ[z_]=z+Sum[c[k]z^k,{k,2,n}]

Now, we want L(φ(z))=φ(f(z)) so we take the difference of the left and right sides, then grab the unknown coefficients.

coeffs = CoefficientList[L[φ[z]]-φ[p[z]],z][[3;;n+1]]

We need to set each of these equal to zero and solve for the (Subscript[c, k])s.

sol = First[Solve[coeffs==Table[0,{n-1}],Table[c[k],{k,2,n}]]]

Now, we can use those to redefine φ.

φ[z_] = φ[z] /. sol

To truly conjugate f to its linearization, we need the inverse, since φ∘f∘(φ^(-1))=L. Here, we’ll use InverseSeries and store the result in Φ.

Φ[z_] = Normal[InverseSeries[Series[φ[z],{z,0,8}],z]]

Let’s see if this gives us L(z), up to the desired order.

Series[φ[f[Φ[z]]],{z,0,8}]

Whoa!

Computing the conjugacy as a fixed point

The general construction

An alternative approach to find the conjugacy function is to define (Subscript[φ, n])=(λ^(-n))(f^n). For then, (Subscript[φ, n]) satisfies

(Subscript[φ, n])∘f=(λ^(-n))(f^(n+1))=λ (Subscript[φ, n+1]).

Thus, we expect that if (Subscript[φ, n])->φ, we’ll have

φ∘f=λ φ,

as desired.

Computation for our function

To implement this, we first compute λ, and define a second version of φ in terms of that.

λ=f'[0];
φ2[n_][z_]:=(λ^(-n))Nest[f,z,n];

Let’s compare this version to our old version.

{φ2[100][0.1],φ[0.1],Abs[φ2[100][0.1]-φ[0.1]]}