In [1]:
from sympy import *
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

In [2]:
%matplotlib notebook
init_printing()

In [3]:
def plot_curve(r_vec, t_range, npts=100, fig=None):
"""Plot a parametric curve in R**3"""
if fig is None:
fig = plt.gcf()
ax = fig.gca(projection='3d')

x, y, z = r_vec
t_num = np.linspace(float(t_range[0]), float(t_range[1]), npts)
x_num = lambdify(t, x, "numpy")
y_num = lambdify(t, y, "numpy")
z_num = lambdify(t, z, "numpy")

ax.plot(x_num(t_num), y_num(t_num), z_num(t_num))
return ax

In [4]:
def tangent(r_vec, t):
r_vec = Matrix(r_vec)
t_vec = r_vec.diff(t)/r_vec.norm()
return simplify(t_vec)

In [5]:
def curvature(r_vec, t):
r_vec = Matrix(r_vec)
dr = r_vec.diff(t)
dr2 = r_vec.diff(t, t)
curv = sqrt(dr.dot(dr)* dr2.dot(dr2) - dr.dot(dr2)**2)/dr.dot(dr)**(S(3)/2)
return simplify(curv)

In [6]:
r, c = symbols("r c", real=True, positive=True)

In [7]:
t = symbols("t", real=True)
r_vec = (1 + cos(t), 1 + sin(t), 1 - sin(t) - cos(t))

In [8]:
plt.figure()
plot_curve(r_vec, (0, 2*pi))
plt.show()

In [9]:
curvature((r*cos(t), r*sin(t), c*t), t)

Out[9]:
$$\frac{r}{c^{2} + r^{2}}$$

In [ ]: