Figure 2.1:

Dynamical regimes for the planar system dx/dt = Ax, A \in \mathbb {R}^{2 x2}.

Code for Figure 2.1

Text of the GNU GPL.

main.m


  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
% the complicated planar dynamics figure()
% jbr, 9/25/2011

% axes and (trace)^2 = 4 det line

x = linspace(-5,5,101)';
y = x.*x/4;
quad = [x, y];
lines = [-5, 0, 0, -7,   0, -1.5; ...
          5, 0, 0, -2.5, 0,   10];

% stable spiral
T = -0.2;
D = (T^2+4)/4;
A = [0, sqrt(D); -sqrt(D), T];
nts = 101;
time = linspace(0,15,nts)';
x0 = [1;1];
x = zeros(2,nts);
for  i = 1:length(time);
  x(:,i) = expm(A*time(i))*x0;
end
xssp = x';


% put an arrow on the phase plot at the 11th point;
% size of arrow is adjusted by value of scale
nrow = 11;
s = "stable spiral";
% skip = 4;
% setarrow(s, nrow, skip, xssp)
s
xssp(nrow,:)


% unstable sprial; reverse time
%T = 0.2;
%D = (T^2+4)/4;
%A = [0, sqrt(D); -sqrt(D), T];
%x0 = [0.1;0.1];
x0 = [-1; -1];
x = zeros(2,nts);
for  i = 1:length(time);
  x(:,i) = expm(A*time(i))*x0;
end
xusp = x';
xusp = flipud(xusp);
% put an arrow on the phase plot 10 points from the end
nrow = size(xusp,1) - 10;
s = "unstable spiral";
% skip = 4;
% setarrow(s, nrow, skip, xusp);
s
xusp(nrow,:)


% stable node
% T = -1 + -0.5;
% D = (-1)*(-0.5);
A = [-0.5, 0; 0, -0.25];
x0 = [1;1];
x = zeros(2,nts);
for  i = 1:length(time);
  x(:,i) = expm(A*time(i))*x0;
end
x = x';
x1 = x(:,1); x2 = x(:,2);
xsno = [x, -x1, x2, -x1, -x2, x1, -x2];
% put an arrow on the phase plot at the 10th point of each IC (four of them)
nrow = 20;
s = "stable node";
%setarrow(s, nrow, skip, xsno);
s
xsno(nrow,:)

% reverse arrow direction for unstable node
nrow = 20;
s = "unstable node";
%setarrow(s, nrow, -skip, xsno);
s
xsno(nrow,:)


% unstable saddle, trace < 0
A = [-0.3, 0; 0, 0.2];
x0 = [-1;0.1];
x = zeros(2,nts);
for  i = 1:length(time);
  x(:,i) = expm(A*time(i))*x0;
end
x = x';
x1 = x(:,1); x2 = x(:,2);
xusa = [x, -x1, x2, -x1, -x2, x1, -x2];
% put an arrow on the phase plot at the 10th point of each IC (four of them)
nrow = 50;
%skip = 30;
s = "unstable saddle";
%setarrow(s, nrow, skip, xusa);
s
xusa(nrow,:)


% another unstable saddle, trace>0
A = [-0.1, 0; 0, 0.15];
x0 = [-1;0.1];
x = zeros(2,nts);
for  i = 1:length(time);
  x(:,i) = expm(A*time(i))*x0;
end
x = x';
x1 = x(:,1); x2 = x(:,2);
xusat = [x, -x1, x2, -x1, -x2, x1, -x2];
%skip = 40;
nrow = 75;
s = "unstable saddle; trace > 0";
%setarrow(s, nrow, skip, xusat);
s
xusat(nrow,:)


save "jimphase.dat" quad lines xssp xusp xsno xusa xusat

setarrow.m


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
function retval = setarrow(s, nrow, skip, x)
% print out gnuplot arrow commands
narrows = size(x,2)/2;
printf ("gnuplot arrow command -- %s\n", s)
for i = 1:narrows
  cols = (2*i-1):(2*i);
  arrowloc = [x(nrow,cols)', x(nrow+skip,cols)'];
  size = norm(arrowloc(:,1)-arrowloc(:,2));
% extend size of line so arrowhead is not clipped off by gnuplot
  arrowloc = arrowloc*[2, 0; -1, 1];
  arrowloc = arrowloc(:);
  printf ("set arrow %i from %g, %g to %g, %g filled size first %g, 15 lw 0\n", ...
           i, arrowloc, size)
end