The following program was used to explore the estimated catastrophe models that are
analyzed in chapters 3 and 5 of Serpents in the Sand (University of Michigan Press 1995).
The program is written in Think Pascal, and it was run on a Macintosh Quadra 900. It is
capable of producing postscript output that can be sent directly to a postscript printer, or
input into a word processing program capable of accepting postscript files (such as Word).
The program is copyrighted 1995 by Courtney Brown. However, researchers may copy, paste,
and share this program freely for their own use as long as the program itself is never sold.
Simply copy and paste it into your own program editor. To understand a bit more about how
the program works, I recommend my book, Chaos and Catastrophe Theories (Sage 1995).
program catastrophe (input, output, Image1, Image2, Image3);
const
minwidth = 15;
maxsize = 1000;
maxbig = 32000;
f1name = 'ImageLyap';
f2name = 'ImageSum';
f3name = 'ImagePower';
ps1name = 'PScatcode';
matnn = 5;
matnnn = 20;
inc = 0.001;
vv2 = 2048;
nnpp = 9000;
gleft = 680;
gtop = 460;
gright = 1080;
gbottom = 860;
type
HugePtr = ^BigArray;
BigArray = array[1..200, 1..200] of real;
HugePtr2 = ^BigArray2;
BigArray2 = array[1..maxbig, 1..matnn] of real;
HugePtr3 = ^BigArray3;
BigArray3 = array[1..10000] of real;
GraphPtr = ^GraphBig;
GraphBig = array[1..maxbig, 1..matnn] of real;
RealArrayVV2 = array[1..vv2] of real;
RealArrayVV3 = array[1..1025, 1..2] of real;
RealArrayNP = array[1..nnpp] of real;
var
dim, c1, c2, d1, d2, iter, iternum, toss, lyap, kitu, limit, multiplier, lagg, again, limits: integer;
x1low, x1high, x2low, x2high, perspect, shift, mold, w1, acc, x1dlow, x1dhigh, x2dlow, x2dhigh: real;
lx1, ux1, lx2, ux2, xprim, lowp1, lowp2, highp1, highp2, rDR, timeone, expand, pi: real;
min2, max2, min3, max3, context: real;
ff1, ff2, ff3, ps1: text;
row, col, ticker, ticker2, ticker3, graphtype, traject, sasa, year, method, highlite: integer;
nn, nnn, eqnum, laggedid, count, item, anza, graphonly, series, cross, psprint: integer;
suppress, connect, condques, rotation, angle: integer;
filein: text;
y: HugePtr2;
yy: HugePtr2;
p: array[1..20] of real;
pp: array[1..20] of real;
party: array[1..4] of integer;
image1: HugePtr;
image2: HugePtr;
image3: HugePtr;
newx: GraphPtr;
fourdata: RealArrayVV2;
spectral: RealArrayVV3;
xone: array[1..1000] of real;
xlag: HugePtr3;
mx: array[1..matnnn] of real;
x: array[1..matnnn] of real;
znorm: array[1..matnn] of real;
gsc: array[1..matnn] of real;
cum: array[1..matnn] of real;
xnew: array[1..matnnn] of real;
finame: string;
r: Rect;
r2: Rect;
procedure initialize;
begin
r.left := 0;
r.top := 50;
r.right := 640;
r.bottom := 460;
SetTextRect(r);
r2.left := gleft;
r2.top := gtop;
r2.right := gright;
r2.bottom := gbottom;
SetDrawingRect(r2);
new(y);
new(yy);
new(newx);
ticker2 := 0;
laggedid := 0;
pi := 3.141549;
end;
procedure condition;
begin
p[2] := p[2] + (pp[2] * w1);
p[4] := p[4] + (pp[4] * w1);
p[5] := p[5] + (pp[5] * w1);
p[6] := p[6] + (pp[6] * w1);
p[7] := p[7] + (pp[7] * w1);
p[8] := p[8] + (pp[8] * w1);
p[9] := p[9] + (pp[9] * w1);
p[19] := p[19] + (pp[19] * w1);
end;
procedure parm1;
begin
p[2] := 0;
p[4] := 0.66407;
p[5] := -0.42078;
p[6] := 0.34843;
p[7] := 0.71071;
p[8] := 0.12868;
p[9] := 0.19019;
p[19] := 0.14762;
pp[4] := 0.81578;
pp[5] := 0.09054;
pp[6] := 0.10649;
pp[7] := 0.99656;
pp[8] := 0.20632;
pp[9] := 0.48091;
pp[19] := -1.02490;
lowp1 := 0 - expand;
highp1 := 0.42 + expand;
x1low := -10.0;
x1high := 15.0;
x1dlow := 0.5;
x1dhigh := 1.0;
x2dlow := 0.0;
x2dhigh := 0.78;
x2low := 0.0 - expand;
x2high := 0.78 + expand;
condition;
end;
procedure parm2;
begin
p[2] := 0;
p[4] := 1.20418;
p[5] := -0.51405;
p[6] := 0.15501;
p[7] := 1.13798;
p[8] := 0.20683;
p[9] := 0.19554;
p[19] := -0.50866;
pp[4] := 0.12824;
pp[5] := -0.02477;
pp[6] := -0.00479;
pp[7] := -0.06923;
pp[8] := -0.49641;
pp[9] := 0.49962;
pp[19] := 0.10608;
lowp1 := 0 - expand;
highp1 := 0.7566 + expand;
x1low := -10.0;
x1high := 15.0;
x1dlow := 0.4;
x1dhigh := 1.0;
x2dlow := 0.0;
x2dhigh := 0.65;
x2low := 0.0 - expand;
x2high := 0.65 + expand;
condition;
end;
procedure parm3;
begin
p[2] := 1;
p[5] := 5.98186;
p[6] := 0.83441;
p[7] := 1.03085;
p[8] := 0.88157;
p[9] := 0.41774;
p[10] := -0.13497;
p[11] := 1.24597;
if (condques = 1) then
context := 0;
{Republican standardized}
if (condques = 2) then
begin
context := 2;
pp[5] := -0.00334;
pp[6] := -0.04221;
pp[7] := 0.00608;
pp[8] := -0.09321;
pp[9] := -0.06038;
pp[10] := -0.11694;
pp[11] := -0.01458;
end;
{Democratic standardized}
if (condques = 3) then
begin
context := 2.7;
pp[5] := 0.001897;
pp[6] := 0.008622;
pp[7] := -0.006862;
pp[8] := 0.052890;
pp[9] := 0.066099;
pp[10] := 0.078435;
pp[11] := 0.043908;
end;
{Neighbor -3R, 0M, and 3D}
if (condques = 4) then
begin
context := 3;
pp[5] := 0.20720;
pp[6] := 0.07340;
pp[7] := -0.26706;
pp[8] := 0.03561;
pp[9] := -0.04350;
pp[10] := 0.01784;
pp[11] := 0.04216;
end;
{Rae's F nonstandardized}
if (condques = 5) then
begin
context := 3;
pp[5] := -0.002982;
pp[6] := -0.000475;
pp[7] := 0.007336;
pp[8] := 0.015913;
pp[9] := 0.036962;
pp[10] := -0.018868;
pp[11] := 0.022124;
{standardized}
context := 2.4;
context := -3.7;
pp[5] := -0.00245;
pp[6] := -0.11443;
pp[7] := -0.03304;
pp[8] := -0.10406;
pp[9] := -0.02834;
pp[10] := -0.16631;
pp[11] := -0.03693;
end;
end;
function lag (lagvar: real): real;
var
iii: integer;
begin
if (ticker3 = 1) then
begin
for iii := 1 to lagg do
begin
xlag^[iii] := lagvar;
end;
lag := lagvar;
end;
if (ticker3 > 1) then
begin
for iii := (lagg - 1) downto 1 do
begin
xlag^[(lagg - iii)] := xlag^[(lagg - iii + 1)];
end;
xlag^[(lagg)] := lagvar;
lag := xlag^[1];
end;
end;
function power (base: real; exponent: integer): real;
var
tempvar: real;
t: integer;
begin
tempvar := base;
if (exponent > 1) then
begin
for t := 1 to (exponent - 1) do
begin
tempvar := tempvar * base;
end;
end;
if (exponent < 0) then
begin
tempvar := 1 / base;
for t := 1 to (abs(exponent) - 1) do
begin
tempvar := tempvar * (1 / base);
end;
end;
if (exponent = 0) then
tempvar := 1;
power := tempvar;
end;
function powernoint (base: real; exponent: real): real;
begin
powernoint := exp(ln(base) * exponent);
end;
function eq1: real;
var
w1, w2: real;
begin
if (kitu = 1) then
eq1 := (p[2] * (power(mx[1], 3))) - (p[1] * mx[1]) + (p[3] * mx[2]);
if (kitu = 2) then
eq1 := (p[2] * (power((mx[1] - 1), 3))) + (p[1] * (mx[1] - 1)) - (p[3] * (mx[2] - 1));
if (kitu = 3) then
eq1 := ((p[2] * (power((mx[1] - 1), 3))) + (p[1] * (mx[1] - 1)) - (p[3] * (mx[2] - 1))) * (1 - mx[1]) * mx[1];
if (kitu = 4) then
eq1 := (p[19] * mx[2]) - (p[4] * mx[2] * p[1]) + (p[5] * (p[6] * (mx[1] - p[7]))) + (p[8] * (power((p[6] * (mx[1] - p[7])), 2))) + (p[9] * (power((p[6] * (mx[1] - p[7])), 3)));
{eq1 := (p[19] * mx[2]) - (p[4] * mx[2] * p[1]) + (p[5] * (p[6] * (mx[1] - p[7]))) + (p[8] * (power((p[6] * (mx[1] - p[7])), 2))) + (p[9] * (power((p[6] * (mx[1] - p[7])), 3)));}
if (kitu = 5) then
begin
{set p5=0 to get the plane, 1 otherwise.}
w1 := (1 + mx[2] - p[1]) / 2;
w2 := (mx[2] + p[1]) / 2;
eq1 := (p[5] * (p[2] * w2 * (1 - w2) * (mx[1] - p[4]) - (p[3] * power(mx[1] - p[4], 3))) + (p[6] * w1)) - mx[1];
{eq1 := (p[5] * (p[2] * (mx[1] - p[4]) - (p[3] * power(mx[1] - p[4], 3))) + w1)-mx[1];}
{eq1 := (p[5] * (p[2] * w2 * (mx[1] - p[4]) - (p[3] * power(mx[1] - p[4], 3))) + w1) - mx[1];}
{eq1 := (p[5] * (p[2] * (1 - w2) * (mx[1] - p[4]) - (p[3] * power(mx[1] - p[4], 3))) + w1)-mx[1];}
end;
if (kitu = 6) then
begin
w1 := (1 + mx[2] - p[1]) / 2;
w2 := (mx[2] + p[1]) / 2;
eq1a := (p[9] + (pp[9] * context)) * ((((p[5] + pp[5] * context) * ((p[10] + (pp[10] * context)) + w2) * (1 - (p[11] + (pp[11] * context)) * w2) * (mx[1] - (p[6] + (pp[6] * context))));
eq1 := eq1a - ((p[7] + pp[7] * context) * ((power(mx[1] - (p[6] + (pp[6] * context)), 3)))) + ((p[8] + (pp[8] * context)) * w1)) - mx[1]);
end;
end;
function eq2: real;
begin
end;
function eq3: real;
begin
end;
function eq4: real;
begin
end;
function fx (xx: real): real;
begin
mx[1] := xx;
fx := eq1;
end;
function par1x1: real;
var
it1, it2: real;
begin
mx[1] := mx[1] - inc;
if (laggedid = 1) then
mold := mold - inc;
it1 := eq1;
mx[1] := mx[1] + (2 * inc);
if (laggedid = 1) then
mold := mold + (2 * inc);
it2 := eq1;
par1x1 := (it2 - it1) / (2 * inc);
mx[1] := mx[1] - inc;
if (laggedid = 1) then
mold := mold - inc;
end;
function par1x2: real;
var
it1, it2: real;
begin
mx[2] := mx[2] - inc;
if (laggedid = 2) then
mold := mold - inc;
it1 := eq1;
mx[2] := mx[2] + (2 * inc);
if (laggedid = 2) then
mold := mold + (2 * inc);
it2 := eq1;
par1x2 := (it2 - it1) / (2 * inc);
mx[2] := mx[2] - inc;
if (laggedid = 2) then
mold := mold - inc;
end;
function par1x3: real;
var
it1, it2: real;
begin
mx[3] := mx[3] - inc;
if (laggedid = 3) then
mold := mold - inc;
it1 := eq1;
mx[3] := mx[3] + (2 * inc);
if (laggedid = 3) then
mold := mold + (2 * inc);
it2 := eq1;
par1x3 := (it2 - it1) / (2 * inc);
mx[3] := mx[3] - inc;
if (laggedid = 3) then
mold := mold - inc;
end;
function par1x4: real;
var
it1, it2: real;
begin
mx[4] := mx[4] - inc;
if (laggedid = 4) then
mold := mold - inc;
it1 := eq1;
mx[4] := mx[4] + (2 * inc);
if (laggedid = 4) then
mold := mold + (2 * inc);
it2 := eq1;
par1x4 := (it2 - it1) / (2 * inc);
mx[4] := mx[4] - inc;
if (laggedid = 4) then
mold := mold - inc;
end;
function par2x1: real;
var
it1, it2: real;
begin
mx[1] := mx[1] - inc;
if (laggedid = 1) then
mold := mold - inc;
it1 := eq2;
mx[1] := mx[1] + (2 * inc);
if (laggedid = 1) then
mold := mold + (2 * inc);
it2 := eq2;
par2x1 := (it2 - it1) / (2 * inc);
mx[1] := mx[1] - inc;
if (laggedid = 1) then
mold := mold - inc;
end;
function par2x2: real;
var
it1, it2: real;
begin
mx[2] := mx[2] - inc;
if (laggedid = 2) then
mold := mold - inc;
it1 := eq2;
mx[2] := mx[2] + (2 * inc);
if (laggedid = 2) then
mold := mold + (2 * inc);
it2 := eq2;
par2x2 := (it2 - it1) / (2 * inc);
mx[2] := mx[2] - inc;
if (laggedid = 2) then
mold := mold - inc;
end;
function par2x3: real;
var
it1, it2: real;
begin
mx[3] := mx[3] - inc;
if (laggedid = 3) then
mold := mold - inc;
it1 := eq2;
mx[3] := mx[3] + (2 * inc);
if (laggedid = 3) then
mold := mold + (2 * inc);
it2 := eq2;
par2x3 := (it2 - it1) / (2 * inc);
mx[3] := mx[3] - inc;
if (laggedid = 3) then
mold := mold - inc;
end;
function par2x4: real;
var
it1, it2: real;
begin
mx[4] := mx[4] - inc;
if (laggedid = 4) then
mold := mold - inc;
it1 := eq2;
mx[4] := mx[4] + (2 * inc);
if (laggedid = 4) then
mold := mold + (2 * inc);
it2 := eq2;
par2x4 := (it2 - it1) / (2 * inc);
mx[4] := mx[4] - inc;
if (laggedid = 4) then
mold := mold - inc;
end;
function par3x1: real;
var
it1, it2: real;
begin
mx[1] := mx[1] - inc;
if (laggedid = 1) then
mold := mold - inc;
it1 := eq3;
mx[1] := mx[1] + (2 * inc);
if (laggedid = 1) then
mold := mold + (2 * inc);
it2 := eq3;
par3x1 := (it2 - it1) / (2 * inc);
mx[1] := mx[1] - inc;
if (laggedid = 1) then
mold := mold - inc;
end;
function par3x2: real;
var
it1, it2: real;
begin
mx[2] := mx[2] - inc;
if (laggedid = 2) then
mold := mold - inc;
it1 := eq3;
mx[2] := mx[2] + (2 * inc);
if (laggedid = 2) then
mold := mold + (2 * inc);
it2 := eq3;
par3x2 := (it2 - it1) / (2 * inc);
mx[2] := mx[2] - inc;
if (laggedid = 2) then
mold := mold - inc;
end;
function par3x3: real;
var
it1, it2: real;
begin
mx[3] := mx[3] - inc;
if (laggedid = 3) then
mold := mold - inc;
it1 := eq3;
mx[3] := mx[3] + (2 * inc);
if (laggedid = 3) then
mold := mold + (2 * inc);
it2 := eq3;
par3x3 := (it2 - it1) / (2 * inc);
mx[3] := mx[3] - inc;
if (laggedid = 3) then
mold := mold - inc;
end;
function par3x4: real;
var
it1, it2: real;
begin
mx[4] := mx[4] - inc;
if (laggedid = 4) then
mold := mold - inc;
it1 := eq3;
mx[4] := mx[4] + (2 * inc);
if (laggedid = 4) then
mold := mold + (2 * inc);
it2 := eq3;
par3x4 := (it2 - it1) / (2 * inc);
mx[4] := mx[4] - inc;
if (laggedid = 4) then
mold := mold - inc;
end;
function par4x1: real;
var
it1, it2: real;
begin
mx[1] := mx[1] - inc;
if (laggedid = 1) then
mold := mold - inc;
it1 := eq4;
mx[1] := mx[1] + (2 * inc);
if (laggedid = 1) then
mold := mold + (2 * inc);
it2 := eq4;
par4x1 := (it2 - it1) / (2 * inc);
mx[1] := mx[1] - inc;
if (laggedid = 1) then
mold := mold - inc;
end;
function par4x2: real;
var
it1, it2: real;
begin
mx[2] := mx[2] - inc;
if (laggedid = 2) then
mold := mold - inc;
it1 := eq4;
mx[2] := mx[2] + (2 * inc);
if (laggedid = 2) then
mold := mold + (2 * inc);
it2 := eq4;
par4x2 := (it2 - it1) / (2 * inc);
mx[2] := mx[2] - inc;
if (laggedid = 2) then
mold := mold - inc;
end;
function par4x3: real;
var
it1, it2: real;
begin
mx[3] := mx[3] - inc;
if (laggedid = 3) then
mold := mold - inc;
it1 := eq4;
mx[3] := mx[3] + (2 * inc);
if (laggedid = 3) then
mold := mold + (2 * inc);
it2 := eq4;
par4x3 := (it2 - it1) / (2 * inc);
mx[3] := mx[3] - inc;
if (laggedid = 3) then
mold := mold - inc;
end;
function par4x4: real;
var
it1, it2: real;
begin
mx[4] := mx[4] - inc;
if (laggedid = 4) then
mold := mold - inc;
it1 := eq4;
mx[4] := mx[4] + (2 * inc);
if (laggedid = 4) then
mold := mold + (2 * inc);
it2 := eq4;
par4x4 := (it2 - it1) / (2 * inc);
mx[4] := mx[4] - inc;
if (laggedid = 4) then
mold := mold - inc;
end;
procedure initnums;
begin
count := 0;
ticker := 0;
end;
procedure post1;
begin
writeln(ps1, '150 250 translate');
writeln(ps1, '1 setlinewidth');
writeln(ps1, '/Times-Bold findfont 15 scalefont setfont');
writeln(ps1, '1 setlinejoin');
end;
procedure post2;
begin
writeln(ps1, 'stroke showpage');
end;
procedure graph;
var
k, j, width, height, transx1, transx2, switch, kwisha, fourmax, transform, diam: integer;
minx1, minx2, maxx1, maxx2, miny1, miny2, maxy1, maxy2, miny3, maxy3, axedraw1, axedraw2: real;
axeminx, axemaxx, axeminy, axemaxy, scale, labset, transx3, transx4, phi, scale1, scale2, scale3: real;
axedraw: array[1..3, 1..2] of real;
begin
width := gright - gleft;
height := gbottom - gtop;
labset := 0.05;
anza := 1;
multiplier := count + 1;
kwisha := multiplier + 7 + 6 + 3 + 1;
EraseRect(0, 0, 400, 400);
for k := anza to (multiplier - 1) do
begin
if (k = anza) then
begin
miny1 := y^[anza, 1];
maxy1 := y^[anza, 1];
miny2 := y^[anza, 2];
maxy2 := y^[anza, 2];
miny3 := y^[anza, 3];
maxy3 := y^[anza, 3];
end;
if (k > anza) then
begin
if (y^[k, 1] < miny1) then
miny1 := y^[k, 1];
if (y^[k, 1] > maxy1) then
maxy1 := y^[k, 1];
if (y^[k, 2] < miny2) then
miny2 := y^[k, 2];
if (y^[k, 2] > maxy2) then
maxy2 := y^[k, 2];
if (y^[k, 3] < miny3) then
miny3 := y^[k, 3];
if (y^[k, 3] > maxy3) then
maxy3 := y^[k, 3];
end;
end;
{Use the next two lines to set the maximum and minimum values for the vertical axis.}
{maxy1 := 1;}
{miny1 := 0;}
for k := multiplier to (multiplier + 7) do
begin
if (k = multiplier) then
begin
y^[k, 1] := miny1;
y^[k, 2] := miny2;
y^[k, 3] := miny3;
end;
if (k = multiplier + 1) then
begin
y^[k, 1] := maxy1;
y^[k, 2] := miny2;
y^[k, 3] := miny3;
end;
if (k = multiplier + 2) then
begin
y^[k, 1] := miny1;
y^[k, 2] := miny2;
y^[k, 3] := miny3;
end;
if (k = multiplier + 3) then
begin
y^[k, 1] := miny1;
y^[k, 2] := maxy2;
y^[k, 3] := miny3;
end;
if (k = multiplier + 4) then
begin
y^[k, 1] := miny1;
y^[k, 2] := miny2;
y^[k, 3] := miny3;
end;
if (k = multiplier + 5) then
begin
y^[k, 1] := miny1;
y^[k, 2] := miny2;
y^[k, 3] := maxy3;
end;
if (k = multiplier + 6) then
begin
y^[k, 1] := miny1;
y^[k, 2] := maxy2;
y^[k, 3] := maxy3;
end;
if (k = multiplier + 7) then
begin
y^[k, 1] := miny1;
y^[k, 2] := maxy2;
y^[k, 3] := miny3;
end;
end;
for k := (multiplier + 8) to (multiplier + 17) do
begin
{Y axis value labels}
if (k = multiplier + 8) then
begin
y^[k, 1] := miny1 + ((maxy1 - miny1) * 0.5 * labset);
y^[k, 2] := miny2 - ((maxy2 - miny2) * 6 * labset);
y^[k, 3] := miny3;
end;
if (k = multiplier + 9) then
begin
y^[k, 1] := maxy1 - ((maxy1 - miny1) * labset);
y^[k, 2] := miny2 - ((maxy2 - miny2) * 5 * labset);
y^[k, 3] := miny3;
end;
{X axis value labels}
if (k = multiplier + 10) then
begin
y^[k, 1] := miny1 + ((maxy1 - miny1) * 0.5 * labset);
y^[k, 2] := miny2 + ((maxy2 - miny2) * labset);
y^[k, 3] := miny3;
end;
if (k = multiplier + 11) then
begin
y^[k, 1] := miny1 - ((maxy1 - miny1) * 1.5 * labset);
y^[k, 2] := maxy2 - ((maxy2 - miny2) * 2 * labset);
y^[k, 3] := miny3;
end;
{Z axis value labels}
if (k = multiplier + 12) then
begin
y^[k, 1] := miny1;
y^[k, 2] := miny2 - ((maxy2 - miny2) * 7 * labset);
y^[k, 3] := miny3 + ((maxy3 - miny3) * 3 * labset);
end;
if (k = multiplier + 13) then
begin
y^[k, 1] := miny1;
y^[k, 2] := miny2 - ((maxy2 - miny2) * 6.5 * labset);
y^[k, 3] := maxy3;
end;
{The X-axis label}
if (k = multiplier + 14) then
begin
y^[k, 1] := miny1 - ((maxy1 - miny1) * 3 * labset);
y^[k, 2] := miny2 + ((maxy2 - miny2) * 0.5);
y^[k, 3] := miny3;
end;
{The Z-axis label}
if (k = multiplier + 15) then
begin
y^[k, 1] := miny1;
y^[k, 2] := miny2 - ((maxy2 - miny2) * 0.6);
y^[k, 3] := miny3 + ((maxy3 - miny3) * 0.7);
end;
{The Y-axis label}
if (k = multiplier + 16) then
begin
y^[k, 1] := miny1 + ((maxy1 - miny1) * 4 * labset);
y^[k, 2] := miny2 - ((maxy2 - miny2) * 3 * labset);
y^[k, 3] := miny3;
end;
{The TITLE}
if (k = multiplier + 17) then
begin
y^[k, 1] := maxy1 + 6 * labset;
y^[k, 2] := miny2 - ((maxy2 - miny2) * 5 * labset);
y^[k, 3] := miny3;
end;
end;
scale1 := (maxy1 - miny1);
scale2 := (maxy2 - miny2);
scale3 := (maxy3 - miny3);
phi := angle * (pi / 180);
for k := anza to kwisha do
begin
yy^[k, 1] := y^[k, 1] / scale1;
yy^[k, 2] := y^[k, 2] / scale2;
yy^[k, 3] := y^[k, 3] / scale3;
for j := 1 to 2 do
begin
if (j = 1) then
newx^[k, j] := yy^[k, j] + (yy^[k, 3] * perspect * cos(phi));
if (j = 2) then
newx^[k, j] := yy^[k, j] + (yy^[k, 3] * perspect * sin(phi));
if ((k = anza) and (j = 2)) then
begin
minx1 := newx^[anza, 1];
maxx1 := newx^[anza, 1];
minx2 := newx^[anza, 2];
maxx2 := newx^[anza, 2];
end;
end;
if ((k > anza) and (k < kwisha)) then
begin
if (newx^[k, 1] < minx1) then
minx1 := newx^[k, 1];
if (newx^[k, 1] > maxx1) then
maxx1 := newx^[k, 1];
if (newx^[k, 2] < minx2) then
minx2 := newx^[k, 2];
if (newx^[k, 2] > maxx2) then
maxx2 := newx^[k, 2];
end;
end;
{moveto(70, 20);}
{WriteDraw('xmin=', miny2 : 5 : 3, ' ymin=', miny1 : 5 : 3, ' zmin=', miny3 : 5 : 3);}
{moveto(70, 40);}
{WriteDraw('xmax=', maxy2 : 5 : 3, ' ymax=', maxy1 : 5 : 3, ' zmax=', maxy3 : 5 : 3);}
TextSize(12);
PenSize(1, 1);
if (psprint = 1) then
post1;
for k := anza to kwisha do
begin
transx1 := round(height - (25 + ((newx^[k, 1] - minx1) / (maxx1 - minx1)) * (height - 50)));
transx2 := round(25 + ((newx^[k, 2] - minx2) / (maxx2 - minx2)) * (width - 50));
transx3 := (25 + ((newx^[k, 1] - minx1) / (maxx1 - minx1)) * (height - 50));
transx4 := (25 + ((newx^[k, 2] - minx2) / (maxx2 - minx2)) * (width - 50));
diam := 1;
if ((y^[k, 1] >= x1dlow) and (y^[k, 1] <= x1dhigh)) then
diam := 2;
if (k < multiplier) then
begin
{PaintCircle(transx2, transx1, diam);}
if (y^[k, 5] = 1) then
begin
moveto(transx2, transx1);
WriteDraw('.');
if (highlite = 1) then
begin
if ((y^[k, 1] >= x1dlow) and (y^[k, 1] <= x1dhigh)) then
begin
TextSize(13);
WriteDraw('.');
TextSize(12);
end;
{PaintCircle(transx2, transx1, diam);}
end;
end;
if (y^[k, 5] = 2) then
begin
lineto(transx2, transx1);
end;
if (psprint = 1) then
begin
if (y^[k, 5] = 1) then
begin
writeln(ps1, transx4 : 7 : 2, ' ', transx3 : 7 : 2, ' ', 'moveto ');
writeln(ps1, '(.) show');
if (highlite = 1) then
begin
if ((y^[k, 1] >= x1dlow) and (y^[k, 1] <= x1dhigh)) then
begin
writeln(ps1, '/Helvetica-Bold findfont 25 scalefont setfont');
writeln(ps1, '(.) show');
writeln(ps1, '/Times-Bold findfont 15 scalefont setfont');
end;
end;
end;
if (y^[k, 5] = 2) then
begin
writeln(ps1, transx4 : 7 : 2, ' ', transx3 : 7 : 2, ' ', 'lineto ');
end;
end;
end;
if (k = multiplier) then
begin
moveto(transx2, transx1);
if (psprint = 1) then
begin
writeln(ps1, transx4 : 7 : 2, ' ', transx3 : 7 : 2, ' ', 'moveto ');
writeln(ps1, '/Helvetica-Bold findfont');
writeln(ps1, '15 scalefont');
writeln(ps1, 'setfont');
end;
end;
if ((k > multiplier) and (k < (multiplier + 8))) then
begin
lineto(transx2, transx1);
if (psprint = 1) then
writeln(ps1, transx4 : 7 : 2, ' ', transx3 : 7 : 2, ' ', 'lineto ');
end;
if (k > (multiplier + 7)) then
begin
moveto(transx2, transx1);
if (k = (multiplier + 8)) then
WriteDraw(miny1 : 5 : 3);
if (k = (multiplier + 9)) then
WriteDraw(maxy1 : 5 : 3);
if (k = (multiplier + 10)) then
WriteDraw(miny2 : 5 : 3);
if (k = (multiplier + 11)) then
WriteDraw(maxy2 : 5 : 3);
if (k = (multiplier + 12)) then
WriteDraw(miny3 : 5 : 3);
if (k = (multiplier + 13)) then
WriteDraw(maxy3 : 5 : 3);
if (psprint = 1) then
begin
writeln(ps1, transx4 : 7 : 2, ' ', transx3 : 7 : 2, ' ', 'moveto ');
if (k = (multiplier + 8)) then
writeln(ps1, '(', miny1 : 5 : 3, ') show');
if (k = (multiplier + 9)) then
writeln(ps1, '(', maxy1 : 5 : 3, ') show');
{if (k = (multiplier + 10)) then writeln(ps1, '(' , miny2 : 5 : 3, ') show');}
{if (k = (multiplier + 11)) then writeln(ps1, '(', maxy2 : 5 : 3, ') show');}
if (k = (multiplier + 12)) then
writeln(ps1, '(', miny3 : 5 : 3, ') show');
if (k = (multiplier + 13)) then
writeln(ps1, '(', maxy3 : 5 : 3, ') show');
if (k = (multiplier + 14)) then
begin
writeln(ps1, (transx4 - 72) : 7 : 2, ' ', (transx3 - 130) : 7 : 2, ' ', 'moveto ');
writeln(ps1, '(X AXIS RANGE=[', miny2 : 5 : 3, ', ', maxy2 : 5 : 3, ']) show ');
end;
if (k = (multiplier + 15)) then
writeln(ps1, '(Z AXIS) show ');
if (k = (multiplier + 16)) then
begin
writeln(ps1, 'gsave');
writeln(ps1, '90 rotate');
writeln(ps1, '(Y AXIS) show');
writeln(ps1, 'grestore');
end;
if (k = (multiplier + 17)) then
writeln(ps1, '(TITLE) show ');
end;
end;
if (traject = 1) then
writeln('x=', y^[k, 2] : 8 : 6, ' y=', y^[k, 1] : 8 : 6, ' z=', y^[k, 3] : 8 : 6, ' count=', y^[k, 4] : 8 : 1);
end;
if (psprint = 1) then
post2;
end;
procedure newton;
var
control1, control2, i, v, control3, newtnum, x2dim: integer;
continc1, continc2, x1next, x2next, test1, test2, x1newt, x2newt, x1save, x2save: real;
begin
x2dim := dim * 3;
newtnum := dim;
acc := 0.005;
continc1 := (x1high - x1low) / newtnum;
continc2 := (x2high - x2low) / (x2dim);
mx[1] := x1low;
mx[2] := x2low;
x1newt := mx[1];
x2save := x2low;
for control2 := 1 to (x2dim + 1) do
begin
x1newt := x1low;
x1save := x1newt;
control3 := 0;
for control1 := 1 to (newtnum + 1) do
begin
mx[1] := x1newt;
for i := 1 to 9 do
begin
x1next := mx[1] - (eq1 / par1x1);
mx[1] := x1next;
end;
test1 := abs(eq1);
test2 := abs(mx[1] - x1save);
{writeln(test1 : 8 : 5);}
if ((test1 < acc) and (test2 > acc)) then
begin
count := count + 1;
y^[count, 1] := mx[1];
y^[count, 2] := mx[2];
y^[count, 3] := p[1];
y^[count, 4] := count;
y^[count, 5] := connect;
if (limits = 1) then
begin
if (mx[1] < x1low) then
y^[count, 1] := x1low;
if (mx[1] > x1high) then
y^[count, 1] := x1high;
end;
connect := 1;
{writeln(y^[count, 1], ' ', y^[count, 2], ' ', y^[count, 3], ' ', y^[count, 4], ' p2=', p[2]);}
end;
x1save := mx[1];
x1newt := x1newt + continc1;
end;
x2save := mx[2];
mx[2] := mx[2] + continc2;
{writeln(continc2, ' ', mx[2]);}
end;
writeln('Count = ', count);
end;
function rtbis (k1, k2, xacc: real): real;
label
99;
const
jmax = 40;
var
dx, f, fmid, xmid, rtb: real;
j: integer;
begin
fmid := fx(k2);
f := fx(k1);
if f * fmid >= 0.0 then
begin
writeln('Pause in rtbis: root must be bracketed for bisection');
readln;
end;
if f < 0.0 then
begin
rtb := k2;
dx := k2 - k1;
end
else
begin
rtb := k2;
dx := k1 - k2;
end;
for j := 1 to jmax do
begin
dx := dx * 0.5;
xmid := rtb + dx;
fmid := fx(xmid);
if fmid <= 0.0 then
rtb := xmid;
if (abs(dx) < xacc) or (fmid = 0.0) then
goto 99;
end;
writeln('Pause in rtbis: too many bisections');
readln;
99:
rtbis := rtb;
end;
procedure bisect;
var
control1, control2, i, v, control3, newtnum, binum: integer;
continc1, continc2, x1next, x2next, test1, test2, x1newt, x2newt, x1save, x2save: real;
begin
binum := 20;
continc1 := (x1high - x1low) / binum;
continc2 := (x2high - x2low) / dim;
mx[1] := x1low;
mx[2] := x2low;
x1newt := mx[1];
for control2 := 1 to (dim + 1) do
begin
x1newt := x1low;
control3 := 0;
for control1 := 1 to binum do
begin
mx[1] := x1newt;
count := count + 1;
y^[count, 1] := mx[1];
y^[count, 2] := mx[2];
y^[count, 3] := p[1];
y^[count, 4] := count;
if (limits = 1) then
begin
if (mx[1] < x1low) then
y^[count, 1] := x1low;
if (mx[1] > x1high) then
y^[count, 1] := x1high;
end;
{writeln(y^[count, 1], ' ', y^[count, 2], ' ', y^[count, 3], ' ', y^[count, 4], ' p2=', p[2]);}
x1newt := x1newt + continc1;
end;
mx[2] := mx[2] + continc2;
{writeln(continc2, ' ', mx[2]);}
end;
end;
procedure answer;
var
parnum, ii: integer;
begin
writeln('What model do you want? 1-fragmentation 2-frag w/shift 3-frag w/shift&lim ');
write(' 4-Nazis 5-catvoter 6-estimated cat voter ');
readln(input, kitu);
if (kitu = 1) then
nn := 3;
write('Do you want one picture or a series? 1-one 2-series ');
readln(input, series);
write('Do you want to print the graph using a postscript file? 1-yes 2-no ');
readln(input, psprint);
write('Do you want to view the variable values? 1-yes 2-no ');
readln(input, traject);
write('Do you want a cross-section? 1-yes 2-no ');
readln(input, cross);
write('Do you want Newtons method or a bisection method? 1-Newtons 2-bisection ');
readln(input, method);
if (cross = 2) then
begin
write('Do you want a 2D or a 3D phase diagram? 0=2D 1=3D ');
readln(input, perspect);
write('What rotation angle do you want? 1=120 degrees 2-other ');
readln(input, rotation);
if (rotation = 1) then
angle := 120;
if (rotation = 2) then
begin
write(' What specific angle do you want ? ');
readln(input, angle);
end;
end;
write('Do you want vertical limits on the plot? 1-yes 2-no ');
readln(input, limits);
write('What resolution do you want on your axes? ');
readln(input, dim);
if (kitu = 4) then
begin
write('What year do you want? 1:1928-30 2:1930-32 ');
readln(input, year);
write('What is the value of the conditioning variable? ');
readln(input, w1);
write('How much do you want to expand the floor axes? Any number from 0 to ?? ');
readln(input, expand);
if (year = 1) then
parm1;
if (year = 2) then
parm2;
write('Do you want to highlight the vertical data areas? 1-yes 2-no ');
readln(input, highlite);
end;
if (series = 2) then
begin
write('For a series of plots, what is your lower value in the range for your second parameter? ');
readln(input, lowp2);
write('What is your higher value in the range for your second parameter? ');
readln(input, highp2);
end;
if (kitu <> 4) then
begin
if (kitu < 4) then
begin
write('What is your low value for variable x1? ');
readln(input, x1low);
write('What is your high value for variable x1? ');
readln(input, x1high);
write('What is your low value for variable x2? ');
readln(input, x2low);
write('What is your high value for variable x2? ');
readln(input, x2high);
if (cross = 2) then
begin
write('What is your lower value in the range for your z axis parameter? ');
readln(input, lowp1);
write('What is your higher value in the range for your z axis parameter? ');
readln(input, highp1);
end;
end;
if (kitu = 5) then
begin
write('How much do you want to expand the floor axes? Any number from 0 to ?? ');
readln(input, expand);
x1low := -1;
x1high := 2;
x2low := 0 - expand;
x2high := 1 + expand;
lowp1 := 0 - expand;
highp1 := 1 + expand;
end;
if (kitu = 6) then
begin
writeln('Hoiw do you want the model conditioned? 1-none 2-Republican 3-Democratic 4-Neighbors ');
write('5-Raes F ');
readln(input, condques);
write('How much do you want to expand the floor axes? Any number from 0 to ?? ');
readln(input, expand);
x1low := -1;
x1high := 2;
x2low := 0 - expand;
x2high := 1 + expand;
lowp1 := 0 - expand;
highp1 := 1 + expand;
parm3;
lowp2 := p[2];
highp2 := p[2];
end;
if (cross = 1) then
begin
write('What is the value of the z control variable? ');
readln(input, lowp1);
highp1 := lowp1;
perspect := 0;
end;
if (kitu <> 6) then
begin
if (series = 1) then
begin
write('What is the value of your second parameter? ');
readln(input, p[2]);
lowp2 := p[2];
highp2 := p[2];
end;
write('How many other parameters are there in the model? ');
readln(input, parnum);
for ii := 3 to (parnum + 2) do
begin
write('What is the value for parameter ', ii, ' ?');
readln(input, p[ii]);
end;
end;
end;
end;
procedure range;
var
c1, c2, dimc2, dimc1: integer;
begin
initnums;
if (series = 1) then
dimc2 := 1;
if (series = 2) then
dimc2 := dim;
if (cross = 1) then
dimc1 := 1;
if (cross = 2) then
dimc1 := dim;
for c2 := dimc2 downto 1 do
begin
count := 0;
shift := lowp2 + ((highp2 - lowp2) * ((c2 - 1) / (dim - 1)));
p[2] := shift;
ticker := ticker + 1;
if (series = 2) then
begin
writeln('p2=', p[2] : 8 : 4, ' ticker', ticker);
end;
for c1 := 1 to dimc1 do
begin
ticker2 := ticker2 + 1;
connect := 1;
p[1] := lowp1 + ((highp1 - lowp1) * ((c1 - 1) / (dim - 1)));
if (method = 1) then
newton;
if (method = 2) then
bisect;
end;
graph;
end;
end;
begin
initialize;
showtext;
showdrawing;
answer;
if (psprint = 1) then
rewrite(ps1, ps1name);
range;
if (psprint = 1) then
close(ps1);
end.
