splinekit 0.2.2__tar.gz → 0.2.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. {splinekit-0.2.2 → splinekit-0.2.4}/PKG-INFO +6 -4
  2. {splinekit-0.2.2 → splinekit-0.2.4}/README.md +5 -3
  3. {splinekit-0.2.2 → splinekit-0.2.4}/docs/demos/bspline/bspline_bases.rst +18 -18
  4. {splinekit-0.2.2 → splinekit-0.2.4}/docs/demos/bspline/bspline_inverse.rst +2 -2
  5. {splinekit-0.2.2 → splinekit-0.2.4}/docs/demos/bspline/bspline_members.rst +1 -1
  6. {splinekit-0.2.2 → splinekit-0.2.4}/docs/demos/bspline/bspline_poles.rst +5 -5
  7. {splinekit-0.2.2 → splinekit-0.2.4}/docs/demos/bspline/bspline_stability.rst +2 -2
  8. {splinekit-0.2.2 → splinekit-0.2.4}/docs/demos/bspline/hello_bspline.rst +1 -1
  9. {splinekit-0.2.2 → splinekit-0.2.4}/docs/demos/bspline/spline_engineer_func.rst +2 -2
  10. {splinekit-0.2.2 → splinekit-0.2.4}/docs/demos/bspline/spline_vs_poly.rst +13 -13
  11. {splinekit-0.2.2 → splinekit-0.2.4}/docs/demos/padding/padding.rst +14 -0
  12. {splinekit-0.2.2 → splinekit-0.2.4}/docs/demos/spline1d/bounds.rst +7 -5
  13. {splinekit-0.2.2 → splinekit-0.2.4}/docs/demos/spline1d/constructors.rst +5 -5
  14. {splinekit-0.2.2 → splinekit-0.2.4}/docs/demos/spline1d/evaluation.rst +13 -7
  15. {splinekit-0.2.2 → splinekit-0.2.4}/docs/demos/spline1d/polynomials.rst +4 -4
  16. {splinekit-0.2.2 → splinekit-0.2.4}/docs/demos/spline1d/random1d.rst +1 -1
  17. {splinekit-0.2.2 → splinekit-0.2.4}/docs/demos/spline1d/random2d.rst +2 -2
  18. {splinekit-0.2.2 → splinekit-0.2.4}/docs/glossary/glossary-splines.rst +1 -1
  19. {splinekit-0.2.2 → splinekit-0.2.4}/docs/index.rst +1 -1
  20. {splinekit-0.2.2 → splinekit-0.2.4}/pyproject.toml +1 -1
  21. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/bases.py +2 -2
  22. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/bsplines.py +2 -2
  23. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/periodic_spline_1d.py +12 -12
  24. {splinekit-0.2.2 → splinekit-0.2.4}/.github/workflows/deploy-docs.yml +0 -0
  25. {splinekit-0.2.2 → splinekit-0.2.4}/.github/workflows/release.yml +0 -0
  26. {splinekit-0.2.2 → splinekit-0.2.4}/.github/workflows/test.yml +0 -0
  27. {splinekit-0.2.2 → splinekit-0.2.4}/.gitignore +0 -0
  28. {splinekit-0.2.2 → splinekit-0.2.4}/.jupyterlite.doit.db +0 -0
  29. {splinekit-0.2.2 → splinekit-0.2.4}/.virtual_documents/docs/tutorial/dummy.ipynb +0 -0
  30. {splinekit-0.2.2 → splinekit-0.2.4}/CMakeLists.txt +0 -0
  31. {splinekit-0.2.2 → splinekit-0.2.4}/LICENSE +0 -0
  32. {splinekit-0.2.2 → splinekit-0.2.4}/_output/api/translations/all.json +0 -0
  33. {splinekit-0.2.2 → splinekit-0.2.4}/_output/api/translations/en.json +0 -0
  34. {splinekit-0.2.2 → splinekit-0.2.4}/_output/api/workspaces/all.json +0 -0
  35. {splinekit-0.2.2 → splinekit-0.2.4}/_output/bootstrap.js +0 -0
  36. {splinekit-0.2.2 → splinekit-0.2.4}/_output/config-utils.js +0 -0
  37. {splinekit-0.2.2 → splinekit-0.2.4}/_output/consoles/favicon.ico +0 -0
  38. {splinekit-0.2.2 → splinekit-0.2.4}/_output/consoles/index.html +0 -0
  39. {splinekit-0.2.2 → splinekit-0.2.4}/_output/consoles/jupyter-lite.ipynb +0 -0
  40. {splinekit-0.2.2 → splinekit-0.2.4}/_output/consoles/jupyter-lite.json +0 -0
  41. {splinekit-0.2.2 → splinekit-0.2.4}/_output/consoles/package.json +0 -0
  42. {splinekit-0.2.2 → splinekit-0.2.4}/_output/doc/tree/index.html +0 -0
  43. {splinekit-0.2.2 → splinekit-0.2.4}/_output/doc/workspaces/index.html +0 -0
  44. {splinekit-0.2.2 → splinekit-0.2.4}/_output/edit/favicon.ico +0 -0
  45. {splinekit-0.2.2 → splinekit-0.2.4}/_output/edit/index.html +0 -0
  46. {splinekit-0.2.2 → splinekit-0.2.4}/_output/edit/jupyter-lite.ipynb +0 -0
  47. {splinekit-0.2.2 → splinekit-0.2.4}/_output/edit/jupyter-lite.json +0 -0
  48. {splinekit-0.2.2 → splinekit-0.2.4}/_output/edit/package.json +0 -0
  49. {splinekit-0.2.2 → splinekit-0.2.4}/_output/extensions/jupyterlab-jupytext/install.json +0 -0
  50. {splinekit-0.2.2 → splinekit-0.2.4}/_output/extensions/jupyterlab-jupytext/package.json +0 -0
  51. {splinekit-0.2.2 → splinekit-0.2.4}/_output/extensions/jupyterlab-jupytext/schemas/jupyterlab-jupytext/package.json.orig +0 -0
  52. {splinekit-0.2.2 → splinekit-0.2.4}/_output/extensions/jupyterlab-jupytext/schemas/jupyterlab-jupytext/plugin.json +0 -0
  53. {splinekit-0.2.2 → splinekit-0.2.4}/_output/extensions/jupyterlab-jupytext/static/48.0570848d2b31a5354b7d.js +0 -0
  54. {splinekit-0.2.2 → splinekit-0.2.4}/_output/extensions/jupyterlab-jupytext/static/48.0570848d2b31a5354b7d.js.LICENSE.txt +0 -0
  55. {splinekit-0.2.2 → splinekit-0.2.4}/_output/extensions/jupyterlab-jupytext/static/509.d51a8122d1920ac82323.js +0 -0
  56. {splinekit-0.2.2 → splinekit-0.2.4}/_output/extensions/jupyterlab-jupytext/static/720.094c38d70b1dec0ceea7.js +0 -0
  57. {splinekit-0.2.2 → splinekit-0.2.4}/_output/extensions/jupyterlab-jupytext/static/remoteEntry.94495aac41d2fef6ad41.js +0 -0
  58. {splinekit-0.2.2 → splinekit-0.2.4}/_output/extensions/jupyterlab-jupytext/static/style.js +0 -0
  59. {splinekit-0.2.2 → splinekit-0.2.4}/_output/extensions/jupyterlab-jupytext/static/third-party-licenses.json +0 -0
  60. {splinekit-0.2.2 → splinekit-0.2.4}/_output/extensions/jupyterlab_pygments/install.json +0 -0
  61. {splinekit-0.2.2 → splinekit-0.2.4}/_output/extensions/jupyterlab_pygments/package.json +0 -0
  62. {splinekit-0.2.2 → splinekit-0.2.4}/_output/extensions/jupyterlab_pygments/static/568.1e2faa2ba0bbe59c4780.js +0 -0
  63. {splinekit-0.2.2 → splinekit-0.2.4}/_output/extensions/jupyterlab_pygments/static/747.67662283a5707eeb4d4c.js +0 -0
  64. {splinekit-0.2.2 → splinekit-0.2.4}/_output/extensions/jupyterlab_pygments/static/remoteEntry.5cbb9d2323598fbda535.js +0 -0
  65. {splinekit-0.2.2 → splinekit-0.2.4}/_output/extensions/jupyterlab_pygments/static/style.js +0 -0
  66. {splinekit-0.2.2 → splinekit-0.2.4}/_output/extensions/jupyterlab_pygments/static/third-party-licenses.json +0 -0
  67. {splinekit-0.2.2 → splinekit-0.2.4}/_output/icon-120x120.png +0 -0
  68. {splinekit-0.2.2 → splinekit-0.2.4}/_output/icon-512x512.png +0 -0
  69. {splinekit-0.2.2 → splinekit-0.2.4}/_output/index.html +0 -0
  70. {splinekit-0.2.2 → splinekit-0.2.4}/_output/jupyter-lite.ipynb +0 -0
  71. {splinekit-0.2.2 → splinekit-0.2.4}/_output/jupyter-lite.json +0 -0
  72. {splinekit-0.2.2 → splinekit-0.2.4}/_output/jupyterlite.schema.v0.json +0 -0
  73. {splinekit-0.2.2 → splinekit-0.2.4}/_output/lab/favicon.ico +0 -0
  74. {splinekit-0.2.2 → splinekit-0.2.4}/_output/lab/index.html +0 -0
  75. {splinekit-0.2.2 → splinekit-0.2.4}/_output/lab/jupyter-lite.ipynb +0 -0
  76. {splinekit-0.2.2 → splinekit-0.2.4}/_output/lab/jupyter-lite.json +0 -0
  77. {splinekit-0.2.2 → splinekit-0.2.4}/_output/lab/package.json +0 -0
  78. {splinekit-0.2.2 → splinekit-0.2.4}/_output/lab/tree/index.html +0 -0
  79. {splinekit-0.2.2 → splinekit-0.2.4}/_output/lab/workspaces/index.html +0 -0
  80. {splinekit-0.2.2 → splinekit-0.2.4}/_output/manifest.webmanifest +0 -0
  81. {splinekit-0.2.2 → splinekit-0.2.4}/_output/notebooks/favicon.ico +0 -0
  82. {splinekit-0.2.2 → splinekit-0.2.4}/_output/notebooks/index.html +0 -0
  83. {splinekit-0.2.2 → splinekit-0.2.4}/_output/notebooks/jupyter-lite.ipynb +0 -0
  84. {splinekit-0.2.2 → splinekit-0.2.4}/_output/notebooks/jupyter-lite.json +0 -0
  85. {splinekit-0.2.2 → splinekit-0.2.4}/_output/notebooks/package.json +0 -0
  86. {splinekit-0.2.2 → splinekit-0.2.4}/_output/package.json +0 -0
  87. {splinekit-0.2.2 → splinekit-0.2.4}/_output/repl/index.html +0 -0
  88. {splinekit-0.2.2 → splinekit-0.2.4}/_output/repl/jupyter-lite.ipynb +0 -0
  89. {splinekit-0.2.2 → splinekit-0.2.4}/_output/repl/jupyter-lite.json +0 -0
  90. {splinekit-0.2.2 → splinekit-0.2.4}/_output/repl/package.json +0 -0
  91. {splinekit-0.2.2 → splinekit-0.2.4}/_output/service-worker.js +0 -0
  92. {splinekit-0.2.2 → splinekit-0.2.4}/_output/static/favicons/favicon-busy-1.ico +0 -0
  93. {splinekit-0.2.2 → splinekit-0.2.4}/_output/static/favicons/favicon-busy-2.ico +0 -0
  94. {splinekit-0.2.2 → splinekit-0.2.4}/_output/static/favicons/favicon-busy-3.ico +0 -0
  95. {splinekit-0.2.2 → splinekit-0.2.4}/_output/static/favicons/favicon-file.ico +0 -0
  96. {splinekit-0.2.2 → splinekit-0.2.4}/_output/static/favicons/favicon-notebook.ico +0 -0
  97. {splinekit-0.2.2 → splinekit-0.2.4}/_output/static/favicons/favicon-terminal.ico +0 -0
  98. {splinekit-0.2.2 → splinekit-0.2.4}/_output/static/favicons/favicon.ico +0 -0
  99. {splinekit-0.2.2 → splinekit-0.2.4}/_output/tree/favicon.ico +0 -0
  100. {splinekit-0.2.2 → splinekit-0.2.4}/_output/tree/index.html +0 -0
  101. {splinekit-0.2.2 → splinekit-0.2.4}/_output/tree/jupyter-lite.ipynb +0 -0
  102. {splinekit-0.2.2 → splinekit-0.2.4}/_output/tree/jupyter-lite.json +0 -0
  103. {splinekit-0.2.2 → splinekit-0.2.4}/_output/tree/package.json +0 -0
  104. {splinekit-0.2.2 → splinekit-0.2.4}/ansi_c/spline_padding/src/spline_padding.c +0 -0
  105. {splinekit-0.2.2 → splinekit-0.2.4}/ansi_c/spline_padding/src/spline_padding.h +0 -0
  106. {splinekit-0.2.2 → splinekit-0.2.4}/dev/ANSI-C/spline_padding_cmake/CMakeLists.txt +0 -0
  107. {splinekit-0.2.2 → splinekit-0.2.4}/dev/ANSI-C/spline_padding_cmake/spline_padding.c +0 -0
  108. {splinekit-0.2.2 → splinekit-0.2.4}/dev/ANSI-C/spline_padding_cmake/spline_padding.h +0 -0
  109. {splinekit-0.2.2 → splinekit-0.2.4}/dev/ANSI-C/spline_padding_xcode/libspline_padding.dylib +0 -0
  110. {splinekit-0.2.2 → splinekit-0.2.4}/dev/ANSI-C/spline_padding_xcode/spline_padding.c +0 -0
  111. {splinekit-0.2.2 → splinekit-0.2.4}/dev/ANSI-C/spline_padding_xcode/spline_padding.h +0 -0
  112. {splinekit-0.2.2 → splinekit-0.2.4}/dev/ANSI-C/spline_padding_xcode/spline_padding.xcodeproj/project.pbxproj +0 -0
  113. {splinekit-0.2.2 → splinekit-0.2.4}/dev/ANSI-C/spline_padding_xcode/spline_padding.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  114. {splinekit-0.2.2 → splinekit-0.2.4}/dev/ANSI-C/spline_padding_xcode/spline_padding.xcodeproj/project.xcworkspace/xcuserdata/pthevena.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  115. {splinekit-0.2.2 → splinekit-0.2.4}/dev/ANSI-C/spline_padding_xcode/spline_padding.xcodeproj/xcuserdata/pthevena.xcuserdatad/xcschemes/xcschememanagement.plist +0 -0
  116. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_annihilate.ipynb +0 -0
  117. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_cardinal.ipynb +0 -0
  118. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_convolve_mono.ipynb +0 -0
  119. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_dual.ipynb +0 -0
  120. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_dual_property.ipynb +0 -0
  121. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_gauss_exo.ipynb +0 -0
  122. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_hello.ipynb +0 -0
  123. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_hello_grad.ipynb +0 -0
  124. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_hello_integral.ipynb +0 -0
  125. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_inv.ipynb +0 -0
  126. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_m_scale.ipynb +0 -0
  127. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_member.ipynb +0 -0
  128. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_member_diff.ipynb +0 -0
  129. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_member_integral.ipynb +0 -0
  130. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_numeric_stability.ipynb +0 -0
  131. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_ortho.ipynb +0 -0
  132. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_ortho_property.ipynb +0 -0
  133. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_partition_mono.ipynb +0 -0
  134. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_periodic_inv.ipynb +0 -0
  135. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_poles.ipynb +0 -0
  136. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_sinc.ipynb +0 -0
  137. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_spline_poly.ipynb +0 -0
  138. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_trigo_exo.ipynb +0 -0
  139. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_vs_cos.ipynb +0 -0
  140. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_vs_erf.ipynb +0 -0
  141. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_vs_exp.ipynb +0 -0
  142. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_vs_pi_as_sum.ipynb +0 -0
  143. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_vs_pi_at0.ipynb +0 -0
  144. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/bspline_vs_sin.ipynb +0 -0
  145. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/padding_data.ipynb +0 -0
  146. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/padding_speed.ipynb +0 -0
  147. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/spline_approximation.ipynb +0 -0
  148. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/spline_at_array.ipynb +0 -0
  149. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/spline_at_scalar.ipynb +0 -0
  150. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/spline_bounds.ipynb +0 -0
  151. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/spline_evaluation_speed.ipynb +0 -0
  152. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/spline_interpolation.ipynb +0 -0
  153. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/spline_polynomials.ipynb +0 -0
  154. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/spline_random_1d.ipynb +0 -0
  155. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Jupyter/spline_random_2d.ipynb +0 -0
  156. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Wolfram/Bspline Poles.nb +0 -0
  157. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Wolfram/IntervalChecks.nb +0 -0
  158. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Wolfram/PeriodicSplinesChecks.nb +0 -0
  159. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Wolfram/SplinePaddingChecks.nb +0 -0
  160. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Wolfram/Test BSplines.nb +0 -0
  161. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Wolfram/Test PeriodicNonuniformPiecewise.nb +0 -0
  162. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Wolfram/Test PeriodicSpline1D.nb +0 -0
  163. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Wolfram/Test SplinePadding.nb +0 -0
  164. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Wolfram/Test SplineUtilities.nb +0 -0
  165. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Wolfram/Verify doc.nb +0 -0
  166. {splinekit-0.2.2 → splinekit-0.2.4}/dev/Wolfram/rescued Test SplinePadding.nb +0 -0
  167. {splinekit-0.2.2 → splinekit-0.2.4}/dev/cpJupyter.sh +0 -0
  168. {splinekit-0.2.2 → splinekit-0.2.4}/dev/gzJupyter.sh +0 -0
  169. {splinekit-0.2.2 → splinekit-0.2.4}/dev/sk.numbers +0 -0
  170. {splinekit-0.2.2 → splinekit-0.2.4}/dev/zipJupyter.sh +0 -0
  171. {splinekit-0.2.2 → splinekit-0.2.4}/docs/.jupyterlite.doit.db +0 -0
  172. {splinekit-0.2.2 → splinekit-0.2.4}/docs/_static/custom.css +0 -0
  173. {splinekit-0.2.2 → splinekit-0.2.4}/docs/bases/01_bases.rst +0 -0
  174. {splinekit-0.2.2 → splinekit-0.2.4}/docs/bases/index.rst +0 -0
  175. {splinekit-0.2.2 → splinekit-0.2.4}/docs/bases/noxfile.py +0 -0
  176. {splinekit-0.2.2 → splinekit-0.2.4}/docs/bsplines/01_bsplines.rst +0 -0
  177. {splinekit-0.2.2 → splinekit-0.2.4}/docs/bsplines/index.rst +0 -0
  178. {splinekit-0.2.2 → splinekit-0.2.4}/docs/bsplines/noxfile.py +0 -0
  179. {splinekit-0.2.2 → splinekit-0.2.4}/docs/conf.py +0 -0
  180. {splinekit-0.2.2 → splinekit-0.2.4}/docs/demos/bspline/bspline_m_scale.rst +0 -0
  181. {splinekit-0.2.2 → splinekit-0.2.4}/docs/demos/bspline/bspline_numeric_stability.ipynb.gz +0 -0
  182. {splinekit-0.2.2 → splinekit-0.2.4}/docs/demos/bspline/bspline_vs_pi.rst +0 -0
  183. {splinekit-0.2.2 → splinekit-0.2.4}/docs/demos/bspline/index.rst +0 -0
  184. {splinekit-0.2.2 → splinekit-0.2.4}/docs/demos/index.rst +0 -0
  185. {splinekit-0.2.2 → splinekit-0.2.4}/docs/demos/padding/index.rst +0 -0
  186. {splinekit-0.2.2 → splinekit-0.2.4}/docs/demos/padding/padding_speed.ipynb.gz +0 -0
  187. {splinekit-0.2.2 → splinekit-0.2.4}/docs/demos/spline1d/index.rst +0 -0
  188. {splinekit-0.2.2 → splinekit-0.2.4}/docs/demos/spline1d/spline_evaluation_speed.ipynb.gz +0 -0
  189. {splinekit-0.2.2 → splinekit-0.2.4}/docs/environment.yml +0 -0
  190. {splinekit-0.2.2 → splinekit-0.2.4}/docs/glossary/glossary-numbers.rst +0 -0
  191. {splinekit-0.2.2 → splinekit-0.2.4}/docs/glossary/glossary-polynomials.rst +0 -0
  192. {splinekit-0.2.2 → splinekit-0.2.4}/docs/glossary/glossary-terminology.rst +0 -0
  193. {splinekit-0.2.2 → splinekit-0.2.4}/docs/glossary/index.rst +0 -0
  194. {splinekit-0.2.2 → splinekit-0.2.4}/docs/installation/index.rst +0 -0
  195. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/bounded/01_bounded.rst +0 -0
  196. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/bounded/02_open.rst +0 -0
  197. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/bounded/03_open_closed.rst +0 -0
  198. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/bounded/04_closed.rst +0 -0
  199. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/bounded/05_closed_open.rst +0 -0
  200. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/bounded/index.rst +0 -0
  201. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/bounded/noxfile.py +0 -0
  202. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/degenerate/01_degenerate.rst +0 -0
  203. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/degenerate/02_singleton.rst +0 -0
  204. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/degenerate/index.rst +0 -0
  205. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/degenerate/noxfile.py +0 -0
  206. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/half_bounded/01_half_bounded.rst +0 -0
  207. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/half_bounded/02_above.rst +0 -0
  208. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/half_bounded/03_not_below.rst +0 -0
  209. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/half_bounded/04_not_above.rst +0 -0
  210. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/half_bounded/05_below.rst +0 -0
  211. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/half_bounded/index.rst +0 -0
  212. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/half_bounded/noxfile.py +0 -0
  213. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/index.rst +0 -0
  214. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/interval/01_interval.rst +0 -0
  215. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/interval/index.rst +0 -0
  216. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/interval/noxfile.py +0 -0
  217. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/noxfile.py +0 -0
  218. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/universal/01_universal.rst +0 -0
  219. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/universal/02_empty.rst +0 -0
  220. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/universal/03_rr.rst +0 -0
  221. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/universal/index.rst +0 -0
  222. {splinekit-0.2.2 → splinekit-0.2.4}/docs/interval/universal/noxfile.py +0 -0
  223. {splinekit-0.2.2 → splinekit-0.2.4}/docs/noxfile.py +0 -0
  224. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_nonuniform_piecewise/01_periodic_nonuniform_piecewise.rst +0 -0
  225. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_nonuniform_piecewise/index.rst +0 -0
  226. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_nonuniform_piecewise/noxfile.py +0 -0
  227. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/01_periodic_spline_1d.rst +0 -0
  228. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/index.rst +0 -0
  229. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m00.png +0 -0
  230. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m01.png +0 -0
  231. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m02.png +0 -0
  232. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m03.png +0 -0
  233. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m04.png +0 -0
  234. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m05.png +0 -0
  235. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m06.png +0 -0
  236. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m07.png +0 -0
  237. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m08.png +0 -0
  238. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m09.png +0 -0
  239. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m10.png +0 -0
  240. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m11.png +0 -0
  241. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m12.png +0 -0
  242. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m13.png +0 -0
  243. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m14.png +0 -0
  244. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m15.png +0 -0
  245. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m16.png +0 -0
  246. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m17.png +0 -0
  247. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m18.png +0 -0
  248. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m19.png +0 -0
  249. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m20.png +0 -0
  250. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m21.png +0 -0
  251. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m22.png +0 -0
  252. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m23.png +0 -0
  253. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/m24.png +0 -0
  254. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/matplotlib-color.rst +0 -0
  255. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/matplotlib-linestyle.rst +0 -0
  256. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/matplotlib-marker.rst +0 -0
  257. {splinekit-0.2.2 → splinekit-0.2.4}/docs/periodic_spline_1d/noxfile.py +0 -0
  258. {splinekit-0.2.2 → splinekit-0.2.4}/docs/spline_padding/01_spline_padding.rst +0 -0
  259. {splinekit-0.2.2 → splinekit-0.2.4}/docs/spline_padding/index.rst +0 -0
  260. {splinekit-0.2.2 → splinekit-0.2.4}/docs/spline_padding/noxfile.py +0 -0
  261. {splinekit-0.2.2 → splinekit-0.2.4}/docs/spline_utilities/01_spline_utilities.rst +0 -0
  262. {splinekit-0.2.2 → splinekit-0.2.4}/docs/spline_utilities/index.rst +0 -0
  263. {splinekit-0.2.2 → splinekit-0.2.4}/docs/spline_utilities/noxfile.py +0 -0
  264. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/__init__.py +0 -0
  265. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/interval/__init__.py +0 -0
  266. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/interval/_known_intervals.py +0 -0
  267. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/interval/above.py +0 -0
  268. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/interval/below.py +0 -0
  269. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/interval/bounded.py +0 -0
  270. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/interval/closed.py +0 -0
  271. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/interval/closed_open.py +0 -0
  272. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/interval/degenerate.py +0 -0
  273. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/interval/empty.py +0 -0
  274. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/interval/half_bounded.py +0 -0
  275. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/interval/interval.py +0 -0
  276. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/interval/mypy.ini +0 -0
  277. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/interval/not_above.py +0 -0
  278. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/interval/not_below.py +0 -0
  279. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/interval/open.py +0 -0
  280. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/interval/open_closed.py +0 -0
  281. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/interval/rr.py +0 -0
  282. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/interval/singleton.py +0 -0
  283. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/interval/universal.py +0 -0
  284. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/mypy.ini +0 -0
  285. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/periodic_nonuniform_piecewise.py +0 -0
  286. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/spline_padding.py +0 -0
  287. {splinekit-0.2.2 → splinekit-0.2.4}/src/splinekit/spline_utilities.py +0 -0
  288. {splinekit-0.2.2 → splinekit-0.2.4}/temp/bspline_stability.py +0 -0
  289. {splinekit-0.2.2 → splinekit-0.2.4}/tests/test_bsplines.py +0 -0
  290. {splinekit-0.2.2 → splinekit-0.2.4}/tests/test_periodic_nonuniform_piecewise.py +0 -0
  291. {splinekit-0.2.2 → splinekit-0.2.4}/tests/test_periodic_spline_1d.py +0 -0
  292. {splinekit-0.2.2 → splinekit-0.2.4}/tests/test_spline_padding.py +0 -0
  293. {splinekit-0.2.2 → splinekit-0.2.4}/tests/test_spline_utilities.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: splinekit
3
- Version: 0.2.2
3
+ Version: 0.2.4
4
4
  Summary: A set of functions and classes to handle periodic 1D polynomial splines
5
5
  Author-Email: =?utf-8?q?Philippe_Th=C3=A9venaz?= <philippe.thevenaz@icloud.com>
6
6
  Maintainer-Email: =?utf-8?q?Philippe_Th=C3=A9venaz?= <philippe.thevenaz@icloud.com>
@@ -52,8 +52,10 @@ Description-Content-Type: text/markdown
52
52
  <!-- splinekit/README.md -->
53
53
 
54
54
  # splinekit: Spline Operations
55
- `splinekit` is a Python-based open-source software library aimed at the
56
- manipulation of one-dimensional periodic splines.
55
+ `splinekit` is a Python-based open-source software library aimed at the manipulation of one-dimensional periodic splines.
56
+
57
+ | ***<div style="background-color:aliceblue">&#160;&#160;Full documentation at https://splinekit.github.io/ &#160;&#160;</div>*** |
58
+ | - |
57
59
 
58
60
  ## Installation
59
61
  You need at least `Python 3.11` to install `splinekit`.
@@ -118,5 +120,5 @@ First stable version. Pure Python.
118
120
  ### 0.2.1
119
121
  Same API as 0.1.0. Ansi-C dynamic library.
120
122
 
121
- ### 0.2.2
123
+ ### 0.2.2 — 0.2.4
122
124
  Some demos added
@@ -1,8 +1,10 @@
1
1
  <!-- splinekit/README.md -->
2
2
 
3
3
  # splinekit: Spline Operations
4
- `splinekit` is a Python-based open-source software library aimed at the
5
- manipulation of one-dimensional periodic splines.
4
+ `splinekit` is a Python-based open-source software library aimed at the manipulation of one-dimensional periodic splines.
5
+
6
+ | ***<div style="background-color:aliceblue">&#160;&#160;Full documentation at https://splinekit.github.io/ &#160;&#160;</div>*** |
7
+ | - |
6
8
 
7
9
  ## Installation
8
10
  You need at least `Python 3.11` to install `splinekit`.
@@ -67,5 +69,5 @@ First stable version. Pure Python.
67
69
  ### 0.2.1
68
70
  Same API as 0.1.0. Ansi-C dynamic library.
69
71
 
70
- ### 0.2.2
72
+ ### 0.2.2 — 0.2.4
71
73
  Some demos added
@@ -8,7 +8,7 @@ Illustration of the B-spline basis :math:`\beta,` the cardinal B-spline basis :
8
8
  Roadmap
9
9
  -------
10
10
 
11
- We are first going to give the intuition of what a basis is, by making a detour with the representation of numbers. Then, we introduce uniform splines as a weighted sum of integer-shifted bases. We go into greater depth in our general discussion of bases, and then focus on the specific case of the B-spline basis, of which we give just a few of their numerous properties. We end with the illustration of three other kinds of bases.
11
+ We are first going to give the intuition of what a basis is, by making a detour with the representation of numbers. Then, we introduce uniform splines as weighted sums of integer-shifted bases. We go into greater depth in our general discussion of bases, and then focus on the specific case of the B-spline basis, of which we give just a few of their numerous properties. We end with the illustration of three other kinds of bases.
12
12
 
13
13
  ----
14
14
 
@@ -17,7 +17,7 @@ Representation of Numbers
17
17
 
18
18
  Unlike in the antique world, the modern representation of numbers is positional, with digits. For instance, the number forty-two consists of the decimal digits :math:`4` and :math:`2,` with :math:`4` to the left and :math:`2` to the right.
19
19
 
20
- Digits are the construction blocks of numbers. They are associated to a *base* (not a basis); in everyday life, the base is ten. In a computer, the binary base is two. Geeks would write octal numbers in base eight or hexadecimal numbers in base sixteen. Assuming the subscript is written in base ten, one would notate
20
+ Digits are the construction blocks of numbers. They are associated to a *base* (not a basis); in everyday life, the base is ten. In a computer, the binary base is two. Geeks would write octal numbers in base eight or hexadecimal numbers in base sixteen. Assuming the base is written as a base-ten subscript, one would notate
21
21
 
22
22
  .. math::
23
23
  42_{10}=101010_{2}=52_{8}=2{\mathrm{A}}_{16}.
@@ -36,12 +36,12 @@ The finite characteristic of the string may be of a different nature. Typically,
36
36
 
37
37
  but, by practical necessity, the written form requires a finite-length string. One achieves this by omitting the zeros to the left and truncating the digits to the right. Yet, conceptually, the number of digits is still infinite.
38
38
 
39
- We have now made the point that a number can be synthesized by an *infinite* sum of *indexed weights* (the digits) that multiply some *index-dependent operation* on a base (the canonic number :math:`b` to the power of the index). We have omitted details such as the handling of the sign, or discussed the assumption that the base is an integer or, if it is indeed an integer :math:`b\in{\mathbb{N}}+2,` that the digits take integer values restricted to :math:`d[k]\in[0\ldots b-1].` The unicity of the representation has been left aside, too.
39
+ We have now made the point that a number can be synthesized by an *infinite* sum of *indexed weights* (the digits) that multiply some *index-dependent operation* on a base (the canonic number :math:`b` to the power of the index). We have omitted details such as the handling of the sign, or discussed the assumption that the base is an integer or, if it is indeed an integer :math:`b\in{\mathbb{N}}+2,` that the digits take integer values restricted to :math:`d[k]\in[0\ldots b-1].` The discussion of the unicity of the representation has been left aside, too.
40
40
 
41
41
  Uniform Splines
42
42
  ^^^^^^^^^^^^^^^
43
43
 
44
- Uniform splines are functions. In other words, they are mappings that associate an input real number to some (often different) output number. To be called uniform splines, these functions are not entirely arbitrary but obey some rules and follow some structure. Specifically, they are number-like, written as the functional recipe
44
+ Uniform splines are real functions. In other words, they are mappings that associate an input real number to some (often different) output number. To be called uniform splines, these functions are not entirely arbitrary but obey some rules and follow some structure. Specifically, they are number-like, written as the functional recipe
45
45
 
46
46
  .. math::
47
47
  f:{\mathbb{R}}\rightarrow{\mathbb{R}},x\mapsto f(x)=\sum_{k\in{\mathbb{Z}}}\,c[k]\,\varphi(x-k).
@@ -57,7 +57,7 @@ Given the number :math:`x`, many a base :math:`b` can be adopted to represent it
57
57
 
58
58
  * be a piecewise polynomial of degree :math:`n` with pieces of unit length;
59
59
  * be :math:`\left(n-1\right)`-times continuously differentiable and :math:`n`-times differentiable;
60
- * have its :math:`n` th derivative be necessarily discontinous in at least one place.
60
+ * have its :math:`n`-th derivative be necessarily discontinous in at least one place.
61
61
 
62
62
  These properties go a long way but are not sufficient. The true technical requirements demand for an understanding that goes beyond calculus and we do not reproduce them here.
63
63
 
@@ -73,7 +73,7 @@ B-Spline
73
73
  A basis that ticks many marks, both practical and theoretical, is the so-called polynomial B-spline :math:`\beta^{n}` of nonnegative integer degree :math:`n,` with :math:`n` a superscript. Indeed, a B-spline is the function that is used most often as construction block to build splines. The letter B in B-spline stands for *basis*. In practice, its most appealing property is its finite support, which is conductive to fast algorithms. At the same time, it has remarkable properties beyond those linked to differentiablity, a few of them being as follows.
74
74
 
75
75
  * **Explicit Formula** A finite number of arithmetic operations is all it takes to compute a B-spline.
76
- * **Rational Mapping** B-splines map rational numbers :math:`x\in{\mathbb{Q}}` to rational numbers, which allows computers to make exact computations, if desired.
76
+ * **Rational Mapping** B-splines map rational numbers :math:`x\in{\mathbb{Q}}` to rational numbers, which allows computers to make exact rational computations, if desired.
77
77
  * **Finite Support** B-splines are bump-like functions that take the value zero except on a central interval of diameter :math:`n+1.`
78
78
  * **Symmetry** B-splines are even-symmetric.
79
79
  * **Nonnegativity** B-splines never take a negative value.
@@ -89,10 +89,10 @@ While a B-spline has many favorable properties, it comes at a price: it is not i
89
89
  In the sequel, the B-spline basis provides the reference to which all other bases will be compared. We set
90
90
 
91
91
  .. math::
92
- \begin{eqnarray*}
92
+ \begin{array}{rcl}
93
93
  f:{\mathbb{R}}\rightarrow{\mathbb{R}},\;x\mapsto f(x)&=&\sum_{k\in{\mathbb{R}}}\,c[k]\,\varphi(x-k)\\
94
94
  &=&\sum_{k\in{\mathbb{R}}}\,c_{1}[k]\,\beta^{n}(x-k).
95
- \end{eqnarray*}
95
+ \end{array}
96
96
 
97
97
  Here, we plot a B-spline over its support, indexed by its degree.
98
98
 
@@ -102,8 +102,8 @@ Here, we plot a B-spline over its support, indexed by its degree.
102
102
 
103
103
  ----
104
104
 
105
- Interpolating Cardinal B-Spline
106
- -------------------------------
105
+ Cardinal B-Spline
106
+ -----------------
107
107
 
108
108
  There exists a basis :math:`\eta^{n}` that happens to be interpolating. It is called a cardinal B-spline. Some of its mathematical properties can be considered less favorable than those of B-splines; most notably, contrarily to B-splines, the support of cardinal B-splines is infinite, which makes it an impractical basis. Yet, its interpolating property, according to which :math:`\eta^{n}(0)=1` and :math:`\eta^{n}(k)=0` for :math:`k\in{\mathbb{Z}}\setminus\{0\},` greatly facilitates the determination of the coefficients of the representation. Indeed, it is enough to let :math:`c_{2}=y` to automatically get that
109
109
 
@@ -113,23 +113,23 @@ There exists a basis :math:`\eta^{n}` that happens to be interpolating. It is ca
113
113
  It then holds that
114
114
 
115
115
  .. math::
116
- \begin{eqnarray*}
116
+ \begin{array}{rcl}
117
117
  f:{\mathbb{R}}\rightarrow{\mathbb{R}},\;x\mapsto f(x)&=&\sum_{k\in{\mathbb{R}}}\,c[k]\,\varphi(x-k)\\
118
118
  &=&\sum_{k\in{\mathbb{R}}}\,c_{1}[k]\,\beta^{n}(x-k)\\
119
119
  &=&\sum_{k\in{\mathbb{R}}}\,c_{2}[k]\,\eta^{n}(x-k).
120
- \end{eqnarray*}
120
+ \end{array}
121
121
 
122
122
 
123
123
  Here, we plot a cardinal B-spline, indexed by its degree.
124
124
 
125
125
  .. admonition:: Jupyter Lab notebook
126
126
 
127
- `Interpolating cardinal B-spline <https://splinekit.github.io/splinekit-jupyterlite/notebooks/index.html?path=bspline_cardinal.ipynb>`_
127
+ `Cardinal B-spline <https://splinekit.github.io/splinekit-jupyterlite/notebooks/index.html?path=bspline_cardinal.ipynb>`_
128
128
 
129
129
  Relation to the Cardinal Sine Function
130
130
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
131
131
 
132
- The function :math:`f:{\mathbb{R}}\rightarrow{\mathbb{R}},\;x\mapsto\sum_{k\in{\mathbb{R}}}\,c[k]\,\varphi(x-k)` is a spline only for certain bases :math:`\varphi.` A famous case where :math:`f` fails to be a spline arises if one chooses :math:`\sin(\pi\,x)/\left(\pi\,x\right)={\mathrm{sinc}}\,x,` to play the role of the basis, which is associated to the celebrated Whittaker–Shannon interpolation formula and has strong theoretical properties.
132
+ The function :math:`f:{\mathbb{R}}\rightarrow{\mathbb{R}},\;x\mapsto\sum_{k\in{\mathbb{R}}}\,c[k]\,\varphi(x-k)` is a spline only for certain bases :math:`\varphi.` A famous case where :math:`f` fails to be a spline arises if one chooses :math:`\sin(\pi\,x)/\left(\pi\,x\right)={\mathrm{sinc}}\,x` to play the role of the basis, which is associated to the celebrated Whittaker–Shannon interpolation formula and has strong theoretical properties.
133
133
 
134
134
  As it turns out, the cardinal B-spline :math:`\eta^{n}` tends (in a functional sense) to :math:`{\mathrm{sinc}}` when :math:`n\rightarrow\infty.` The convergence, however, is poor. In particular, the tails of the :math:`{\mathrm{sinc}}` function decay in reciprocal fashion, a decay that is much gentler than the exponential decay followed by the tails of the cardinal B-spline.
135
135
 
@@ -148,12 +148,12 @@ Dual B-Spline
148
148
  Let the basis :math:`\mathring{\beta}^{n_{2},n_{1}}` of dual degree :math:`n_{2}\in{\mathbb{N}}` and primal degree :math:`n_{1}\in{\mathbb{N}}` be called a dual B-spline. It is yet another basis that is sometimes used to provide an alternate (equivalent) representation of the spline as
149
149
 
150
150
  .. math::
151
- \begin{eqnarray*}
151
+ \begin{array}{rcl}
152
152
  f:{\mathbb{R}}\rightarrow{\mathbb{R}},\;x\mapsto f(x)&=&\sum_{k\in{\mathbb{R}}}\,c[k]\,\varphi(x-k)\\
153
153
  &=&\sum_{k\in{\mathbb{R}}}\,c_{1}[k]\,\beta^{n}(x-k)\\
154
154
  &=&\sum_{k\in{\mathbb{R}}}\,c_{2}[k]\,\eta^{n}(x-k)\\
155
155
  &=&\sum_{k\in{\mathbb{R}}}\,c_{3}[k]\,\mathring{\beta}^{n,n_{1}}(x-k).
156
- \end{eqnarray*}
156
+ \end{array}
157
157
 
158
158
  Here, the equality of the representations of :math:`f` is achieved only if we set :math:`n_{2}=n,` while the primal degree :math:`n_{1}\in{\mathbb{N}}` is free. The defining property of a dual B-spline is that it is the unique spline of degree :math:`n_{2}` which, once convolved with a B-spline of degree :math:`n_{1},` results in a cardinal, interpolating spline. Formally, this is written as
159
159
 
@@ -186,13 +186,13 @@ Orthonormal B-Spline
186
186
  Let the orthonormal B-spline :math:`\phi^{n}` of degree :math:`n` be a final basis of interest that is sometimes used to provide an alternate (equivalent) representation of the spline as
187
187
 
188
188
  .. math::
189
- \begin{eqnarray*}
189
+ \begin{array}{rcl}
190
190
  f:{\mathbb{R}}\rightarrow{\mathbb{R}},\;x\mapsto f(x)&=&\sum_{k\in{\mathbb{R}}}\,c[k]\,\varphi(x-k)\\
191
191
  &=&\sum_{k\in{\mathbb{R}}}\,c_{1}[k]\,\beta^{n}(x-k)\\
192
192
  &=&\sum_{k\in{\mathbb{R}}}\,c_{2}[k]\,\eta^{n}(x-k)\\
193
193
  &=&\sum_{k\in{\mathbb{R}}}\,c_{3}[k]\,\mathring{\beta}^{n,n_{1}}(x-k)\\
194
194
  &=&\sum_{k\in{\mathbb{R}}}\,c_{4}[k]\,\phi^{n}(x-k).
195
- \end{eqnarray*}
195
+ \end{array}
196
196
 
197
197
  The defining property of the orthonormal B-spline is that it is the unique (up to its sign) spline of degree :math:`n` which, once convolved with itself, results in a cardinal, interpolating spline. Formally, this is written as
198
198
 
@@ -24,10 +24,10 @@ B-splines are continuously defined functions :math:`\beta^{n}:{\mathbb{R}}\right
24
24
  One question that arises now is whether the sequence :math:`b^{n}` possesses a discrete-convolution inverse sequence. Let us notate such inverse sequence as :math:`\left(b^{n}\right)^{-1}.` What we are primarily asking is whether there exists :math:`\left(b^{n}\right)^{-1}` such that
25
25
 
26
26
  .. math::
27
- \begin{eqnarray*}
27
+ \begin{array}{rcl}
28
28
  \forall k\in{\mathbb{Z}}:{\mathbf{[\![}}k=0\,{\mathbf{]\!]}}&=&\left(\left(b^{n}\right)^{-1}*b^{n}\right)[k]\\
29
29
  &=&\sum_{q\in{\mathbb{Z}}}\,\left(b^{n}\right)^{-1}[q]\,b^{n}[k-q],
30
- \end{eqnarray*}
30
+ \end{array}
31
31
 
32
32
  where the notation :math:`{\mathbf{[\![}}\cdot\,{\mathbf{]\!]}}` is that of the Iverson bracket. (From a mathematical point of view, let us observe that the convolution is always well-defined because of the finite-support property of :math:`b^{n}.`)
33
33
 
@@ -20,7 +20,7 @@ A polynomial B-spline is a function that is characterized by its degree, has a f
20
20
  Polynomial B-Spline Derivatives
21
21
  -------------------------------
22
22
 
23
- B-spline polynomial functions are as smooth as one can get them to be. As they are made of pieces of polynomials between knots, they are infinitely differentiable over each piece. At the location of a knot, where two different polynomials meet, they are not infinitely differentiable anymore, but they are functions that are differentiable as many times as possible while honoring a property known as the partition of unity. Here, we plot a B-spline and all its finite derivatives.
23
+ B-spline polynomial functions are as smooth as one can get them to be. As they are made of pieces of polynomials between knots, they are infinitely differentiable over the interior of each piece. At the location of a knot, where two different polynomials meet, they are not infinitely differentiable anymore, but they are functions that are differentiable as many times as possible while honoring a property known as the partition of unity. Here, we plot a B-spline and all its finite derivatives.
24
24
 
25
25
  .. admonition:: Jupyter Lab notebook
26
26
 
@@ -13,7 +13,7 @@ The so-called *poles* are the poles of the reciprocal of the z-transform of the
13
13
  .. math::
14
14
  \frac{1}{\sum_{k\in{\mathbb{Z}}}\,\beta^{n}(k)\,z^{-k}}\not\in{\mathbb{C}}.
15
15
 
16
- It so happens that the B-spline poles are real (their imaginary part is always zero) and negative; they exist for :math:`n\in{\mathbb{N}}+2.` Because B-splines are even-symmetric functions, their poles come in reciprocal pairs, the poles of interest being those that lie in the open interval :math:`(-1,0).` In this interval, :math:`\left\lfloor n/2\right\rfloor` of them can be found. They play an important role in spline interpolation, specifically in the process that converts data samples into spline coefficients.
16
+ It so happens that the B-spline poles are in fact real (their imaginary part is always zero), and negative; they exist for :math:`n\in{\mathbb{N}}+2.` Because B-splines are even-symmetric functions, their poles come in reciprocal pairs, the poles of interest being those that lie in the open interval :math:`(-1,0).` In this interval, :math:`\left\lfloor n/2\right\rfloor` of them can be found. They play an important role in spline interpolation, specifically in the process that converts data samples into spline coefficients.
17
17
 
18
18
  ----
19
19
 
@@ -36,19 +36,19 @@ Consider the real function
36
36
  .. math::
37
37
  f:{\mathbb{R}}\rightarrow{\mathbb{R}},x\mapsto f(x)=\sum_{k\in{\mathbb{Z}}}\,c[k]\,\beta^{n}(x-k).
38
38
 
39
- Every function :math:`f` built this way is said to be a spline. Remarkably, the sum always converges at any :math:`x\in{\mathbb{R}}` because B-splines :math:`\beta^{n}` have a finite support, so that the convergence happens for any sequence of finite-valued coefficients :math:`c,` without further restrictions. Now, let :math:`c[k]=z_{n,m}^{k},` where :math:`z_{n,m}` is the :math:`m`-th pole associated to the B-spline of integer degree :math:`n\geq2,` with :math:`m\in[1\ldots\left\lfloor n/2\right\rfloor].` Then, from the fact that the sequence :math:`z_{n,m}^{k}` is annihilating, it follows for any integer :math:`q\in{\mathbb{Z}}` that :math:`f(q)=\sum_{k\in{\mathbb{Z}}}\,z_{n,m}^{k}\,\beta^{n}(q-k)=z_{n,m}^{q}\,\sum_{k\in{\mathbb{Z}}}\,\beta^{n}(k)\,z_{n,m}^{-k}=0.` Likewise, the sequence :math:`z_{n,m}^{-k}` satisfies the same annihilating property because B-splines are even-symmetric.
39
+ Every function :math:`f` built this way is said to be a spline. Remarkably, the sum always converges at any :math:`x\in{\mathbb{R}}` because B-splines :math:`\beta^{n}` have a finite support, so that the convergence happens for any sequence of finite-valued coefficients :math:`c,` without further restrictions. Now, for any :math:`k\in{\mathbb{Z}}` let :math:`c[k]=z_{n,m}^{k},` where :math:`z_{n,m}` is the :math:`m`-th pole associated to the B-spline of integer degree :math:`n\geq2,` with :math:`m\in[1\ldots\left\lfloor n/2\right\rfloor].` Then, from the fact that the sequence :math:`z_{n,m}^{k}` annihilates B-splines, it follows for any integer :math:`q\in{\mathbb{Z}}` that :math:`f(q)=\sum_{k\in{\mathbb{Z}}}\,z_{n,m}^{k}\,\beta^{n}(q-k)=z_{n,m}^{q}\,\sum_{k\in{\mathbb{Z}}}\,\beta^{n}(k)\,z_{n,m}^{-k}=0.` Likewise, the sequence :math:`z_{n,m}^{-k}` satisfies the same annihilating property because B-splines are even-symmetric.
40
40
 
41
41
  One often deploys splines with the purpose of interpolating data samples. In practice, given a :math:`Q`-dimensional vector :math:`{\mathbf{y}}\in{\mathbb{R}}^{Q}` of samples, it is desired to find a specific sequence of coefficients :math:`c` that results in a spline :math:`f` satisfying the interpolation constraint :math:`\left(f(q)\right)_{q=0}^{Q-1}={\mathbf{y}}.` Unfortunately, the coefficients are not unique. Indeed, suppose that one has found a sequence :math:`c` that satisfies the interpolation constraint. Then, other sequences :math:`c'` can be established as
42
42
 
43
43
  .. math::
44
- \begin{eqnarray}
44
+ \begin{array}{rcl}
45
45
  \forall q\in{\mathbb{Z}}:f(q)&=&\sum_{k\in{\mathbb{Z}}}\,c[k]\,\beta^{n}(q-k)\\
46
46
  &=&\sum_{k\in{\mathbb{Z}}}\,\underbrace{\left(c[k]+\sum_{m=1}^{\left\lfloor n/2\right\rfloor}\,\left(\lambda_{m}^{-}\,z_{n,m}^{-k}+\lambda_{m}^{+}\,z_{n,m}^{k}\right)\right)}_{c'[k]}\,\beta^{n}(q-k),
47
- \end{eqnarray}
47
+ \end{array}
48
48
 
49
49
  where :math:`\lambda_{m}^{-}` and :math:`\lambda_{m}^{+}` are unconstrained real numbers which, altogether, provide :math:`2\,\left\lfloor n/2\right\rfloor` degrees of liberty.
50
50
 
51
- We show now examples of non-vanishing odd-symmetric and even-symmetric splines that interpolate the zero-valued data samples :math:`{\mathbf{y}}={\mathbf{0}}.` (We have retained contributions only of the pole closest to :math:`(-1)` for simplicity.) The samples at the integers of an original spline of corresponding degree will coincide with the samples of the sum of the original spline and any linear combination of those zero-interpolating splines.
51
+ We show now examples of nontrivial odd-symmetric and even-symmetric splines that interpolate the zero-valued data samples :math:`{\mathbf{y}}={\mathbf{0}}.` (We have retained contributions only of the pole closest to :math:`(-1)` for simplicity.) The samples at the integers of an original spline of corresponding degree will coincide with the samples of the sum of the original spline and any linear combination of those zero-interpolating splines.
52
52
 
53
53
  .. admonition:: Jupyter Lab notebook
54
54
 
@@ -42,7 +42,7 @@ The classic, productive representation of the :math:`m`-th derivative of a B-spl
42
42
  .. math::
43
43
  \frac{{\mathrm{d}}^{m}\beta^{n}(x)}{{\mathrm{d}}x^{m}}=\sum_{k=0}^{n+1}\,{\color{blue}\left(-1\right)^{k}}\,{n+1\choose k}\,\varsigma^{n-m}(x+\frac{n+1}{2}-k).
44
44
 
45
- (To compute a non-differentiated B-spline, simply set :math:`m=0.`) Unfortunately, the term :math:`{\color{blue}\left(-1\right)^{k}}` results in additive contributions that tend to cancel each other. This spells numerical trouble, even if the polynomial simple element :math:`\varsigma^{n}:{\mathbb{R}}\rightarrow{\mathbb{R}},x\mapsto\varsigma^{n}(x)=\frac{1}{2\,n!}\,{\mathrm{sgn}}(x)\,x^{n}` has the flavor of a well-behaved canonic monomial. Another issue lies with the growth of the binomial coefficients with respect to the degree.
45
+ (To compute a non-differentiated B-spline, simply set :math:`m=0.`) Unfortunately, the term :math:`{\color{blue}\left(-1\right)^{k}}` results in additive contributions that tend to cancel each other. This spells numerical trouble, even if the polynomial simple element :math:`\varsigma^{n}:{\mathbb{R}}\rightarrow{\mathbb{R}},x\mapsto\varsigma^{n}(x)=\frac{1}{2\,n!}\,{\mathrm{sgn}}(x)\,x^{n}` has the flavor of a well-behaved canonic monomial. Another issue lies with the growth of the binomial coefficients with respect to the degree, which ultimately leads to a delicate balance between large numbers.
46
46
 
47
47
  De Boor
48
48
  ^^^^^^^
@@ -54,7 +54,7 @@ Other computational recipes have been devised. For instance, the De Boor's recur
54
54
  .. math::
55
55
  \beta^{n}(x)=\frac{1}{n}\,\left(\left(x+\frac{n+1}{2}\right)\,\beta^{n-1}(x+\frac{1}{2})-\left(x-\frac{n+1}{2}\right)\,\beta^{n-1}(x-\frac{1}{2})\right).
56
56
 
57
- Splinekit
57
+ splinekit
58
58
  ^^^^^^^^^
59
59
 
60
60
  In the ``splinekit`` library, B-splines of degree :math:`n=0` are computed as in the classic or the De Boor's approach. B-splines of positive degree, however, are computed as the scalar product
@@ -31,7 +31,7 @@ B-splines of degree :math:`n` are :math:`n`-times differentiable, and continuous
31
31
  Integral
32
32
  --------
33
33
 
34
- B-splines are functions that have a finite :ref:`support<def-support>`. In their specific case, this means that these functions take the value zero for all arguments outside of some bounded interval. More precisely, :math:`\forall x\in{\mathbb{R}}\setminus[-\frac{n+1}{2},\frac{n+1}{2}]:\beta^{n}(x)=0` for :math:`n\in{\mathbb{N}}.` Moreover, B-splines never have any singularity. Consequently, their integral is always well-defined. We plot in the next Jupyter Lab the integral :math:`\int_{-\infty}^{x}\,\beta^{n}(y)\,{\mathrm{d}}y` of the B-splines of degree :math:`0` to :math:`9.`
34
+ B-splines are functions that have a finite support. In their specific case, this means that these functions take the value zero for all arguments outside of some bounded interval. More precisely, :math:`\forall x\in{\mathbb{R}}\setminus[-\frac{n+1}{2},\frac{n+1}{2}]:\beta^{n}(x)=0` for :math:`n\in{\mathbb{N}}.` Moreover, B-splines never have any singularity. Consequently, their integral is always well-defined. We plot in the next Jupyter Lab the integral :math:`\int_{-\infty}^{x}\,\beta^{n}(y)\,{\mathrm{d}}y` of the B-splines of degree :math:`0` to :math:`9.`
35
35
 
36
36
  .. admonition:: Jupyter Lab notebook
37
37
 
@@ -78,7 +78,7 @@ Polynomial B-splines are bump-like functions that converge to a Gaussian when th
78
78
  .. math::
79
79
  \frac{1}{\sigma_{0}\,\sqrt{2\,\pi}}\,{\mathrm{e}}^{-\frac{x^{2}}{2\,\sigma_{0}^{2}}}=\lim_{n\rightarrow\infty}\beta^{n}(x\,\sqrt{n+1})\,\sqrt{n+1},
80
80
 
81
- where we have indroduced the constant :math:`\sigma_{0}=1/\sqrt{12}.` Therefore, it is without surprise that the integral of a spline converges to the :math:`{\mathrm{erf}}` function as the degree grows, too. Indeed, one has :math:`\forall x\in{\mathbb{R}}` that
81
+ where we have introduced the constant :math:`\sigma_{0}=1/\sqrt{12}.` Therefore, it is without surprise that the integral of a spline converges to the :math:`{\mathrm{erf}}` function as the degree grows, too. Indeed, one has :math:`\forall x\in{\mathbb{R}}` that
82
82
 
83
83
  .. math::
84
84
  {\mathrm{erf}}(x)=-1+2\,\lim_{n\rightarrow\infty}\int_{0}^{x\,\sqrt{\frac{n+1}{6}}}\,\beta^{n}(y)\,{\mathrm{d}}y.
@@ -87,7 +87,7 @@ We give now a piece of code where we verify this property visually over the rang
87
87
 
88
88
  .. admonition:: Jupyter Lab notebook
89
89
 
90
- `Erf from splines <https://splinekit.github.io/splinekit-jupyterlite/notebooks/index.html?path=bspline_vs_erf.ipynb>`_
90
+ `erf from splines <https://splinekit.github.io/splinekit-jupyterlite/notebooks/index.html?path=bspline_vs_erf.ipynb>`_
91
91
 
92
92
  ----
93
93
 
@@ -8,20 +8,20 @@ How to build a monomial out of B-splines; which polynomial results from the sum
8
8
  Splines
9
9
  -------
10
10
 
11
- The ``splinekit`` library focuses on regular polynomial splines of nonnegative integer degree. These splines are real functions that map the domain :math:`{\mathbb{R}}` onto the image :math:`{\mathbb{R}}.`
11
+ The ``splinekit`` library focuses on uniform polynomial splines of nonnegative integer degree. These splines are real functions that map the domain :math:`{\mathbb{R}}` onto the image :math:`{\mathbb{R}}.`
12
12
 
13
13
  * *Piecewise Polynomials* What makes this particular mapping remarkable is that there exists some partition of the domain into intervals, each interval being such that, there, the piece of spline is a polynomial of a degree that never exceeds the degree of the spline—possibly, a different polynomial over each interval.
14
14
 
15
15
  * *Smoothness* Moreover, for the mapping to be called a spline, the polynomial pieces must match in the following sense: Consider three adjacent unit intervals of the partition of :math:`{\mathbb{R}}`, namely, a central interval with another interval to the left and another one to the right. Now, remember that an independent polyomial is associated to each of the three intervals. With splines, at the boundary between the left interval and the central one, the respective polynomials must take the same value and the same value of their derivatives of all orders except, possibly, the derivative of the order equal to the degree of the spline. The same goes at the central-right boundary.
16
16
 
17
- * *Regular* For regular splines, each interval is assumed to have a unit diameter.
17
+ * *Uniform* For uniform splines, each interval is assumed to have a unit diameter.
18
18
 
19
- Splines of degree :math:`n` are :math:`\left(n-1\right)` times continuously differentiable and :math:`n` times differentiable. They are the smoothest piecewise-polynomial functions one can get. It turns out that regular splines always admit a convenient representation through an expression that involves basis functions; in the most practical form, regular splines are written as
19
+ Splines of degree :math:`n` are :math:`\left(n-1\right)` times continuously differentiable and :math:`n` times differentiable. They are the smoothest piecewise-polynomial functions one can get. It turns out that uniform splines always admit a convenient representation through an expression that involves basis functions; in the most practical form, uniform splines are written as
20
20
 
21
21
  .. math::
22
22
  f:{\mathbb{R}}\rightarrow{\mathbb{R}},x\mapsto f(x)=\sum_{k\in{\mathbb{Z}}}\,c[k]\,\beta^{n}(x-\delta x-k),
23
23
 
24
- where :math:`c` are the so-called spline coefficients and where the B-spline :math:`\beta^{n}` is the basis function of the degree :math:`n,` this degree being typeset as a superscript (not a power). The distinction between a B-spline (with a capital B) and a spline is that the first one is a nonparametric basis, the second one being parameterized by :math:`c` and the global delay :math:`\delta x.` To simplify the discussion, we assume henceforth that this delay is :math:`\delta x=0.`
24
+ where :math:`c` are the so-called spline coefficients and where the B-spline :math:`\beta^{n}` is the basis function of the degree :math:`n,` this degree being typeset as a superscript (not a power). The distinction between a B-spline (with a capital B) and a spline is that the first one is a nonparametric basis, the second one being parameterized by :math:`c` and the global delay :math:`\delta x.` To simplify the current discussion, we assume henceforth that this delay is :math:`\delta x=0.`
25
25
 
26
26
  In this description, there is nothing to prevent one to call a spline any true (non-piecewise) polynomial. We are going now to establish relations between polynomials and spline coefficients.
27
27
 
@@ -38,12 +38,12 @@ The real function that maps every real number to zero is the polynomial :math:`\
38
38
  Polynomials of Degree :math:`0` and Partition of Unity
39
39
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
40
40
 
41
- A polynomial of degree :math:`0` is a real function :math:`\pi_{0}:{\mathbb{R}}\rightarrow{\mathbb{R}}\setminus\{0\},x\mapsto\pi_{0}(x)=a_{0}` that maps every real number to the nonzero constant :math:`a_{0}.` If we want to build a spline that does the same, we need to find a series :math:`c_{0}` of spline coefficients such that
41
+ A polynomial of degree :math:`0` is a real function :math:`\pi_{0}:{\mathbb{R}}\rightarrow{\mathbb{R}}\setminus\{0\},x\mapsto\pi_{0}(x)=a_{0}` that maps every real number to the nonzero constant :math:`a_{0}.` If we want to build a spline that does the same, we need to find spline coefficients :math:`c_{0}` such that, for any argument :math:`x\in{\mathbb{R}},` it holds that
42
42
 
43
43
  .. math::
44
44
  a_{0}=\sum_{k\in{\mathbb{Z}}}\,c_{0}[k]\,\beta^{n}(x-k).
45
45
 
46
- Fortunately, for any degree :math:`n` and for any argument :math:`x\in{\mathbb{R}},` B-splines satisfy the partition-of-unity condition according to which
46
+ Fortunately, B-splines of any degree :math:`n` satisfy the partition-of-unity condition according to which
47
47
 
48
48
  .. math::
49
49
  1=\sum_{k\in{\mathbb{Z}}}\,\beta^{n}(x-k).
@@ -53,17 +53,17 @@ It is then enough to identify :math:`c_{0}[k]=a_{0}` for all :math:`k\in{\mathbb
53
53
  Partition of Monomials
54
54
  ^^^^^^^^^^^^^^^^^^^^^^
55
55
 
56
- The generic polynomial :math:`\pi_{n}:{\mathbb{R}}\rightarrow{\mathbb{R}},x\mapsto\pi_{n}(x)=a_{0}+\sum_{m=1}^{n}\,a_{m}\,x^{m}` is a weighted linear sum of a constant term :math:`1` and of canonic monomials :math:`x^{m},` with respective weights :math:`a_{0}` and :math:`a_{m}.` If we want to discover which series :math:`c` of spline coefficients is needed to represent :math:`\pi_{n}` as a spline, all we need to know is which series :math:`c_{m}^{n}` of spline coefficients will represent the monomial :math:`x^{m}` as the spline :math:`\sum_{k\in{\mathbb{Z}}}\,c_{m}^{n}[k]\,\beta^{n}(x-k),` assuming that :math:`0<m\leq n.` Then, the finite-support property of B-splines will alleviate concerns about the convergence of the sums involved and will allow us to write that
56
+ The generic polynomial :math:`\pi_{n}:{\mathbb{R}}\rightarrow{\mathbb{R}},x\mapsto\pi_{n}(x)=a_{0}+\sum_{m=1}^{n}\,a_{m}\,x^{m}` is a weighted linear sum of a constant term :math:`1` and of canonic monomials :math:`x^{m},` with respective weights :math:`a_{0}` and :math:`a_{m}.` If we want to discover the spline coefficients :math:`c` needed to represent :math:`\pi_{n}` as a spline, all we need to know is which are the spline coefficients :math:`c_{m}^{n}` that will represent the monomial of degree :math:`m` as the spline :math:`\sum_{k\in{\mathbb{Z}}}\,c_{m}^{n}[k]\,\beta^{n}(x-k)` for :math:`x\in{\mathbb{R}},` assuming that :math:`0<m\leq n.` Then, the finite-support property of B-splines will alleviate concerns about the convergence of the sums involved and will allow us to write that
57
57
 
58
58
  .. math::
59
- \begin{eqnarray}
59
+ \begin{array}{rcl}
60
60
  \pi_{n}(x)&=&a_{0}\,\left(\sum_{k\in{\mathbb{Z}}}\,\beta^{n}(x-k)\right)+\sum_{m=1}^{n}\,a_{m}\,\left(\sum_{k\in{\mathbb{Z}}}\,c_{m}^{n}[k]\,\beta^{n}(x-k)\right)\\
61
61
  &=&\sum_{k\in{\mathbb{Z}}}\,\left(a_{0}+\sum_{m=1}^{n}\,a_{m}\,c_{m}^{n}[k]\right)\,\beta^{n}(x-k).
62
- \end{eqnarray}
62
+ \end{array}
63
63
 
64
- The identification :math:`c[k]=a_{0}+\sum_{m=1}^{n}\,a_{m}\,c_{m}^{n}[k]` will finally result in the desired representation :math:`\pi_{n}(x)=\sum_{k\in{\mathbb{Z}}}\,c[k]\,\beta^{n}(x-k).`
64
+ The identification :math:`c[k]=a_{0}+\sum_{m=1}^{n}\,a_{m}\,c_{m}^{n}[k]` for :math:`k\in{\mathbb{Z}}` will finally result in the desired representation :math:`\pi_{n}(x)=\sum_{k\in{\mathbb{Z}}}\,c[k]\,\beta^{n}(x-k)` for :math:`x\in{\mathbb{R}}.`
65
65
 
66
- It turns out that :math:`c_{m}^{n}[k]` can itself be expressed as a polynomial in :math:`k.` We give now a piece of code that returns the list of polynomials in :math:`k` that one must use to weigh B-splines of degree :math:`n` to build a monomial of nonnegative degree :math:`m\leq n`, as in
66
+ It turns out that the monomial-reproducing :math:`c_{m}^{n}[k]` can itself be expressed as a polynomial in :math:`k.` We give now a piece of code that returns the list of polynomials in :math:`k` that one must use to weigh B-splines of degree :math:`n` to build the monomial :math:`x^{m}` of nonnegative degree :math:`m\leq n`, as in
67
67
 
68
68
  .. math::
69
69
  x^{m}=\sum_{k\in{\mathbb{Z}}}\,c_{m}^{n}[k]\,\beta^{n}(x-k).
@@ -85,7 +85,7 @@ for a weighting monomial of degree :math:`0,` and
85
85
  .. math::
86
86
  \sum_{k\in{\mathbb{Z}}}\,k^{m}\,\beta^{n}(x-k)=\pi_{m}^{n}(x)
87
87
 
88
- for :math:`m\in[1\ldots n],` where :math:`\pi_{m}^{n}(x)` is some polynomial in the free variable :math:`x.` We give now a piece of code that returns :math:`\pi_{m}^{n}(x)` for the spline degree :math:`n` and the nonnegative monomial degrees :math:`m\leq n.`
88
+ for :math:`m\in[1\ldots n],` where :math:`\pi_{m}^{n}(x)` is some polynomial in the free variable :math:`x.` We give now a piece of code that returns the polynomial :math:`\pi_{m}^{n}` for the spline degree :math:`n` and the nonnegative monomial degrees :math:`m\leq n.`
89
89
 
90
90
  .. admonition:: Jupyter Lab notebook
91
91
 
@@ -101,7 +101,7 @@ The convolution bewteen, on one hand, a monomial :math:`\left(\cdot\right)^{m}`
101
101
  .. math::
102
102
  \int_{\mathbb{R}}\,y^{m}\,\beta^{n}(x-y)\,{\mathrm{d}}y=\varpi_{m}^{n}(x).
103
103
 
104
- We give now a piece of code that returns :math:`\varpi_{m}^{n}.`
104
+ We give now a piece of code that returns the polynomial :math:`\varpi_{m}^{n}.`
105
105
 
106
106
  .. admonition:: Jupyter Lab notebook
107
107
 
@@ -68,6 +68,8 @@ We give now a piece of code that illustrates visually the effect of the various
68
68
 
69
69
  `Padded splines <https://splinekit.github.io/splinekit-jupyterlite/notebooks/index.html?path=padding_data.ipynb>`_
70
70
 
71
+ ----
72
+
71
73
  Periodic Padding
72
74
  ----------------
73
75
 
@@ -178,6 +180,8 @@ Discussion
178
180
 
179
181
  The conclusion of the experiments is unequivocal: The recursive approach is substantially faster than the fast-Fourier approach, at all lengths (except :math:`K=1`), ranges of lengths, and all degrees being investigated.
180
182
 
183
+ ----
184
+
181
185
  Narrow-Mirror Padding
182
186
  ---------------------
183
187
 
@@ -205,6 +209,8 @@ Start the algorithm by letting :math:`{\mathbf{c}}\leftarrow{\mathbf{y}}.` Then,
205
209
  .. math::
206
210
  \left\{\begin{array}{rcll}c[0]&\leftarrow&\frac{1}{1-z_{n,m}^{2\,K-2}}\,\sum_{k=0}^{K-2}\,z_{n,m}^{k}\,\left(c[k]+z_{n,m}^{K-1}\,c[K-1-k]\right)\\c[k]&\leftarrow&c[k]+z_{n,m}\,c[k-1],&k\in[1\ldots K-1]\\c[K-1]&\leftarrow&\frac{\left(1-z_{n,m}\right)^{2}}{1-z_{n,m}^{2}}\,\left(z_{n,m}\,c[K-2]+c[K-1]\right)\\c[K-1-k]&\leftarrow&z_{n,m}\,c[K-k]+\left(1-z_{n,m}\right)^{2}\,c[K-1-k],&k\in[1\ldots K-1]\end{array}\right.
207
211
 
212
+ ----
213
+
208
214
  Wide-Mirror Padding
209
215
  -------------------
210
216
 
@@ -232,6 +238,8 @@ Start the algorithm by letting :math:`{\mathbf{c}}\leftarrow{\mathbf{y}}.` Then,
232
238
  .. math::
233
239
  \left\{\begin{array}{rcll}c[0]&\leftarrow&c[0]+\frac{z_{n,m}}{1-z_{n,m}^{2\,K}}\,\sum_{k=0}^{K-1}\,z_{n,m}^{k}\,\left(c[k]+z_{n,m}^{K}\,c[K-1-k]\right)\\c[k]&\leftarrow&c[k]+z_{n,m}\,c[k-1],&k\in[1\ldots K-1]\\c[K-1]&\leftarrow&\left(1-z_{n,m}\right)\,c[K-1]\\c[K-1-k]&\leftarrow&z_{n,m}\,c[K-k]+\left(1-z_{n,m}\right)^{2}\,c[K-1-k],&k\in[1\ldots K-1]\end{array}\right.
234
240
 
241
+ ----
242
+
235
243
  Anti-Mirror Padding
236
244
  -------------------
237
245
 
@@ -259,6 +267,8 @@ Start the algorithm by letting :math:`{\mathbf{c}}\leftarrow{\mathbf{y}}.` Then,
259
267
  .. math::
260
268
  \left\{\begin{array}{rcll}c[0]&\leftarrow&\frac{1}{1-z_{n,m}^{2\,K-2}}\,\left(\frac{1+z_{n,m}}{1-z_{n,m}}\,\left(c[0]-z_{n,m}^{K-1}\,c[K-1]\right)\right.\\&&\left.\mbox{}-\sum_{k=1}^{K-2}\,z_{n,m}^{k}\,\left(c[k]-z_{n,m}^{K-1}\,c[K-1-k]\right)\right)\\c[k]&\leftarrow&c[k]+z_{n,m}\,c[k-1],&k\in[1\ldots K-1]\\c[K-1]&\leftarrow&c[K-1]-z_{n,m}\,c[K-2]\\c[K-1-k]&\leftarrow&z_{n,m}\,c[K-k]+\left(1-z_{n,m}\right)^{2}\,c[K-1-k],&k\in[1\ldots K-1]\end{array}\right.
261
269
 
270
+ ----
271
+
262
272
  Nega-Periodic Padding
263
273
  ---------------------
264
274
 
@@ -286,6 +296,8 @@ Start the algorithm by letting :math:`{\mathbf{c}}\leftarrow{\mathbf{y}}.` Then,
286
296
  .. math::
287
297
  \left\{\begin{array}{rcll}c[0]&\leftarrow&c[0]-\frac{z_{n,m}}{1+z_{n,m}^{K}}\,\sum_{k=0}^{K-1}\,z_{n,m}^{K-1-k}\,c[k]\\c[k]&\leftarrow&c[k]+z_{n,m}\,c[k-1],&k\in[1\ldots K-1]\\c[K-1]&\leftarrow&\frac{1-z_{n,m}}{1+z_{n,m}}\,\left(\left(1+z_{n,m}^{2\,K}\right)\,c[K-1]\right.\\&&\left.\mbox{}-\frac{1}{1+z_{n,m}^{K}}\,\sum_{k=0}^{K-1}\,\left(z_{n,m}^{3\,K-1-k}+z_{n,m}^{k+1}\right)\,c[k]\right)\\c[K-1-k]&\leftarrow&z_{n,m}\,c[K-k]+\left(1-z_{n,m}\right)^{2}\,c[K-1-k],&k\in[1\ldots K-1]\end{array}\right.
288
298
 
299
+ ----
300
+
289
301
  Nega-Narrow-Mirror Padding
290
302
  --------------------------
291
303
 
@@ -313,6 +325,8 @@ Start the algorithm by letting :math:`{\mathbf{c}}\leftarrow{\mathbf{y}}.` Then,
313
325
  .. math::
314
326
  \left\{\begin{array}{rcll}c[0]&\leftarrow&c[0]-\frac{z_{n,m}^{2}}{1-z_{n,m}^{2\,K+2}}\,\sum_{k=0}^{K-1}\,z_{n,m}^{k}\,\left(c[k]-z_{n,m}^{K+1}\,c[K-1-k]\right)\\c[k]&\leftarrow&c[k]+z_{n,m}\,c[k-1],&k\in[1\ldots K-1]\\c[K-1]&\leftarrow&\left(1-z_{n,m}\right)^{2}\,c[K-1]\\c[K-1-k]&\leftarrow&z_{n,m}\,c[K-k]+\left(1-z_{n,m}\right)^{2}\,c[K-1-k],&k\in[1\ldots K-1]\end{array}\right.
315
327
 
328
+ ----
329
+
316
330
  Nega-Wide-Mirror Padding
317
331
  ------------------------
318
332
 
@@ -17,7 +17,7 @@ There, :math:`K\in{\mathbb{N}}+1` is its positive integer period and :math:`\del
17
17
 
18
18
  Our purpose here is to build a spline :math:`g` of same period :math:`K` but arbitrary degree :math:`m\in{\mathbb{N}}+1,` with its delay :math:`\delta y` and spline coefficients :math:`u` chosen such that :math:`\forall x\in{\mathbb{R}}:g(x)\geq f(x);` moreover, we would like that the bounding spline :math:`g` be reasonably close to :math:`f` and that its determination be favorable, computationally. We provide now the main steps that lead to this goal. We first consider a local bound over a single interval of unit length; then, we merge the local bounds to obtain a global one.
19
19
 
20
- Upper Bound Over a Unit Interval
20
+ Upper Bound over a Unit Interval
21
21
  --------------------------------
22
22
 
23
23
  Consider the periodized interval :math:`{\mathbb{X}}_{r}=\bigcup_{p\in{\mathbb{Z}}}\,[\frac{n-1}{2}+\delta x-r-p\,K,\frac{n-1}{2}+\delta x-r-p\,K+1),` indexed by :math:`r\in[0\ldots K-1].` Over this periodized unit-length interval, it turns out that the spline :math:`f` computed as above can also be computed from linear-algebra operations as
@@ -65,10 +65,10 @@ Assume finally that :math:`n>m>0.` In this case, letting :math:`{\mathbf{e}}_{m+
65
65
  satisfies our requirements. Indeed, for all :math:`x\in{\mathbb{X}}_{r},` some algebraic manipulations lead to
66
66
 
67
67
  .. math::
68
- \begin{eqnarray*}
68
+ \begin{array}{rcl}
69
69
  0&\leq&{\mathbf{u}}_{r}^{{\mathsf{T}}}\,{\mathbf{W}}^{m}\,{\mathbf{v}}^{m}({\mathrm{frac}}(x-\frac{m-1}{2}-\delta y))-{\mathbf{c}}_{r}^{{\mathsf{T}}}\,{\mathbf{W}}^{n}\,{\mathbf{v}}^{n}(\chi)\\
70
70
  &=&\chi^{m}\,\sum_{k=m+1}^{n}\,\left\{\begin{array}{ll}-a_{k+1}\,\chi^{k-m},&a_{k+1}<0\\a_{k+1}\,\left(1-\chi^{k-m}\right),&0\leq a_{k+1}.\end{array}\right.
71
- \end{eqnarray*}
71
+ \end{array}
72
72
 
73
73
  Global Bound
74
74
  ^^^^^^^^^^^^
@@ -91,13 +91,15 @@ and observe that
91
91
  The nonnegativity of B-splines allows us to finally establish that
92
92
 
93
93
  .. math::
94
- \begin{eqnarray*}
94
+ \begin{array}{rcl}
95
95
  \forall x\in{\mathbb{X}}_{r}:g(x)-{\mathbf{u}}_{r}^{{\mathsf{T}}}\,{\mathbf{W}}^{m}\,{\mathbf{v}}^{m}(\chi)&=&\sum_{k=0}^{m}\,\left(\left(\max_{\rho=0}^{m}\,\left[{\mathbf{u}}_{{\left(\rho-k+r\right)\bmod K}}\right]_{\rho+1}\right)-\left[{\mathbf{u}}_{r}\right]_{k+1}\right)\,\beta^{m}(x-\delta y+r-k)\\
96
96
  &\geq&\sum_{k=0}^{m}\,\left(\left[{\mathbf{u}}_{r}\right]_{k+1}-\left[{\mathbf{u}}_{r}\right]_{k+1}\right)\,\beta^{m}(x-\delta y+r-k)=0,
97
- \end{eqnarray*}
97
+ \end{array}
98
98
 
99
99
  from which we conclude that :math:`g` is an upper bound of :math:`f.`
100
100
 
101
+ ----
102
+
101
103
  Generalizations
102
104
  ---------------
103
105
 
@@ -8,7 +8,7 @@ How to create a periodic one-dimensional spline that interpolates data samples.
8
8
  Periodic One-Dimensional Spline Objects
9
9
  ---------------------------------------
10
10
 
11
- The class ``PeriodicSpline1D`` of the ``splinekit`` library handles continuously defined real functions :math:`f:{\mathbb{R}}\rightarrow{\mathbb{R}},x\mapsto f(x).` As maintained by the library, these functions have a few remarkable properties.
11
+ The class ``PeriodicSpline1D`` of the ``splinekit`` library handles continuously defined real functions :math:`f:{\mathbb{R}}\rightarrow{\mathbb{R}},x\mapsto f(x).` As maintained by this class in the library, these functions have a few remarkable properties.
12
12
 
13
13
  * The function :math:`f` is periodic, with positive integer period :math:`K\in{\mathbb{N}}+1` such that :math:`\forall x\in{\mathbb{R}}:f(x)=f(x+K).`
14
14
  * The function :math:`f` is a uniform polynomial spline of nonnegative degree :math:`n\in{\mathbb{N}}` and shift :math:`\delta x\in{\mathbb{R}},` which we write as
@@ -28,10 +28,10 @@ The functions we consider are characterized by parameters that can be chosen fre
28
28
  * Delay :math:`\delta x`
29
29
  * Spline coefficients :math:`{\mathbf{c}}`
30
30
 
31
- A large variety of functions can be synthesized by the tuning of these parameters; in particular, by the tuning of the spline coefficients. However, it rarely occurs in practice that these coefficients be known beforehand. It is much more common that one is given a vector :math:`\left(y[q]\right)_{q=0}^{K-1}=\left(y_{q}\right)_{q=1}^{K}={\mathbf{y}}\in{\mathbb{R}}^{K}` of :math:`K` samples, and that it is desired that the synthesized spline interpolates the samples, a requirement that we write as
31
+ A large variety of functions can be synthesized by the tuning of these parameters; in particular, by the tuning of the spline coefficients. However, it rarely occurs in practice that these coefficients be known beforehand. It is much more common that one is given a vector :math:`\left(y[k]\right)_{k=0}^{K-1}=\left(y_{q}\right)_{q=1}^{K}={\mathbf{y}}\in{\mathbb{R}}^{K}` of :math:`K` samples, and that it is desired that the synthesized spline interpolates the samples, a requirement that we write as
32
32
 
33
33
  .. math::
34
- \left(f(q)\right)_{q=0}^{K-1}=\left(y[q]\right)_{q=0}^{K-1}.
34
+ \left(f(k)\right)_{k=0}^{K-1}=\left(y[k]\right)_{k=0}^{K-1}.
35
35
 
36
36
  Regularizations
37
37
  ^^^^^^^^^^^^^^^
@@ -39,11 +39,11 @@ Regularizations
39
39
  Alternatively, it is also sometimes desirable that
40
40
 
41
41
  .. math::
42
- \left(f(q)\right)_{q=0}^{K-1}\approx\left(y[q]\right)_{q=0}^{K-1},
42
+ \left(f(k)\right)_{k=0}^{K-1}\approx\left(y[k]\right)_{k=0}^{K-1},
43
43
 
44
44
  with the approximation being such that it balances the requirement of interpolation with some *a priori* requirement on the continuously defined :math:`f.` The ``splinekit`` library offers two mechanisms that result in (desirable) approximate interpolation.
45
45
 
46
- * The first mechanism acknowleges the fact that exact interpolation cannot be achieved (for generic data) in the very specific case of an even period :math:`K\in2\,{\mathbb{N}}+2` combined with a half-integer delay :math:`\delta x\in{\mathbb{Z}}+1/2.` In this unstable edge case, stability is recovered by the addition of a constant corrective term to all even samples and by the subtraction of this term from all odd samples. The corrective term is chosen so that the residual difference between :math:`\left(f(q)\right)_{q=0}^{K-1}` and :math:`\left(y[q]\right)_{q=0}^{K-1}` is minimized in a discrete least-squares sense under the constraint that :math:`f` is well-defined. This mechanism is activated by setting ``regularized = True`` in the ``PeriodicSpline1D.from_samples`` constructor. It can be thought of as a doctoring of the samples that would enforce that the component at the highest discrete frequency of their discrete Fourier transform vanishes.
46
+ * The first mechanism acknowleges the fact that exact interpolation cannot be achieved (for generic data) in the very specific case of an even period :math:`K\in2\,{\mathbb{N}}+2` combined with a half-integer delay :math:`\delta x\in{\mathbb{Z}}+1/2.` In this unstable edge case, stability is recovered by the addition of a constant corrective term to all even samples and by the subtraction of this term from all odd samples. The corrective term is chosen so that the residual difference between :math:`\left(f(k)\right)_{k=0}^{K-1}` and :math:`\left(y[k]\right)_{k=0}^{K-1}` is minimized in a discrete least-squares sense under the constraint that :math:`f` is well-defined. This mechanism is activated by setting ``regularized = True`` in the ``PeriodicSpline1D.from_samples`` constructor. It can be thought of as a doctoring of the samples that would enforce that the component at the highest discrete frequency of their discrete Fourier transform vanishes.
47
47
  * The second mechanism is made available in the ``PeriodicSpline1D.from_smoothed_samples`` constructor. It acknowledges the fact that the samples may exhibit a local variability that, sometimes, one is inclined to attribute to noise. In this case, the user can choose to restore smoothness to :math:`f` beyond the smoothness inherited by the B-splines, at some cost in the exactitude of interpolation. More precisely, if we let :math:`\left(\lambda[m]\right)_{m=0}^{n}` be a vector that represents the weight of variational regularization, then the criterion being minimized is
48
48
 
49
49
  .. math::
@@ -16,7 +16,7 @@ Linear-Algebra Formulation
16
16
  The obects that the class ``PeriodicSpline1D`` operates upon are mathematical functions and consist in descriptions of mappings :math:`f:{\mathbb{R}}\rightarrow{\mathbb{R}},x\mapsto f(x).` Oftentimes, the class allows one to obtain a new *mapping* from an existing one, for instance the gradient of a spline (not just a number but the whole function :math:`\dot{f}`) out of its original form :math:`f.` This is all good, but one is sometimes also interested in the more mundane goal of experimenting with a fixed mapping, typically to ask to what number :math:`f(x)\in{\mathbb{R}}` is the argument :math:`x\in{\mathbb{R}}` mapped to by :math:`f:{\mathbb{R}}\rightarrow{\mathbb{R}}.` The ``splinekit`` library offers two possibilities to address this goal.
17
17
 
18
18
  * ``PeriodicSpline1D.at`` returns the value :math:`f(x)` of the spline :math:`f` evaluated at :math:`x.`
19
- * ``PeriodicSpline1D.get_samples`` returns an array of values at arguments separated by a uniform step.
19
+ * ``PeriodicSpline1D.get_samples`` returns an array of values at arguments separated by a constant step.
20
20
 
21
21
  The two possibilities rely on the recipe followed by all one-dimensional uniform polynomial splines of nonnegative integer degree :math:`n\in{\mathbb{N}},` according to which an argument :math:`x` is mapped to the value
22
22
 
@@ -28,12 +28,14 @@ where :math:`K\in{\mathbb{N}}+1` is a positive integer period, :math:`c` is an a
28
28
  Since the support of a B-spline is finite, the sum is finite at any given argument :math:`x.` Moreover, since B-splines of positive degrees are themselves made of unit-length pieces of polynomials, one can deploy the formalism of linear-algebra to make the expression of the spline recipe take the form
29
29
 
30
30
  .. math::
31
- \begin{eqnarray*}
32
- \forall n\in{\mathbb{N}}+1,\forall x\in{\mathbb{R}}:f(x)&=&\left(\begin{array}{c}c[{\left(-m\right)\bmod K}]\\c[{\left(1-m\right)\bmod K}]\\c[{\left(2-m]\right)\bmod K}\\\vdots\\c[{\left(n-m\right)\bmod K}]\end{array}\right)^{{\mathsf{T}}}\,\left(\begin{array}{ccccc}w_{0,0}^{n}&w_{0,1}^{n}&w_{0,2}^{n}&\cdots&w_{0,n}^{n}\\w_{1,0}^{n}&w_{1,1}^{n}&w_{1,2}^{n}&\cdots&w_{1,n}^{n}\\w_{2,0}^{n}&w_{2,1}^{n}&w_{2,2}^{n}&\cdots&w_{2,n}^{n}\\\vdots&\vdots&\vdots&\ddots&\vdots\\w_{n,0}^{n}&w_{n,1}^{n}&w_{n,2}^{n}&\cdots&w_{n,n}^{n}\end{array}\right)\,\left(\begin{array}{c}1\\v\\v^{2}\\\vdots\\v^{n}\end{array}\right)\\
31
+ \begin{array}{rcl}
32
+ \forall n\in{\mathbb{N}}+1,\forall x\in{\mathbb{R}}:f(x)&=&\left(\begin{array}{c}c[{\left(-r\right)\bmod K}]\\c[{\left(1-r\right)\bmod K}]\\c[{\left(2-r]\right)\bmod K}\\\vdots\\c[{\left(n-r\right)\bmod K}]\end{array}\right)^{{\mathsf{T}}}\,\left(\begin{array}{ccccc}w_{0,0}^{n}&w_{0,1}^{n}&w_{0,2}^{n}&\cdots&w_{0,n}^{n}\\w_{1,0}^{n}&w_{1,1}^{n}&w_{1,2}^{n}&\cdots&w_{1,n}^{n}\\w_{2,0}^{n}&w_{2,1}^{n}&w_{2,2}^{n}&\cdots&w_{2,n}^{n}\\\vdots&\vdots&\vdots&\ddots&\vdots\\w_{n,0}^{n}&w_{n,1}^{n}&w_{n,2}^{n}&\cdots&w_{n,n}^{n}\end{array}\right)\,\left(\begin{array}{c}1\\v\\v^{2}\\\vdots\\v^{n}\end{array}\right)\\
33
33
  &=&{\color{blue}{{\mathbf{c}}}}^{{\mathsf{T}}}\,{\color{blue}{{\mathbf{W}}^{n}}}\,{\color{blue}{{\mathbf{v}}^{n}}},
34
- \end{eqnarray*}
34
+ \end{array}
35
35
 
36
- where :math:`{\color{blue}{{\mathbf{c}}}}\in{\mathbb{R}}^{n+1}` is a vector whose :math:`n+1` components are extracted from the data-dependent array :math:`c` at some integer :math:`m\in{\mathbb{Z}}` that depends in discrete fashion on :math:`\left(x-\delta x\right),` where :math:`{\color{blue}{{\mathbf{W}}^{n}}}\in{\mathbb{R}}^{\left(n+1\right)\times\left(n+1\right)}` is a matrix that depends on :math:`n` only, and where :math:`{\color{blue}{{\mathbf{v}}^{n}}}\in{\mathbb{R}}^{n+1}` is a Vandermonde vector whose every component belongs to the interval :math:`[0,1]` and is made to depend continuously on :math:`\left(x-\delta x\right).`
36
+ where :math:`{\color{blue}{{\mathbf{c}}}}\in{\mathbb{R}}^{n+1}` is a vector whose :math:`n+1` components are extracted from the data-dependent array :math:`c` at some integer :math:`r\in{\mathbb{Z}}` that depends in discrete fashion on :math:`\left(x-\delta x\right),` where :math:`{\color{blue}{{\mathbf{W}}^{n}}}\in{\mathbb{R}}^{\left(n+1\right)\times\left(n+1\right)}` is a matrix that depends on :math:`n` only, and where :math:`{\color{blue}{{\mathbf{v}}^{n}}}\in{\mathbb{R}}^{n+1}` is a Vandermonde vector whose every component belongs to the interval :math:`[0,1]` and is made to depend continuously on :math:`\left(x-\delta x\right).`
37
+
38
+ ----
37
39
 
38
40
  Evaluation at a Single Argument
39
41
  -------------------------------
@@ -44,17 +46,21 @@ To evaluate a one-dimensional periodic spline :math:`f` of positive degree :math
44
46
 
45
47
  `Single argument <https://splinekit.github.io/splinekit-jupyterlite/notebooks/index.html?path=spline_at_scalar.ipynb>`_
46
48
 
49
+ ----
50
+
47
51
  Evaluation at Multiple Arguments
48
52
  --------------------------------
49
53
 
50
- We want now to evaluate :math:`f(x)` at the :math:`L\,M` arguments :math:`x\in\left\{x_{0}+q/M\right\}_{q=0}^{L\,M-1},` where :math:`M\in{\mathbb{N}}+1` is some positive integer oversampling factor, :math:`L\in{\mathbb{N}}+1` is the length of the support over which we want to sample :math:`f,` and :math:`x_{0}\in{\mathbb{R}}` is the argument of the first sample. To do so, we take advantage of ``PeriodicSpline1D.get_samples``. In the next piece of code, we illustrate how the combination of :math:`L,` :math:`M,` and :math:`x_{0}` can be used to specify the arguments where the spline is evaluated.
54
+ We want now to evaluate :math:`f(x)` at the :math:`L\,M` arguments :math:`x\in\left\{x_{0}+k/M\right\}_{k=0}^{L\,M-1},` where :math:`M\in{\mathbb{N}}+1` is some positive integer oversampling factor, :math:`L\in{\mathbb{N}}+1` is the length of the support over which we want to sample :math:`f,` and :math:`x_{0}\in{\mathbb{R}}` is the argument of the first sample. To do so, we take advantage of ``PeriodicSpline1D.get_samples``. In the next piece of code, we illustrate how the combination of :math:`L,` :math:`M,` and :math:`x_{0}` can be used to specify the arguments where the spline is evaluated.
51
55
 
52
56
  .. admonition:: Jupyter Lab notebook
53
57
 
54
58
  `Multiple arguments <https://splinekit.github.io/splinekit-jupyterlite/notebooks/index.html?path=spline_at_array.ipynb>`_
55
59
 
60
+ ----
61
+
56
62
  Experimental Performance
57
- ^^^^^^^^^^^^^^^^^^^^^^^^
63
+ ------------------------
58
64
 
59
65
  When we evaluate a spline jointly at multiple arguments spaced regularly as above, it is judicious to pay attention on how the terms of :math:`{\mathbf{c}}^{{\mathsf{T}}}\,{\mathbf{W}}^{n}\,{\mathbf{v}}^{n}` depend on the variables of interest. In particular, when we compare the computation of :math:`f(x_{0}+q/M)` to that of :math:`f(x_{0}+\left(q+M\right)/M),` a detailed analysis reveals that the vector :math:`{\mathbf{c}}` changes, while the vector resulting from the product :math:`{\mathbf{W}}^{n}\,{\mathbf{v}}^{n}` is identical in the two cases. This invariance leads to computational savings.
60
66