CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In

Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.

| Download
Project: Dynamics 2019
Views: 123
Visibility: Unlisted (only visible to those who know the link)
Kernel: SageMath (stable)

The Logistic Family

We had a worksheet in class that did several things:

  1. Explained the dynamics of quadratic maps with zero or one fixed point.

  2. Proved that if a quadratic has two fixed points, it is conjugate via an affine linear map to a map of the form Fμ(x)=μx(1x).F_\mu(x) = \mu x (1-x). where μ>1\mu>1. These maps form the Logistic family of maps.

One trivial remark is that if μ>1\mu>1, then every point in (,0)(1,)(-\infty,0) \cup (1, \infty) is forward asymptotic to -\infty. This is because Fμ(x)<xF_\mu(x)<x whenever x(,0)x \in (-\infty,0) guaranteeing from prior arguments that points in (,0)(-\infty,0) tend to -\infty. Also if x>1x>1, then Fμ(x)<0F_\mu(x)<0, so again xx will be forward asymptotic to -\infty.

Because of this we will concentrate on understanding the dynamics on the interval [0,1][0,1].

The goal of this notebook is to take a tour through the Logistic family as μ\mu increases from the value one. Below we define the logistic family:

def F(mu): def F_mu(x): return mu*x*(1-x) return F_mu

For example F(3/2) can be plotted as follows:

G = F(3/2) plot(G, 0, 1, aspect_ratio = 1)
Image in a Jupyter notebook

The value μ\mu represents F(0)F'(0). Observe also that zero is fixed. Since μ>0\mu>0, this point represents a repelling fixed point.

The other fixed point is at the point pμ=μ1μ.p_\mu = \frac{\mu-1}{\mu}. We define this point as a function of mu:

def p(mu): return (mu-1)/mu

We can check symbolically that pμp_\mu is indeed fixed by FμF_\mu:

mu = var("mu") # make mu into a symbolic variable bool(F(mu)(p(mu)) == p(mu)) # Attempt to evaluate the equation as true or false.
True

Now we consider the multiplier of the fixed point pμp_\mu. This is just the value Fμ(pμ)F_\mu'(p_\mu). Here we have Sage compute FμF_\mu':

x = var("x") F_prime = F(mu)(x).derivative(x) F_prime
-mu*(x - 1) - mu*x

Below we demonstrate that Fμ(pμ)=2μ.F'_\mu(p_\mu)=2-\mu. Note that F_prime is an algebraic expression in the variables xand mu. We can substitute a value for x using the subs() method which takes as input a mapping. We will map x to p(mu). The .simplify_full() method attempts to simplify the resulting expression.

F_prime.subs({x:p(mu)}).simplify_full()
-mu + 2

Observe that:

  1. We have 0<Fμ(pμ)<10<F'_\mu(p_\mu)<1 when μ(1,2)\mu \in (1,2). This means that pμp_\mu is an attracting fixed point, and that FμF'_\mu is a one-to-one orientation preserving map in a sufficiently small open neighborhood of pμp_\mu. (An {\em open neighborhood of pμp_\mu is an open set containing pμp_\mu such as the interval (pμϵ,pμ+ϵ)(p_\mu-\epsilon, p_\mu+\epsilon) for ϵ>0\epsilon>0 small.)

  2. In the case μ=2\mu=2, we have Fμ(pμ)=0F'_\mu(p_\mu)=0. This means that pμ=12p_\mu=\frac{1}{2} since 12\frac{1}{2} is the only critical point. Since Fμ(pμ)=0F'_\mu(p_\mu)=0, pμp_\mu is a {\em super-attracting fixed point}. Furthemore, because pμp_\mu coincides with the critical point, the map FμF_\mu is never one-to-one on a neighborhood of pμp_\mu.

  3. We have 1<Fμ(pμ)<0-1<F'_\mu(p_\mu)<0 when μ(2,3)\mu \in (2,3). This means that pμp_\mu is an attracting fixed point, that FμF'_\mu is a one-to-one orientation-reversing map in a small neighborhood of pμp_\mu.

  4. When μ>3\mu>3, we have that Fμ(pμ)<1F'_\mu(p_\mu)<-1. At this point pμp_\mu has become a repelling fixed point.

It follows from the above facts that two maps taken from different cases above are not topologically conjugate. For example, a map from case 1 is not conjugate to a map from case 3, because in case 1, the attracting fixed point pμp_\mu is locally orientation preserving, whiel in case 3 the attracting fixed point is locally orienation reversing.

In fact it can be shown that two maps taken from case 1 are topologically conjugate, and two maps taken from case 3 are topologically conjugate. The topological conjugacy can not be a diffeomorphism because conjugacy by a diffeomorphism preserves multipliers at fixed and periodic points. (Excercise: Show this is true.)

Now we will attempt to understand the dynamics of these maps for values of μ\mu running from 11 to a little bigger than 33.

The case when μ(1,2)\mu \in (1,2).

This cobweb function was taken from an earlier notebook:

def cobweb(x, T, N, xmin, xmax): cobweb_path = [(x,x)] for i in range(N): y = T(x) # Reassign y to be T(x). cobweb_path.append( (x,y) ) cobweb_path.append( (y,y) ) x = y # Reassign x to be identical to y. cobweb_plot = line2d(cobweb_path, color="red", aspect_ratio=1) function_graph = plot(T, (xmin, xmax), color="blue") # define the identity map: identity(t) = t id_graph = plot(identity, (xmin, xmax), color="green") return cobweb_plot + function_graph + id_graph

Here is an example of a cobweb plot in the case μ=32\mu=\frac{3}{2} starting at x=0.1x=0.1, plotting 10 iterations over the interval (0,1)(0,1).

cobweb(0.1, F(3/2), 10, 0, 1)
Image in a Jupyter notebook

We will use sliders to allow experimentation. A slider can be created decribing values in the interval [1,2][1,2] with a step size of 0.0010.001 and initial value 3/23/2 as below:

slider(1, 2, 0.001, 3/2)
TransformFloatSlider(value=1.5, max=2.0, min=1.0, step=0.001)

We want to be able to vary μ(1,2)\mu \in (1,2) and vary x(0,1)x \in (0,1). We can use the @interact decorator for a function to do this. The values of the sliders will be used as input to a function which is run whenever the sliders are updated.

@interact def iteractive_plot(mu = slider(1, 2, 0.001, 3/2), x = slider(0, 1, 0.001, 1/2)): return cobweb(x, F(mu), 10, 0, 1)
SW50ZXJhY3RpdmUgZnVuY3Rpb24gPGZ1bmN0aW9uIGl0ZXJhY3RpdmVfcGxvdCBhdCAweDdmMDRjN2IwYWY1MD4gd2l0aCAyIHdpZGdldHMKICBtdTogVHJhbnNmb3JtRmxvYXRTbGlkZXIodmHigKY=

From looking at the Cobweb plot, you should be convinced that:

  1. Any point x(0,pμ)x \in (0, p_\mu) has an orbit which increases and accumulates on pμp_\mu. To prove this, it suffices to show that x(0,pμ)x \in (0, p_\mu) implies x<Fμ(x)<pμx < F_\mu(x) < p_\mu and apply our standard argument.

  2. Any point x(pμ,12]x \in (p_\mu,\frac{1}{2}] has an orbit which decreases down toward pμp_\mu. Again it suffices to show that if x(pμ,12]x \in (p_\mu,\frac{1}{2}], then pμ<Fμ(x)<xp_\mu < F_\mu(x) < x.

  3. If x(12,1)x \in (\frac{1}{2}, 1), then 0<Fμ(x)<120 < F_\mu(x) < \frac{1}{2}. From this and statements 1 and 2 above, it follows that xx is forward asymptotic to pμp_\mu.

The above shows that Ws(pμ)=(0,1)W^s(p_\mu)=(0,1), which completely describes the dynamics on [0,1][0,1]. Every point in (0,1)(0,1) is forward asymptotic to pμp_\mu. (Also, zero is fixed and Fμ(1)=0F_\mu(1)=0.)

The case μ=2\mu=2.

Recall that F2F_2 has a super-attracting fixed point. The point pμ=12p_\mu=\frac{1}{2} is both a critical point and fixed. The following code lets you experiment with this case.

@interact def iteractive_plot(x = slider(0, 1, 0.001, 1/4)): return cobweb(x, F(2), 10, 0, 1)
SW50ZXJhY3RpdmUgZnVuY3Rpb24gPGZ1bmN0aW9uIGl0ZXJhY3RpdmVfcGxvdCBhdCAweDdmMDRjN2IxYmU2MD4gd2l0aCAxIHdpZGdldAogIHg6IFRyYW5zZm9ybUZsb2F0U2xpZGVyKHZhbHXigKY=

Similar analysis to the previous case can be used to prove that every point in (0,1)(0,1) is forward asymptotic to the super-attracting fixed point pμ=12p_\mu=\frac{1}{2}.

The case of μ(2,3)\mu \in (2,3).

You can experiment with the maps below:

@interact def iteractive_plot(mu = slider(2, 3, 0.001, 2.5), x = slider(0, 1, 0.001, 0.9)): return cobweb(x, F(mu), 20, 0, 1)
SW50ZXJhY3RpdmUgZnVuY3Rpb24gPGZ1bmN0aW9uIGl0ZXJhY3RpdmVfcGxvdCBhdCAweDdmMDRjN2IxYjdkMD4gd2l0aCAyIHdpZGdldHMKICBtdTogVHJhbnNmb3JtRmxvYXRTbGlkZXIodmHigKY=

The dynamics are a bit more complex because locally FμF_\mu is orientatation-reversing in a neighborhood of pμp_\mu. This causes orbits to spiral inward rather than approach directly.

By experimenting with the cobweb plots above, you should be convinced that all orbits are asymptotic to the fixed point pμp_\mu.

Theorem. When 2<μ<32<\mu<3, all orbits in (0,1)(0,1) are asymptotic to pμp_\mu.

We will give a proof of this using the following claim about the interval I=[12,2pμ12]I = [\frac{1}{2}, 2 p_\mu-\frac{1}{2}].

Claim. Suppose 2<μ<32<\mu<3.

  1. The interval is symmetric around pμp_\mu.

  2. We have Fμ(12)IF_\mu(\frac{1}{2}) \in I. Note that Fμ(12)F_\mu(\frac{1}{2}) is the maximum value taken by FμF_\mu.

  3. We have 1<(Fμ2)(x)<1-1 < (F^2_\mu)'(x) < 1 for each xIx \in I.

Proof of 1. It is symmetric around pμp_\mu because the endpoints are at equal distance from pμp_\mu. Observe pμ12=pμ12=pμ(2pμ12).|p_\mu-\frac{1}{2}|=p_\mu-\frac{1}{2} = |p_\mu-(2 p_\mu-\frac{1}{2})|.

Graphical "proof" of 2. We can consider plotting the left and right endpoints of II as well as Fμ(12)F_\mu(\frac{1}{2}). We plot the left endpoint in green, the right endpoint in blue, and the Fμ(12)F_\mu(\frac{1}{2}) in red below. All are expressed as a function of μ\mu.

plt = plot(1/2, 2, 3, color="green") plt += plot(2*p(mu)-1/2, 2, 3, color="blue") plt += plot(F(mu)(1/2), 2, 3, color="red") plt
Image in a Jupyter notebook

Graphical "proof" of 3. We plot (Fμ2)(x)(F^2_\mu)'(x) as a function of xx below, allowing the choice of μ\mu with a slider. We also add plots of the constant function 1-1 and the constant function 11.

@interact def iteractive_plot(mu = slider(2, 3, 0.001, 2.5)): x = var("x") F_mu = F(mu) square = F_mu(F_mu(x)) plt = plot(square.derivative(x), 1/2, 2*p(mu)-1/2, color="blue") plt += plot(-1, 1/2, 2*p(mu)-1/2, color="red") plt += plot(1, 1/2, 2*p(mu)-1/2, color="red") return plt
SW50ZXJhY3RpdmUgZnVuY3Rpb24gPGZ1bmN0aW9uIGl0ZXJhY3RpdmVfcGxvdCBhdCAweDdmMDRjN2IxYmMwOD4gd2l0aCAxIHdpZGdldAogIG11OiBUcmFuc2Zvcm1GbG9hdFNsaWRlcih2YWzigKY=

Proposition. If xIx \in I, then the orbit of xx is forward asymptotic to pμp_\mu.

Proof: We use the Claim. Since (Fμ2)(t)|(F_\mu^2)'(t)| is a continuous function of tt, it attains a maximum on II. Call this value CC. By statement 3 of the claim, we know C<1C<1. Then by the Mean Value Theorem, we see that for any xIx \in I, we have Fμ2(x)pμ<Cxpμ.|F_\mu^2(x)-p_\mu| < C |x - p_\mu|. Since Fμ2(x)F_\mu^2(x) is closer to pμp_\mu than xx and II is symmetric around pμp_\mu, it must be that Fμ2(x)IF_\mu^2(x) \in I. Then by induction we see that for any xIx \in I and any k>0k>0, we have Fμ2k(x)pμ<Ckxpμ.|F_\mu^{2k}(x)-p_\mu| < C^k |x - p_\mu|. Since C<1C<1, the right hand side tends to zero as k+k \to +\infty. Thus, we have that limk+Fμ2k(x)=pμ\lim_{k \to +\infty} F_\mu^{2k}(x)=p_\mu. This shows that the orbit of xx is forward asymptotic to pμp_\mu. as desired.

Proof of the Theorem. Now we will show that all points are forward asymptotic to pμp_\mu.

From the proposition above, we already know that the statement is true on the interval I=[12,2pμ12]I=[\frac{1}{2}, 2 p_\mu-\frac{1}{2}].

Now consider the case of x(0,12)x \in (0,\frac{1}{2}). Observe that if x(0,12)x \in (0,\frac{1}{2}), then Fμ(x)>xF_\mu(x)>x. Since there are no fixed points in the interval (0,12)(0,\frac{1}{2}), points in the orbit increase until at some point we reach a Fμn(x)12F_\mu^n(x) \geq \frac{1}{2}. Since Fμn(x)F_\mu^n(x) is in the image of FμF_\mu, it is less than or equal to the maximum Fμ(12)F_\mu(\frac{1}{2}) taken. Thus from statement (2) of the claim we know that Fμn(x)IF_\mu^n(x) \in I. But then it follows from the Proposition above that Fμn(x)F_\mu^n(x) is forward asymptotic to pμp_\mu. But, then xx must be forward asymptotic to pμp_\mu as well.

We already know 12\frac{1}{2} is forward asymptotic to pμp_\mu since 12I\frac{1}{2} \in I. Now consider the x>12x>\frac{1}{2}. Let y=1xy=1-x, which is less than 12\frac{1}{2}. Then we know from the previous paragraph that yy is forward asymptotic to pμp_\mu. But we also have that Fμ(x)=Fμ(y)F_\mu(x)=F_\mu(y) and thus Fμn(x)=Fμn(y)F^n_\mu(x)=F^n_\mu(y) for all n1n \geq 1. Thus xx must also be forward asymptotic to pμp_\mu.

@interact def iteractive_plot(mu = slider(2, 3, 0.001, 2.5), x = slider(0, 1, 0.001, 0.9)): plt = cobweb(x, F(mu), 20, 0, 1) plt += line2d([(1/2,1/2),(2*p(mu)-1/2,2*p(mu)-1/2)],thickness=2,color="purple") return plt
SW50ZXJhY3RpdmUgZnVuY3Rpb24gPGZ1bmN0aW9uIGl0ZXJhY3RpdmVfcGxvdCBhdCAweDdmMDRjMDNjNjQ4OD4gd2l0aCAyIHdpZGdldHMKICBtdTogVHJhbnNmb3JtRmxvYXRTbGlkZXIodmHigKY=

Passing through μ=3\mu=3.

At the value of 33, the point pμp_\mu is slowly attracting.

@interact def iteractive_plot(x = slider(0, 1, 0.001, 0.9)): return cobweb(x, F(3), 200, 0, 1)
SW50ZXJhY3RpdmUgZnVuY3Rpb24gPGZ1bmN0aW9uIGl0ZXJhY3RpdmVfcGxvdCBhdCAweDdmMDRjMDNjNjJhOD4gd2l0aCAxIHdpZGdldAogIHg6IFRyYW5zZm9ybUZsb2F0U2xpZGVyKHZhbHXigKY=

Aside from looking at the cobweb plot above, a good way to convince yourself of this is to look at the square. Here we define the square Fμ2(x)F_\mu^2(x):

def F2(mu): F_mu = F(mu) def F2_mu(x): return F_mu(F_mu(x)) return F2_mu
@interact def iteractive_plot(x = slider(0, 1, 0.001, 0.9)): return cobweb(x, F2(3), 200, 0, 1)
SW50ZXJhY3RpdmUgZnVuY3Rpb24gPGZ1bmN0aW9uIGl0ZXJhY3RpdmVfcGxvdCBhdCAweDdmMDRjMDNjNmI5MD4gd2l0aCAxIHdpZGdldAogIHg6IFRyYW5zZm9ybUZsb2F0U2xpZGVyKHZhbHXigKY=

The following lets you see what happens when you vary μ\mu through the value of 33. We plot on a small interval containing pμp_\mu.

@interact def iteractive_plot(mu = slider(2.9, 3.2, 0.001, 2.95), x = slider(0.5, 0.8, 0.001, 0.73)): return cobweb(x, F(mu), 200, 0.5, 0.8)
SW50ZXJhY3RpdmUgZnVuY3Rpb24gPGZ1bmN0aW9uIGl0ZXJhY3RpdmVfcGxvdCBhdCAweDdmMDRjMDNjNjIzMD4gd2l0aCAyIHdpZGdldHMKICBtdTogVHJhbnNmb3JtRmxvYXRTbGlkZXIodmHigKY=

It is easier to see what is going on by plotting Fμ2F_\mu^2.

@interact def iteractive_plot(mu = slider(2.9, 3.2, 0.001, 2.95), x = slider(0.5, 0.8, 0.001, 0.73)): return cobweb(x, F2(mu), 100, 0.5, 0.8)
SW50ZXJhY3RpdmUgZnVuY3Rpb24gPGZ1bmN0aW9uIGl0ZXJhY3RpdmVfcGxvdCBhdCAweDdmMDRjMDFhMjhjMD4gd2l0aCAyIHdpZGdldHMKICBtdTogVHJhbnNmb3JtRmxvYXRTbGlkZXIodmHigKY=

The family of maps FμF_\mu undergoes a period-doubling bifurcation at the value c=3c=3. At values of cc slightly greater than 33, the fixed point pμp_\mu has switched to being a repelling fixed point, and a new attracting period two orbit emerges.