"""Independent checks, mandatory before data publication.""" import sys,json from pathlib import Path sys.path.insert(0,str(Path(__file__).resolve().parents[1]/'src')) from rod import Rod,Controls import numpy as np from scipy.integrate import solve_bvp from scipy.optimize import brentq def run(): checks={} r=Rod(24); c=Controls(chi=.004,fx=.005,fy=.002,h=.001,k1=.3,k2=-.2,k3=.6) z=.4*np.sin(np.linspace(0,np.pi/2,r.d)); e,g,K=r.terms(z,c) eps=1e-6; eye=np.eye(r.d) gn=np.array([(r.terms(z+eps*v,c)[0]-r.terms(z-eps*v,c)[0])/(2*eps) for v in eye]) Kn=np.column_stack([(r.terms(z+eps*v,c)[1]-r.terms(z-eps*v,c)[1])/(2*eps) for v in eye]) checks['gradient_fd_max_abs']=float(np.max(np.abs(g-gn))) checks['hessian_fd_max_abs']=float(np.max(np.abs(K-Kn))) assert checks['gradient_fd_max_abs']<1e-8 and checks['hessian_fd_max_abs']<1e-8 axial=r.solve(Controls(fx=.03)) checks['axial_tip_error']=float(np.linalg.norm(axial['tip']-[1.03,0])) assert checks['axial_tip_error']<1e-12 circular=[] for n in [24,48,96]: rr=Rod(n); cc=Controls(k1=1.2,k2=1.2,k3=1.2) ans=rr.solve(cc,np.linspace(0,1.2,n+1)[1:]) exact=np.array([np.sin(1.2)/1.2,(1-np.cos(1.2))/1.2]) circular.append(float(np.linalg.norm(ans['tip']-exact))) checks['circular_tip_errors_n24_48_96']=circular assert circular[2]