calculus
On this page:
- Viviani's Curve with the TNB frame
- Visualizing a parametrically defined curve orthogonal to a surface
- Newton's method animation
- Chain rule diagrams
- "The shark problem"
- Visualizing tangent planes
- Coordinate transforms
Viviani’s curve describes the intersection of a sphere and cylinder, specifically $$(x-r)^2+y^2=r^2, \quad x^2+y^2+z^2=4r^2.$$ The intersection curve can be parametrized $$x = r(1+\cos t)$$ $$y= r\sin t$$ $$z=2r\sin(\frac{t}{2})$$
begin
using Plots
r = 10
x(t) = r*(1+cos(t))
y(t) = r*sin(t)
z(t) = 2*r*sin(0.5*t)
R(t) = [x(t), y(t), z(t)]
t_range = range(-2π, 2π, length=100)
tnb_anim = @animate for t_at in t_range
plot3d(x.(t_range), y.(t_range), z.(t_range), legend=false, aspect_ratio=:equal,
xlims=(-5,25),
ylims=(-11,11),
zlims=(-21,21),
camera=(30, 15),
color=RGBA(241/255,90/255,34/255,0.5),
linewidth=5,
)
plot3d!([R(t_at)[1]], [R(t_at)[2]], [R(t_at)[3]], color=:black, marker=:circle, markersize=3, label="t = $t_at")
# T
T_hat = R'(t_at)/norm(R'(t_at))
arrow!(R(t_at), 2.5*T_hat, color=:red, label="T", linewidth=3, aspect_ratio=:equal)
# N
N_hat = cross(R'(t_at), cross(R''(t_at), R'(t_at)))/(norm(R'(t_at))*norm(cross(R''(t_at), R'(t_at))))
arrow!(R(t_at), 2.5*N_hat, color=:green, label="N", linewidth=3, aspect_ratio=:equal)
# B
B_hat = cross(T_hat,N_hat)
arrow!(R(t_at), 2.5*B_hat, color=:blue, label="B", linewidth=3, aspect_ratio=:equal)
end
gif(tnb_anim, "tnb.gif", fps=20)
end
Visualizing a parametrically defined curve orthogonal to a surface
The curve $F$ is defined parametrically by $x(t) = \frac{2(t^3+2)}{3}$, $y(t) = 2t^2$, and $z(t) = 3t-2$. The surface $G$ is defined implicitly as $15 = x^2+2y^2+3z^2$. $F$ is perpendicular to $G$ at $P = (2,2,1)$. We can prove this by finding the gradient of the two functions; if the two functions are truly perpendicular at this point, then the gradients should simply by multiples of each other.
$$\nabla \vec{G}(t) = \langle 2t^2, 4t, 3\rangle$$
$$\nabla \vec{F}(x,y,z) = \langle 2x, 4y, 6z\rangle$$
At the point $P$, $t = 1$, so we can find the gradients at $P$:
$$\nabla \vec{G}(1) = \langle 2, 4, 3\rangle$$
$$\nabla \vec{F}(2,2,1) = \langle 4, 8, 6\rangle$$
Clearly, $\nabla \vec{G}(1) = 2\nabla \vec{F}(2,2,1)$, indicating these two gradients are in the same direction, and as such, the curve $F$ is perpendicular to the surface $G$ at $P$. This can be understandably difficult to reason, so the following visualization may help.
# julia
# MATH150 Assignment 5, Problem 9a
begin
using Plots; plotly()
# general "settings"
t_range = range(0.95, stop=1.05, length = 100)
P = [2,2,1]
# F, a curve defined parametrically
x(t) = 2(t^3+2)/3
y(t) = 2t^2
z(t) = 3t-2
F_x_range = x.(t_range)
F_y_range = y.(t_range)
F_z_range = z.(t_range)
plot(F_x_range, F_y_range, F_z_range, color=RGBA(0,0,255,0.5), linewidth=3, label="F", legend=false)
# G
g(x,y) = sqrt((15-x^2-2y^2)/3)
G_x_range = range(1.9, stop=2.1, length = 100)
G_y_range = range(1.9, stop=2.1, length = 100)
# G_z_range = g.(G_x_range, G_y_range)
surface!(G_x_range, G_y_range, g, color=RGBA(255,0,0,0.5), linewidth=3, label="G", legend=true)
# plotting the point of interest
plot!(
[2],[2],[1],
marker = (:circle, 1, 0.8, :black),
label = "P(2,2,1)"
)
# I multiply each vector by a scalar to make them fit within the bounds of the functions
scalar = 0.01
# plot the gradient of G
grad_G_x(t) = 2t^2
grad_G_y(t) = 4t
grad_G_z(t) = 3
# note that t = 1 at P = (2,2,1)
plot!(
[P[1], P[1]+scalar*grad_G_x(1)],
[P[2], P[2]+scalar*grad_G_y(1)],
[P[3], P[3]+scalar*grad_G_z(1)],
color=:green,
linewidth=6,
label="grad G(2,2,1)"
)
# plot the gradient of F
grad_F_x(x,y,z) = 2x
grad_F_y(x,y,z) = 4y
grad_F_z(x,y,z) = 6z
plot!(
[2, 2+scalar*grad_F_x(P[1],P[2],P[3])],
[2, 2+scalar*grad_F_y(P[1],P[2],P[3])],
[1, 1+scalar*grad_F_z(P[1],P[2],P[3])],
color=:orange,
linewidth=6,
label="grad F(2,2,1)"
)
end
Newton’s method animation
Newton’s method animated to find the root of a function, $f(x)=x^3-2x^2-x+2$, with an initial estimate of $x = 0.15$.
$$ x_n = x_{n-1} - \frac{f(x_{n-1})}{f'(x_{n-1})} $$
# Julia
begin
using LaTeXStrings, Plots;
f(x) = x^3-2x^2-x+2
g(x) = 3x^2-4x-1
max_est = 6
true_value = 1
z = ones(max_est)
z[1] = 0.15
for i=2:max_est
z[i] = z[i-1] - f(z[i-1])/g(z[i-1])
end
newtons_methods_animation = @animate for i = 1:max_est
plot(
f,
-1, 2,
framestyle=:origin,
legend=:none,
)
plot!(
[z[i]],
[0],
color=:red, marker=:circle, markersize=5,
)
if (i > 1)
est(x) = (
g(z[i-1])*(x-z[i-1])
)+f(z[i-1])
plot!(est)
plot!(
[z[i-1], z[i-1]],
[0, f(z[i-1])],
color=:pink
)
plot!(
[z[i-1]],
[0],
color=:red,
marker=:circle,
markersize=5,
)
annotate!(
[z[i-1]],
[-0.2],
latexstring("x_{", i-1, "}"),
)
end
plot!(
[z[i], z[i]],
[0, f(z[i])],
color=:purple
)
annotate!(
[z[i]],
[0.2],
latexstring("x_{", i, "}"),
)
annotate!(
1.5,1.5,
text(
latexstring("x_", string(i), " = ", string(round(z[i],digits=3)))
)
)
annotate!(
1.5, 1,
text(
latexstring("\\% error = ", string(round(100*(abs(true_value - z[i]))/true_value, digits=3)))
)
)
ylims!(-1,2.5)
end
gif(newtons_methods_animation, "tutorial_heatmap_anim.gif", fps = 1)
end
chain rule tree diagrams
How I make trees to visualize the chain rule of derivatives (in Mathematica). I used the MaTeX
package to render the labels as latex, but this could be replace with just normal text strings.
(* mathematica *)
<< MaTeX`
Graph[
{
Labeled[1, MaTeX["z", FontSize -> 16]],
Labeled[2, MaTeX["x", FontSize -> 16]],
Labeled[3, MaTeX["y", FontSize -> 16]],
Labeled[4, MaTeX["s", FontSize -> 16]],
Labeled[5, MaTeX["t", FontSize -> 16]],
Labeled[6, MaTeX["s", FontSize -> 16]],
Labeled[7, MaTeX["t", FontSize -> 16]]
},
{
1 <-> 2,
2 <-> 4,
1 <-> 3,
2 <-> 5,
3 <-> 6,
3 <-> 7
},
EdgeLabels -> {
1 <-> 2 ->
MaTeX["\\frac{\partial z}{\partial x}", FontSize -> 16],
2 <-> 4 ->
MaTeX["\\frac{\partial x}{\partial s}", FontSize -> 16],
1 <-> 3 ->
MaTeX["\\frac{\partial z}{\partial y}", FontSize -> 16],
2 <-> 5 ->
MaTeX["\\frac{\partial x}{\partial t}", FontSize -> 16],
3 <-> 6 ->
MaTeX["\\frac{\partial y}{\partial s}", FontSize -> 16],
3 <-> 7 -> MaTeX["\\frac{\partial y}{\partial t}", FontSize -> 16]
},
GraphLayout -> "LayeredEmbedding",
EdgeStyle -> {
1 <-> 2 -> Red,
2 <-> 4 -> Red,
1 <-> 3 -> Red,
2 <-> 5 -> Gray,
3 <-> 6 -> Red,
3 <-> 7 -> Gray
},
VertexSize -> 0.05,
VertexStyle -> LightPurple
]
“the shark problem” From the James Stewart Calculus book (pg. 985, no. 2).
“Marine biologists have determined that when a shark detects the presence of blood in the water, it will swim in the direction in which the concentration of the blood increases most rapidly. Based on certain tests, the concentration of blood (in parts per million) at a point $P(x,y)$ on the surface of seawater is approximated by $$C(x,y) = e^{\frac{-(x^2+2y^2)}{10^4}}$$ where $x$ and $y$ are measured in meters in a rectangular coordinate system with the blood source at the origin."
The graph below represents the situation, where $T(x)$ is the function of the direction that the shark will take given a particular starting point $P(x_0,y_0)$.
begin
using Plots, LaTeXStrings; pyplot()
# initial condition
x_0 = 8
y_0 = -2
# the "concentration of blood" on the surface of the water
C(x,y) = ℯ^(-(x^2+2y^2)/(10^4))
x_range = -10:0.1:10
y_range = -10:0.1:10
C_range = [C(x,y) for x in x_range, y in y_range]
contourf(
x_range,
y_range,
C_range,
color=:vikO,
levels=20,
dpi=300
)
t(x) = (y_0/(x_0)^2)*x^2
t_range = t.(x_range)
z_path_range = C.(x_range, t_range)
plot!(
x_range,
t_range,
color=:gray,
linewidth = 2,
label=L"T(x)"
)
plot!(
[x_0],
[y_0],
color = :black,
markersize = 4,
marker = :circle,
label = L"P(x_0, y_0)"
)
xlims!(-10,10)
ylims!(-10,10)
end
tangent plane of a function of $x$ and $y$
Finding the tangent plane of: $$f(x,y) = 4x^2+4xy+y^2+2x+5y+3$$ at: $$(x_0,y_0,z_0) = (-3,1,27)$$
$$ t(x,y) - z_0 = \frac{\partial f}{\partial x}(x,y)(x-x_0) + \frac{\partial f}{\partial y}(x,y)(y-y_0) $$ $$t(x,y) = -18x-5y-22$$
# Julia
begin
using Plots;
plotly()
transparent_red = RGBA(200/255,60/255,60/255,200/255)
transparent_gray = RGBA(30/255,30/255,30/255,230/255)
abc(x,y) = 4x^2+4x*y+y^2+2x+5y+3
x_range = range(-10,stop=10,length=100)
surface(
x_range,
x_range,
abc,
color = transparent_red,
label = "f(x,y)",
legend = :none
)
surface!(
x_range,
x_range,
(x,y) -> -18x-5y-22,
color = transparent_gray,
label = "t(x,y)"
)
plot!(
[-3], [1], [27],
color=:blue,
marker=:circle,
markersize=2,
label = "point"
)
end
tangent plane of a parametric function
Given a sphere defined parametrically as a function $F(x,y,z)$:
$$x = r\cos\theta\sin\phi$$ $$y = r\cos\theta\cos\phi$$ $$z = r\sin\theta$$
where $r$ is the radius of the sphere, $\theta$ is the polar angle (along the $x-z$ plane), and $\phi$ is the azimuthal angle (along the $x-y$ plane). Since $x$, $y$, and $z$ are all functions of $\theta$ and $\phi$, we can define a vector function $G(\theta,\phi)$:
$$G(\theta,\phi) = \langle x(\theta,\phi), y(\theta,\phi), z(\theta,\phi)\rangle$$ $$=\langle r\cos\theta\sin\phi,\cos\theta\cos\phi,r\sin\theta \rangle$$
Taking the derivative of $G$ with respect to $\theta$ and $\phi$:
$$G_{\theta} = \langle -r\sin\theta\sin\phi, -r\sin\theta\cos\phi, r\cos\theta\rangle$$ $$G_{\phi} = \langle r\cos\theta\cos\phi, -r\cos\theta\sin\phi, 0\rangle$$
These functions represent vectors, clearly, and are tangent to the sphere at some point, say, $P(\theta_0, \phi_0)$. Intuitively, we can find the equation for a normal line to the sphere at $P$ by taking the cross product of $G_{\theta}$ and $G_{\phi}$, as this yields the vector normal to both:
$$G_{\perp} = G_{\theta}\times G_{\phi} = \langle r^2 \cos \theta \sin \theta \sin \phi, -r^2 \cos \theta \sin \theta \cos \phi, -r^2 \cos^2 \theta\rangle$$
The tangent plane to the sphere at $P$, intuitively, is also normal to this vector. Thus, we can find an equation for the plane by taking the dot product of the normal vector with the corresponding $(x_0,y_0,z_0)$ to $P$:
$$0 = G_{\perp} \cdot \langle x-x_0, y-y_0, z-z_0 \rangle$$
$$0 = r^2 \cos \theta \sin \theta \sin \phi (x-x_0) -r^2 \cos \theta \sin \theta \cos \phi (y-y_0) -r^2 \cos^2 \theta (z-z_0) $$
Rearranging for $z$ as a function of $x$ and $y$:
$$z = \frac{r^2 \cos \theta \sin \theta \sin \phi (x-x_0) -r^2 \cos \theta \sin \theta \cos \phi (y-y_0)}{r^2 \cos^2 \theta} -z_0 $$
For instance, take $P = (x,y,z) = (1,1,\sqrt{2})$. The tangent plane at this point, simplified:
$$z = \frac{1}{2}x + \frac{1}{2}y - \sqrt{2}$$
# Julia
begin
using Plots; plotly()
# radius of the sphere
r = 2
# point to find the tangent at
x_0 = 1
y_0 = 1
# working with square roots is a little finicky...
z_0 = -sqrt(2)
# parametric equations of the sphere in terms of theta and phi
x_sphere(theta, phi) = r*cos(theta) * sin(phi)
y_sphere(theta, phi) = r*cos(theta) * cos(phi)
z_sphere(theta, phi) = r*sin(theta)
# the corresponding theta and phi to the point (x_0, y_0, z_0)
theta_param = asin(z_0/r)
phi_param = acos(y_0 / (r * cos(theta_param)))
# range of theta and phi to plot the sphere
theta_range =range(-2pi, stop=2pi, length=100)
phi_range = range(-2pi, stop=2pi, length=100)
# plot ranges for sphere
x_range_sphere = [x_sphere(t, p) for t in theta_range, p in phi_range]
y_range_sphere = [y_sphere(t, p) for t in theta_range, p in phi_range]
z_range_sphere = [z_sphere(t, p) for t in theta_range, p in phi_range]
# sphere plot
surface(
x_range_sphere,
y_range_sphere,
z_range_sphere,
label="Sphere",
color=RGBA(172/255, 39/255, 245/255, 1),
legend=:none
)
# derivatives the parametric equations of the sphere:
# in terms of theta
d_theta_x(theta, phi) = -r*sin(theta) * sin(phi)
d_theta_y(theta, phi) = -r*sin(theta) * cos(phi)
d_theta_z(theta, phi) = r*cos(theta)
# in terms of phi
d_phi_x(theta, phi) = r*cos(theta) * cos(phi)
d_phi_y(theta, phi) = -r*cos(theta) * sin(phi)
d_phi_z(theta, phi) = 0
# a vector of "d_theta" of the sphere at the point (x_0, y_0, z_0)
d_theta_vec = [
d_theta_x(theta_param, phi_param),
d_theta_y(theta_param, phi_param),
d_theta_z(theta_param, phi_param)
]
# a vector of "d_phi" of the sphere at the point (x_0, y_0, z_0)
d_phi_vec = [
d_phi_x(theta_param, phi_param),
d_phi_y(theta_param, phi_param),
d_phi_z(theta_param, phi_param)
]
# plotting the respective tangent vectors
plot!(
[x_0-d_theta_vec[1], x_0],
[y_0-d_theta_vec[2], y_0],
[-z_0+d_theta_vec[3], -z_0],
label="Tangent Vector, theta",
color=RGBA(0/255, 255, 0/255, 1)
)
plot!(
[x_0, x_0 + d_phi_vec[1]],
[y_0, y_0 + d_phi_vec[2]],
[-z_0, -z_0 + d_phi_vec[3]],
label="Tangent Vector, phi",
color=RGBA(255, 0/255, 0/255, 1)
)
# the cross product of the two vectors above
# this returns the line normal to the sphere at the point (x_0, y_0, z_0)
d_cross = cross( d_theta_vec, d_phi_vec )
plot!(
[x_0, x_0+d_cross[1]],
[y_0, y_0+d_cross[2]],
[-z_0, -z_0-d_cross[3]],
label="Normal Vector",
color=RGBA(0/255, 0/255, 255, 1)
)
# the tangent plane: dot product of the cross product
tangent_plane(x,y) = (
d_cross[1]*(x-x_0) +
d_cross[2]*(y-y_0) -
d_cross[3]*z_0
)/d_cross[3]
# range of the tangent to plot
x_range_tangent = range(-3, stop=3, length=100)
y_range_tangent = range(-3, stop=3, length=100)
z_range_tangent = [tangent_plane(a,b) for a in x_range_tangent, b in y_range_tangent]
# plot tangent
surface!(
x_range_tangent,
y_range_tangent,
z_range_tangent,
label="Tangent Plane",
color=RGBA(0, 0, 0, 0.3)
)
end
Coordinate Transformations Visualization
A nice Mathematica plot of a coordinate transformation.
(* Mathematica *)
Plot[
Piecewise[{{1 x, 1.5 > x > 0}}, {{0, x > 1.5}}],
{x, 0, 4},
TicksStyle -> Directive[Opacity[0]],
PlotStyle -> Red,
PlotRange -> {{0, 4}, {0, 5}},
Epilog -> {
Opacity[0.25], Gray,
Polygon[{{1.5, 1.5}, {2.5, 2.25}, {3, 5}, {2, 4.25}}],
Black, Text[MaTeX["\\text{d}A"], {2.4, 2.8}],
Opacity[1],
Text[MaTeX["\\vec{R}"], {0.75, 0.4}],
Arrow[{{1.5, 1.5}, {3, 5}}],
Text[MaTeX["\\vec{\\nabla R}"], {2.1, 3.4}],
Blue, Arrow[{{1.5, 1.5}, {2.5, 2.25}}],
Arrow[{{2, 4.25}, {3, 5}}],
Orange, Arrow[{{2.5, 2.25}, {3, 5}}],
Arrow[{{1.5, 1.5}, {2, 4.25}}],
Text[MaTeX["\\frac{\\partial R}{\\partial u}\\text{d}u"], {2.1,
1.4}],
Text[MaTeX["\\frac{\\partial R}{\\partial v}\\text{d}v"], {1.5,
3.1}]
}
]