Source code for discrete_squared_curvature_derivation_subgradient_softplus

import aerosandbox.numpy as np
from scipy import interpolate, integrate
import matplotlib.pyplot as plt
import aerosandbox.tools.pretty_plots as p
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]x_sym = s.symbols("x")
[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})")