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
|
/* -*-ePiX-*- */
#include "epix.h"
using namespace ePiX;
// a benign function
double phi(double x)
{
return x*x;
}
// and its derivative
Deriv dphi(phi);
// parameters defining an arbitrary line ell
const double slope(-2);
const double beta(0.5);
const double ht(phi(beta));
const double alpha(slope-dphi.eval(beta));
const double eps(0.02); // size of extraction
// a small perturbation to adjust the derivative
double f(double x)
{
return x/(1+16384*x*x);
}
double gn(double x)
{
return f(alpha*(x-beta));
}
// phi's Evil Twin
double psi(double x)
{
return phi(x) + gn(x);
}
// inset parameters
const P mag_ctr(P(0.75, 0.2));
const double mag_sz(0.125);
int main()
{
picture(P(0,0), P(1,0.75), "4x3in");
begin();
set_crop();
// two nearly-equal graphs, and the tangent to one of them
plain(Blue());
plot(psi, xmin(), beta-eps, 60);
plot(psi, beta+eps, xmax(), 60);
plot(psi, beta-eps, beta+eps, 60);
pen(Green(0.6));
Line(P(beta,phi(beta)), slope);
bold(Red());
plot(phi, xmin(), xmax(), 60);
plain();
// cut out a small neighborhood and magnify it
screen mag(canvas().extract_ellipse(P(beta-eps, psi(beta)-eps),
P(beta+eps, psi(beta)+eps)));
mag.backing(Yellow(0.05));
mag.border(Black(), "0.4pt");
inset(mag, mag_ctr - mag_sz*P(1,1), mag_ctr + mag_sz*P(1,1));
pen(Black());
// axes
line(P(xmin(),0), P(xmax(),0));
line(P(0,ymin()), P(0,ymax()));
// indicators
line(P(beta,0), P(beta,phi(beta)), -20); // shorten slightly
line(P(0,phi(beta)), P(beta,phi(beta)), -10);
// zoom lines
line(P(beta, phi(beta)), mag_ctr + polar(mag_sz, 2*M_PI/3), -20);
line(P(beta, phi(beta)), mag_ctr + polar(mag_sz, 5*M_PI_4), -20);
font_size("footnotesize");
label(P(beta,0), P(0,-4), "$\\beta$", b);
label(P(0,phi(beta)), P(-4,0), "$b$", l);
// use mag_ctr to place inset labels
red();
label(P(beta+0.1,phi(beta+0.1)), P(-2,2), "$\\varphi$",tl);
label(mag_ctr, P(0,6), "$\\varphi$",tr);
blue();
label(P(beta+0.1,psi(beta+0.1)), P(2,-2), "$\\psi$",br);
label(mag_ctr, P(8,-2), "$\\psi$",br);
green(0.6);
label(P(beta-0.1,ht-0.1*slope), P(2,2), "$\\ell$",tr);
label(mag_ctr, P(-12,20), "$\\ell$", bl);
black();
// a large label
label_border(Blue(), "0.2pt");
masklabel(P(0.5*(xmin()+xmax()), ymax()), P(0,0),
"\\begin{minipage}{2.25in}A graph with unexpected tangent line\\end{minipage}", b);
end();
}
|