Plotting life history vectors in sage

I'm teaching a math bio class where I need to plot a life history graph. The matrix equation is new=A*old, where A is a square matrix. I want to create a matrix of the population at each iteration (for say 10 iterations) and plot each column separately. I'm having trouble figuring it out and would appreciate some help.

edit retag close merge delete

Sort by ยป oldest newest most voted

One way is to define the matrix a and the list p of vectors of populations, initially containing just the vector of initial populations:

sage: a = matrix(RR, 2, [1.02, -0.01, 0.03, 1.03])
sage: p = [vector(RR, 2, [300, 200])]


then extend the list by applying a number of times the matrix to the last vector:

sage: for k in range(20):
....:     p.append(a * p[-1])


then observe the evolution of populations:

sage: p
[(300.000000000000, 200.000000000000),
(304.000000000000, 215.000000000000),
(307.930000000000, 230.570000000000),
(311.782900000000, 246.725000000000),
(315.551308000000, 263.480237000000),
(319.227531790000, 280.851183350000),
(322.803570592300, 298.853544804200),
(326.271106556104, 317.503258266095),
(329.621496104565, 336.816489210761),
(332.845761134549, 356.809628770221),
(335.934580069538, 377.499290467364),
(338.878278766255, 398.902306583471),
(341.666821275745, 421.035724143963),
(344.289800459820, 443.916800506554),
(346.736428463951, 467.562998535545),
(348.995527047875, 491.991981345530),
(351.055517775377, 517.221606597332),
(352.904412064911, 543.269920328514),
(354.529801102924, 570.155150300316),
(355.918845621980, 597.895698842414),
(357.058265545995, 626.510135176345)]


or plot it as a set of points:

sage: point2d(p)
Launched png viewer for Graphics object consisting of 1 graphics primitive


or one could color the first point in red:

sage: point2d(p[0], color='red') + point2d(p[1:])
Launched png viewer for Graphics object consisting of 2 graphics primitives


or one could use line2d instead of point2d, or one could use animate to animate the evolution.

If you want to plot the evolution of each population:

sage: x, y = zip(*p)
sage: px = list_plot(x, color='green')
sage: py = list_plot(y, color='purple')
sage: px
Launched png viewer for Graphics object consisting of 1 graphics primitive
sage: py
Launched png viewer for Graphics object consisting of 1 graphics primitive
sage: px + py
Launched png viewer for Graphics object consisting of 2 graphics primitives

more

This helps a lot. Thank you!

( 2018-04-15 21:45:13 +0100 )edit

How do I plot each column separately? This gives the first column vs the second column. Suppose I want to plot the column entries from the first column on the y-axis and the index on the x-axis.

( 2018-04-15 21:58:30 +0100 )edit

( 2018-04-15 23:14:06 +0100 )edit

Thanks so much! You've really rescued me!

( 2018-04-16 00:03:13 +0100 )edit

We need much more input to help seriously, like the size of the matrix, a concrete example of A, an example of picture you want to obtain.

Waiting for more details, here is a sample of what you can easily get:

sage: A = matrix([[2,1],[1,1]])
sage: A
[2 1]
[1 1]
sage: C = matrix([[2],[3]])
sage: C
[2]
[3]
sage: A * C
[7]
[5]
sage: L = []
sage: L = [C]
sage: for i in range(10):
....:     C = A*C
....:     L.append(C)
sage: L
[
[2]  [7]  [19]  [50]  [131]  [343]  [898]  [2351]  [6155]  [16114]
[3], [5], [12], [31], [ 81], [212], [555], [1453], [3804], [ 9959],

[42187]
[26073]
]

more

Thank you!

( 2018-04-15 21:45:18 +0100 )edit