Source code for discrete_squared_curvature_derivation_subgradient_softplus
import aerosandbox.numpy as np
import sympy as s
[docs]def func_num(x, softness=1):
return np.softmax(0, x, softness=softness)
[docs]def func_sym(x, softness=1):
return s.log(1 + s.exp(x / softness)) * softness
# return s.sqrt(x ** 2 + softness ** 2)
[docs]softness = s.Rational(1, 100)
[docs]x = np.concatenate(
[
np.sinspace(0, 200 * softness, 1000)[::-1][:-1] * -1,
np.sinspace(0, 200 * softness, 1000),
]
).astype(float)
# Discrete chirp function
[docs]f = func_num(x, softness=float(softness))
#
# f_interp = interpolate.InterpolatedUnivariateSpline(x, f, k=3)
# exact = integrate.quad(
# lambda x: f_interp.derivative(2)(x) ** 2,
# x[0], x[-1],
# epsrel=1e-6
# )[0]
[docs]f_sym = func_sym(x_sym, softness=softness)
[docs]exact = s.integrate(f_sym.diff(x_sym, 2) ** 2, (x_sym, -s.oo, s.oo))
print(f"Exact: {exact}")
# Estimate discrete
[docs]slopes = np.diff(f) / np.diff(x)
[docs]subgradients = np.diff(slopes)
[docs]discrete = np.sum(subgradients**2)
print(f"Discrete: {discrete}")
print(f"Ratio: {discrete / exact} (equiv: 1 / {exact / discrete})")