diff --git a/dev/.documenter-siteinfo.json b/dev/.documenter-siteinfo.json index 829ca00c..4de92628 100644 --- a/dev/.documenter-siteinfo.json +++ b/dev/.documenter-siteinfo.json @@ -1 +1 @@ -{"documenter":{"julia_version":"1.9.3","generation_timestamp":"2023-09-23T13:43:41","documenter_version":"1.0.1"}} \ No newline at end of file +{"documenter":{"julia_version":"1.9.3","generation_timestamp":"2023-09-23T13:43:59","documenter_version":"1.0.1"}} \ No newline at end of file diff --git a/dev/index.html b/dev/index.html index 0368035d..8e39d651 100644 --- a/dev/index.html +++ b/dev/index.html @@ -1,6 +1,244 @@ -DataInterpolations.jl · DataInterpolations.jl

DataInterpolations.jl

DataInterpolations.jl is a library for performing interpolations of one-dimensional data. By "data interpolations" we mean techniques for interpolating possibly noisy data, and thus some methods are mixtures of regressions with interpolations (i.e. do not hit the data points exactly, smoothing out the lines). This library can be used to fill in intermediate data points in applications like timeseries data.

Available Interpolations

In all cases, u an AbstractVector of values and t is an AbstractVector of timepoints corresponding to (u,t) pairs.

  • ConstantInterpolation(u,t) - A piecewise constant interpolation.

  • LinearInterpolation(u,t) - A linear interpolation.

  • QuadraticInterpolation(u,t) - A quadratic interpolation.

  • LagrangeInterpolation(u,t,n) - A Lagrange interpolation of order n.

  • QuadraticSpline(u,t) - A quadratic spline interpolation.

  • CubicSpline(u,t) - A cubic spline interpolation.

  • AkimaInterpolation(u, t) - Akima spline interpolation provides a smoothing effect and is computationally efficient.

  • BSplineInterpolation(u,t,d,pVec,knotVec) - An interpolation B-spline. This is a B-spline which hits each of the data points. The argument choices are: - d - degree of B-spline - pVec - Symbol to Parameters Vector, pVec = :Uniform for uniform spaced parameters and pVec = :ArcLen for parameters generated by chord length method. - knotVec - Symbol to Knot Vector, knotVec = :Uniform for uniform knot vector, knotVec = :Average for average spaced knot vector.

  • BSplineApprox(u,t,d,h,pVec,knotVec) - A regression B-spline which smooths the fitting curve. The argument choices are the same as the BSplineInterpolation, with the additional parameter h<length(t) which is the number of control points to use, with smaller h indicating more smoothing.

Extension Methods

The follow methods require extra dependencies and will be loaded as package extensions.

  • Curvefit(u,t,m,p,alg) - An interpolation which is done by fitting a user-given functional form m(t,p) where p is the vector of parameters. The user's input p is a an initial value for a least-square fitting, alg is the algorithm choice to use for optimize the cost function (sum of squared deviations) via Optim.jl and optimal ps are used in the interpolation. Requires using RegularizationTools

Plotting

DataInterpolations.jl is tied into the Plots.jl ecosystem, by way of RecipesBase. Any interpolation can be plotted using the plot command (or any other), since they have type recipes associated with them.

For convenience, and to allow keyword arguments to propagate properly, DataInterpolations.jl also defines several series types, corresponding to different interpolations.

The series types defined are:

  • :linear_interp
  • :quadratic_interp
  • :lagrange_interp
  • :quadratic_spline
  • :cubic_spline

By and large, these accept the same keywords as their function counterparts.

+DataInterpolations.jl · DataInterpolations.jl

DataInterpolations.jl

DataInterpolations.jl is a library for performing interpolations of one-dimensional data. By "data interpolations" we mean techniques for interpolating possibly noisy data, and thus some methods are mixtures of regressions with interpolations (i.e. do not hit the data points exactly, smoothing out the lines). This library can be used to fill in intermediate data points in applications like timeseries data.

Installation

To install DataInterpolations.jl, use the Julia package manager:

using Pkg
+Pkg.add("DataInterpolations")

Available Interpolations

In all cases, u an AbstractVector of values and t is an AbstractVector of timepoints corresponding to (u,t) pairs.

  • ConstantInterpolation(u,t) - A piecewise constant interpolation.

  • LinearInterpolation(u,t) - A linear interpolation.

  • QuadraticInterpolation(u,t) - A quadratic interpolation.

  • LagrangeInterpolation(u,t,n) - A Lagrange interpolation of order n.

  • QuadraticSpline(u,t) - A quadratic spline interpolation.

  • CubicSpline(u,t) - A cubic spline interpolation.

  • AkimaInterpolation(u, t) - Akima spline interpolation provides a smoothing effect and is computationally efficient.

  • BSplineInterpolation(u,t,d,pVec,knotVec) - An interpolation B-spline. This is a B-spline which hits each of the data points. The argument choices are:

    • d - degree of B-spline
    • pVec - Symbol to Parameters Vector, pVec = :Uniform for uniform spaced parameters and pVec = :ArcLen for parameters generated by chord length method.
    • knotVec - Symbol to Knot Vector, knotVec = :Uniform for uniform knot vector, knotVec = :Average for average spaced knot vector.
  • BSplineApprox(u,t,d,h,pVec,knotVec) - A regression B-spline which smooths the fitting curve. The argument choices are the same as the BSplineInterpolation, with the additional parameter h<length(t) which is the number of control points to use, with smaller h indicating more smoothing.

Extension Methods

The follow methods require extra dependencies and will be loaded as package extensions.

  • Curvefit(u,t,m,p,alg) - An interpolation which is done by fitting a user-given functional form m(t,p) where p is the vector of parameters. The user's input p is a an initial value for a least-square fitting, alg is the algorithm choice to use for optimize the cost function (sum of squared deviations) via Optim.jl and optimal ps are used in the interpolation. Requires using RegularizationTools

Plotting

DataInterpolations.jl is tied into the Plots.jl ecosystem, by way of RecipesBase. Any interpolation can be plotted using the plot command (or any other), since they have type recipes associated with them.

For convenience, and to allow keyword arguments to propagate properly, DataInterpolations.jl also defines several series types, corresponding to different interpolations.

The series types defined are:

  • :linear_interp
  • :quadratic_interp
  • :lagrange_interp
  • :quadratic_spline
  • :cubic_spline

By and large, these accept the same keywords as their function counterparts.

Contributing

Reproducibility

The documentation of this SciML package was built using these direct dependencies,
Status `~/work/DataInterpolations.jl/DataInterpolations.jl/docs/Project.toml`
+  [82cc6244] DataInterpolations v4.1.0 `~/work/DataInterpolations.jl/DataInterpolations.jl`
+  [e30172f5] Documenter v1.0.1
+  [429524aa] Optim v1.7.7
+  [91a5bcdd] Plots v1.39.0
+  [29dad682] RegularizationTools v0.6.0
+  [860ef19b] StableRNGs v1.0.0
and using this machine and Julia version.
Julia Version 1.9.3
+Commit bed2cd540a1 (2023-08-24 14:43 UTC)
+Build Info:
+  Official https://julialang.org/ release
+Platform Info:
+  OS: Linux (x86_64-linux-gnu)
+  CPU: 2 × Intel(R) Xeon(R) Platinum 8272CL CPU @ 2.60GHz
+  WORD_SIZE: 64
+  LIBM: libopenlibm
+  LLVM: libLLVM-14.0.6 (ORCJIT, skylake-avx512)
+  Threads: 1 on 2 virtual cores
A more complete overview of all dependencies and their versions is also provided.
Status `~/work/DataInterpolations.jl/DataInterpolations.jl/docs/Manifest.toml`
+  [a4c015fc] ANSIColoredPrinters v0.0.1
+  [1520ce14] AbstractTrees v0.4.4
+  [79e6a3ab] Adapt v3.6.2
+  [4fba245c] ArrayInterface v7.4.11
+  [d1d4a3ce] BitFlags v0.1.7
+  [49dc2e85] Calculus v0.5.1
+  [944b1d66] CodecZlib v0.7.2
+  [35d6a980] ColorSchemes v3.24.0
+  [3da002f7] ColorTypes v0.11.4
+  [c3611d14] ColorVectorSpace v0.10.0
+  [5ae59095] Colors v0.12.10
+  [bbf7d656] CommonSubexpressions v0.3.0
+  [34da2185] Compat v4.9.0
+  [f0e56b4a] ConcurrentUtilities v2.2.1
+  [187b0558] ConstructionBase v1.5.4
+  [d38c429a] Contour v0.6.2
+  [9a962f9c] DataAPI v1.15.0
+  [82cc6244] DataInterpolations v4.1.0 `~/work/DataInterpolations.jl/DataInterpolations.jl`
+  [864edb3b] DataStructures v0.18.15
+  [e2d170a0] DataValueInterfaces v1.0.0
+  [8bb1440f] DelimitedFiles v1.9.1
+  [163ba53b] DiffResults v1.1.0
+  [b552c78f] DiffRules v1.15.1
+  [ffbed154] DocStringExtensions v0.9.3
+  [e30172f5] Documenter v1.0.1
+  [460bff9d] ExceptionUnwrapping v0.1.9
+  [c87230d0] FFMPEG v0.4.1
+  [1a297f60] FillArrays v1.6.1
+  [6a86dc24] FiniteDiff v2.21.1
+  [53c48c17] FixedPointNumbers v0.8.4
+  [59287772] Formatting v0.4.2
+  [f6369f11] ForwardDiff v0.10.36
+  [46192b85] GPUArraysCore v0.1.5
+  [28b8d3ca] GR v0.72.10
+  [42e2da0e] Grisu v1.0.2
+  [cd3eb016] HTTP v1.10.0
+  [b5f81e59] IOCapture v0.2.3
+  [92d709cd] IrrationalConstants v0.2.2
+  [82899510] IteratorInterfaceExtensions v1.0.0
+  [1019f520] JLFzf v0.1.5
+  [692b3bcd] JLLWrappers v1.5.0
+  [682c06a0] JSON v0.21.4
+  [b964fa9f] LaTeXStrings v1.3.0
+  [23fbe1c1] Latexify v0.16.1
+  [0e77f7df] LazilyInitializedFields v1.2.1
+  [50d2b5c4] Lazy v0.15.1
+  [0fc2ff8b] LeastSquaresOptim v0.8.4
+  [d3d80556] LineSearches v7.2.0
+  [2ab3a3ac] LogExpFunctions v0.3.26
+  [e6f89c97] LoggingExtras v1.0.2
+  [d8e11817] MLStyle v0.4.17
+  [1914dd2f] MacroTools v0.5.11
+  [d0879d2d] MarkdownAST v0.1.1
+  [739be429] MbedTLS v1.1.7
+  [442fdcdd] Measures v0.3.2
+  [c03570c3] Memoize v0.4.4
+  [e1d29d7a] Missings v1.1.0
+  [d41bc354] NLSolversBase v7.8.3
+  [77ba4419] NaNMath v1.0.2
+  [4d8831e6] OpenSSL v1.4.1
+  [429524aa] Optim v1.7.7
+  [bac558e1] OrderedCollections v1.6.2
+  [d96e819e] Parameters v0.12.3
+  [69de0a69] Parsers v2.7.2
+  [b98c9c47] Pipe v1.3.0
+  [ccf2f8ad] PlotThemes v3.1.0
+  [995b91a9] PlotUtils v1.3.5
+  [91a5bcdd] Plots v1.39.0
+  [85a6dd25] PositiveFactorizations v0.2.4
+  [aea7be01] PrecompileTools v1.2.0
+  [21216c6a] Preferences v1.4.1
+  [3cdcf5f2] RecipesBase v1.3.4
+  [01d81517] RecipesPipeline v0.6.12
+  [731186ca] RecursiveArrayTools v2.38.10
+  [189a3867] Reexport v1.2.2
+  [2792f1a3] RegistryInstances v0.1.0
+  [29dad682] RegularizationTools v0.6.0
+  [05181044] RelocatableFolders v1.0.0
+  [ae029012] Requires v1.3.0
+  [6c6a2e73] Scratch v1.2.0
+  [efcf1570] Setfield v1.1.1
+  [992d4aef] Showoff v1.0.3
+  [777ac1f9] SimpleBufferStream v1.1.0
+  [a2af1166] SortingAlgorithms v1.1.1
+  [276daf66] SpecialFunctions v2.3.1
+  [860ef19b] StableRNGs v1.0.0
+  [1e83bf80] StaticArraysCore v1.4.2
+  [82ae8749] StatsAPI v1.7.0
+  [2913bbd2] StatsBase v0.34.0
+  [2efcf032] SymbolicIndexingInterface v0.2.2
+  [3783bdb8] TableTraits v1.0.1
+  [bd369af6] Tables v1.11.0
+  [62fd8b95] TensorCore v0.1.1
+  [3bb67fe8] TranscodingStreams v0.9.13
+  [5c2747f8] URIs v1.5.0
+  [3a884ed6] UnPack v1.0.2
+  [d9a01c3f] Underscores v3.0.0
+  [1cfade01] UnicodeFun v0.4.1
+  [1986cc42] Unitful v1.17.0
+  [45397f5d] UnitfulLatexify v1.6.3
+  [41fe7b60] Unzip v0.2.0
+  [6e34b625] Bzip2_jll v1.0.8+0
+  [83423d85] Cairo_jll v1.16.1+1
+  [2702e6a9] EpollShim_jll v0.0.20230411+0
+  [2e619515] Expat_jll v2.5.0+0
+⌃ [b22a6f82] FFMPEG_jll v4.4.2+2
+  [a3f928ae] Fontconfig_jll v2.13.93+0
+  [d7e528f0] FreeType2_jll v2.13.1+0
+  [559328eb] FriBidi_jll v1.0.10+0
+  [0656b61e] GLFW_jll v3.3.8+0
+  [d2c73de3] GR_jll v0.72.10+0
+  [78b55507] Gettext_jll v0.21.0+0
+  [7746bdde] Glib_jll v2.76.5+0
+  [3b182d85] Graphite2_jll v1.3.14+0
+  [2e76f6c2] HarfBuzz_jll v2.8.1+1
+  [aacddb02] JpegTurbo_jll v2.1.91+0
+  [c1c5ebd0] LAME_jll v3.100.1+0
+  [88015f11] LERC_jll v3.0.0+1
+  [1d63c593] LLVMOpenMP_jll v15.0.4+0
+  [dd4b983a] LZO_jll v2.10.1+0
+⌅ [e9f186c6] Libffi_jll v3.2.2+1
+  [d4300ac3] Libgcrypt_jll v1.8.7+0
+  [7e76a0d4] Libglvnd_jll v1.6.0+0
+  [7add5ba3] Libgpg_error_jll v1.42.0+0
+  [94ce4f54] Libiconv_jll v1.17.0+0
+  [4b2f31a3] Libmount_jll v2.35.0+0
+  [89763e89] Libtiff_jll v4.5.1+1
+  [38a345b3] Libuuid_jll v2.36.0+0
+  [e7412a2a] Ogg_jll v1.3.5+1
+⌅ [458c3c95] OpenSSL_jll v1.1.23+0
+  [efe28fd5] OpenSpecFun_jll v0.5.5+0
+  [91d4177d] Opus_jll v1.3.2+0
+  [30392449] Pixman_jll v0.42.2+0
+  [c0090381] Qt6Base_jll v6.5.2+2
+  [a44049a8] Vulkan_Loader_jll v1.3.243+0
+  [a2964d1f] Wayland_jll v1.21.0+1
+  [2381bf8a] Wayland_protocols_jll v1.25.0+0
+  [02c8fc9c] XML2_jll v2.10.4+0
+  [aed1982a] XSLT_jll v1.1.34+0
+  [ffd25f8a] XZ_jll v5.4.4+0
+  [f67eecfb] Xorg_libICE_jll v1.0.10+1
+  [c834827a] Xorg_libSM_jll v1.2.3+0
+  [4f6342f7] Xorg_libX11_jll v1.8.6+0
+  [0c0b7dd1] Xorg_libXau_jll v1.0.11+0
+  [935fb764] Xorg_libXcursor_jll v1.2.0+4
+  [a3789734] Xorg_libXdmcp_jll v1.1.4+0
+  [1082639a] Xorg_libXext_jll v1.3.4+4
+  [d091e8ba] Xorg_libXfixes_jll v5.0.3+4
+  [a51aa0fd] Xorg_libXi_jll v1.7.10+4
+  [d1454406] Xorg_libXinerama_jll v1.1.4+4
+  [ec84b674] Xorg_libXrandr_jll v1.5.2+4
+  [ea2f1a96] Xorg_libXrender_jll v0.9.10+4
+  [14d82f49] Xorg_libpthread_stubs_jll v0.1.1+0
+  [c7cfdc94] Xorg_libxcb_jll v1.15.0+0
+  [cc61e674] Xorg_libxkbfile_jll v1.1.2+0
+  [e920d4aa] Xorg_xcb_util_cursor_jll v0.1.4+0
+  [12413925] Xorg_xcb_util_image_jll v0.4.0+1
+  [2def613f] Xorg_xcb_util_jll v0.4.0+1
+  [975044d2] Xorg_xcb_util_keysyms_jll v0.4.0+1
+  [0d47668e] Xorg_xcb_util_renderutil_jll v0.3.9+1
+  [c22f9ab0] Xorg_xcb_util_wm_jll v0.4.1+1
+  [35661453] Xorg_xkbcomp_jll v1.4.6+0
+  [33bec58e] Xorg_xkeyboard_config_jll v2.39.0+0
+  [c5fb5394] Xorg_xtrans_jll v1.5.0+0
+  [3161d3a3] Zstd_jll v1.5.5+0
+  [35ca27e7] eudev_jll v3.2.9+0
+⌅ [214eeab7] fzf_jll v0.29.0+0
+  [1a1c6b14] gperf_jll v3.1.1+0
+  [a4ae2306] libaom_jll v3.4.0+0
+  [0ac62f75] libass_jll v0.15.1+0
+  [2db6ffa8] libevdev_jll v1.11.0+0
+  [f638f0a6] libfdk_aac_jll v2.0.2+0
+  [36db933b] libinput_jll v1.18.0+0
+  [b53b4c65] libpng_jll v1.6.38+0
+  [f27f6e37] libvorbis_jll v1.3.7+1
+  [009596ad] mtdev_jll v1.1.6+0
+  [1270edf5] x264_jll v2021.5.5+0
+  [dfaa095f] x265_jll v3.5.0+0
+  [d8fb68d0] xkbcommon_jll v1.4.1+1
+  [0dad84c5] ArgTools v1.1.1
+  [56f22d72] Artifacts
+  [2a0f44e3] Base64
+  [ade2ca70] Dates
+  [8ba89e20] Distributed
+  [f43a241f] Downloads v1.6.0
+  [7b1f6079] FileWatching
+  [9fa8497b] Future
+  [b77e0a4c] InteractiveUtils
+  [b27032c2] LibCURL v0.6.3
+  [76f85450] LibGit2
+  [8f399da3] Libdl
+  [37e2e46d] LinearAlgebra
+  [56ddb016] Logging
+  [d6f4376e] Markdown
+  [a63ad114] Mmap
+  [ca575930] NetworkOptions v1.2.0
+  [44cfe95a] Pkg v1.9.2
+  [de0858da] Printf
+  [3fa0cd96] REPL
+  [9a3f8284] Random
+  [ea8e919c] SHA v0.7.0
+  [9e88b42a] Serialization
+  [6462fe0b] Sockets
+  [2f01184e] SparseArrays
+  [10745b16] Statistics v1.9.0
+  [4607b0f0] SuiteSparse
+  [fa267f1f] TOML v1.0.3
+  [a4e569a6] Tar v1.10.0
+  [8dfed614] Test
+  [cf7118a7] UUIDs
+  [4ec0a83e] Unicode
+  [e66e0078] CompilerSupportLibraries_jll v1.0.5+0
+  [deac9b47] LibCURL_jll v7.84.0+0
+  [29816b5a] LibSSH2_jll v1.10.2+0
+  [c8ffd9c3] MbedTLS_jll v2.28.2+0
+  [14a3606d] MozillaCACerts_jll v2022.10.11
+  [4536629a] OpenBLAS_jll v0.3.21+4
+  [05823500] OpenLibm_jll v0.8.1+0
+  [efcefdf7] PCRE2_jll v10.42.0+0
+  [bea87d4a] SuiteSparse_jll v5.10.1+6
+  [83775a58] Zlib_jll v1.2.13+0
+  [8e850b90] libblastrampoline_jll v5.8.0+0
+  [8e850ede] nghttp2_jll v1.48.0+0
+  [3f19e933] p7zip_jll v17.4.0+0
+Info Packages marked with ⌃ and ⌅ have new versions available, but those with ⌅ are restricted by compatibility constraints from upgrading. To see why use `status --outdated -m`

You can also download the manifest file and the project file.

diff --git a/dev/interface/index.html b/dev/interface/index.html index 029d59a1..26e4a6d0 100644 --- a/dev/interface/index.html +++ b/dev/interface/index.html @@ -1,9 +1,5 @@ -Interface · DataInterpolations.jl

Interface for using the Interpolations object

We will again use the same data as the previous tutorial to demonstrate how to use the Interpolations object for computing interpolated values at any time point, its derivatives and integrals.

using DataInterpolations
+Interface · DataInterpolations.jl

Interface for using the Interpolations object

We will again use the same data as the previous tutorial to demonstrate how to use the Interpolations object for computing interpolated values at any time point, its derivatives and integrals.

using DataInterpolations
 
 # Dependent variable
 u = [14.7, 11.51, 10.41, 14.95, 12.24, 11.22]
@@ -18,7 +14,7 @@
  252.3

Interpolated values

All Interpolation methods return an object from which we can compute the value of the dependent variable at any time point.

We will use CubicSpline method for demonstration but the API is same for all the methods.

A = CubicSpline(u, t)
 
 # For interpolation do, A(t)
-A(100.0)
10.101397401671347
Note

The values computed beyond the range of the time points provided during interpolation will not be reliable as these methods only perform well within the range and the first/last piece polynomial fit is extrapolated on either sides which might not reflect the true nature of the data.

Derivatives

Derivatives of the interpolated curves can also be computed at any point for all the methods.

We will continue with the above example, but the API is same for all the methods.

# derivative(A, t)
+A(100.0)
10.101397401671347
Note

The values computed beyond the range of the time points provided during interpolation will not be reliable as these methods only perform well within the range and the first/last piece polynomial fit is extrapolated on either sides which might not reflect the true nature of the data.

Derivatives

Derivatives of the interpolated curves can also be computed at any point for all the methods.

We will continue with the above example, but the API is same for all the methods.

# derivative(A, t)
 DataInterpolations.derivative(A, 1.0)
-0.051048168999699245

Integrals

Integrals of the interpolated curves can also be computed easily.

Currently, this is implemented only for a few methods - ConstantInterpolation, LinearInterpolation, QuadraticInterpolation, QuadraticSpline and CubicSpline.

To compute the integrals from the start of time points provided during interpolation to any point, we can do:

# integral(A, t)
 DataInterpolations.integral(A, 5.0)
72.86338611822583

If we want to compute integrals between two points, we can do:

# integral(A, t1, t2)
 DataInterpolations.integral(A, 1.0, 5.0)
114.9694509973317
Note

If the times provided in the integral goes beyond the range of the time points provided during interpolation, it uses extrapolation methods to compute the values and hence the integral can be misrepsentative and might not reflect the true nature of the data.

diff --git a/dev/methods/a1174cf6.svg b/dev/methods/0fe55958.svg similarity index 97% rename from dev/methods/a1174cf6.svg rename to dev/methods/0fe55958.svg index 5ce208d3..d3d7f662 100644 --- a/dev/methods/a1174cf6.svg +++ b/dev/methods/0fe55958.svg @@ -1,59 +1,59 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev/methods/e2ac7566.svg b/dev/methods/0ffb910a.svg similarity index 97% rename from dev/methods/e2ac7566.svg rename to dev/methods/0ffb910a.svg index 5113f360..a1534afe 100644 --- a/dev/methods/e2ac7566.svg +++ b/dev/methods/0ffb910a.svg @@ -1,53 +1,53 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev/methods/7ee6c03d.svg b/dev/methods/38c34863.svg similarity index 97% rename from dev/methods/7ee6c03d.svg rename to dev/methods/38c34863.svg index 8a687f9f..a8e2be91 100644 --- a/dev/methods/7ee6c03d.svg +++ b/dev/methods/38c34863.svg @@ -1,55 +1,55 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev/methods/5e0d0d60.svg b/dev/methods/4654e44b.svg similarity index 97% rename from dev/methods/5e0d0d60.svg rename to dev/methods/4654e44b.svg index 1b456614..f93ae4be 100644 --- a/dev/methods/5e0d0d60.svg +++ b/dev/methods/4654e44b.svg @@ -1,55 +1,55 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev/methods/bc1428ff.svg b/dev/methods/4cbc6ced.svg similarity index 97% rename from dev/methods/bc1428ff.svg rename to dev/methods/4cbc6ced.svg index 9113be03..09130f4a 100644 --- a/dev/methods/bc1428ff.svg +++ b/dev/methods/4cbc6ced.svg @@ -1,57 +1,57 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev/methods/9bf941dc.svg b/dev/methods/7e40bb4e.svg similarity index 97% rename from dev/methods/9bf941dc.svg rename to dev/methods/7e40bb4e.svg index 89486a37..99ad0345 100644 --- a/dev/methods/9bf941dc.svg +++ b/dev/methods/7e40bb4e.svg @@ -1,55 +1,55 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev/methods/1494d86e.svg b/dev/methods/86cacdf8.svg similarity index 97% rename from dev/methods/1494d86e.svg rename to dev/methods/86cacdf8.svg index 9ef254c4..1ac0d462 100644 --- a/dev/methods/1494d86e.svg +++ b/dev/methods/86cacdf8.svg @@ -1,55 +1,55 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev/methods/a89c4828.svg b/dev/methods/8e16dc1f.svg similarity index 95% rename from dev/methods/a89c4828.svg rename to dev/methods/8e16dc1f.svg index 50eb4e87..6ac860d8 100644 --- a/dev/methods/a89c4828.svg +++ b/dev/methods/8e16dc1f.svg @@ -1,145 +1,145 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev/methods/e811615d.svg b/dev/methods/a291a534.svg similarity index 97% rename from dev/methods/e811615d.svg rename to dev/methods/a291a534.svg index 4225b5d5..5e951e7f 100644 --- a/dev/methods/e811615d.svg +++ b/dev/methods/a291a534.svg @@ -1,57 +1,57 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev/methods/42246c6e.svg b/dev/methods/dd4fc881.svg similarity index 97% rename from dev/methods/42246c6e.svg rename to dev/methods/dd4fc881.svg index 19d0032a..cdb7c3c6 100644 --- a/dev/methods/42246c6e.svg +++ b/dev/methods/dd4fc881.svg @@ -1,55 +1,55 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev/methods/66138025.svg b/dev/methods/eaa255a6.svg similarity index 95% rename from dev/methods/66138025.svg rename to dev/methods/eaa255a6.svg index d8dd17e5..7c263921 100644 --- a/dev/methods/66138025.svg +++ b/dev/methods/eaa255a6.svg @@ -1,145 +1,145 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev/methods/1af9e1c8.svg b/dev/methods/ec313ef3.svg similarity index 86% rename from dev/methods/1af9e1c8.svg rename to dev/methods/ec313ef3.svg index 6f9ca401..ef1440f4 100644 --- a/dev/methods/1af9e1c8.svg +++ b/dev/methods/ec313ef3.svg @@ -1,62 +1,62 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev/methods/78cf93b8.svg b/dev/methods/efbd33f7.svg similarity index 80% rename from dev/methods/78cf93b8.svg rename to dev/methods/efbd33f7.svg index cecd794f..8c44f9f3 100644 --- a/dev/methods/78cf93b8.svg +++ b/dev/methods/efbd33f7.svg @@ -1,248 +1,248 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev/methods/index.html b/dev/methods/index.html index b77bce60..0509dd7a 100644 --- a/dev/methods/index.html +++ b/dev/methods/index.html @@ -1,9 +1,5 @@ -Methods · DataInterpolations.jl

Interpolation using different methods

We will use the following data to demonstrate interpolation methods.

using DataInterpolations, Plots
+Methods · DataInterpolations.jl

Interpolation using different methods

We will use the following data to demonstrate interpolation methods.

using DataInterpolations, Plots
 
 # Dependent variable
 u = [14.7, 11.51, 10.41, 14.95, 12.24, 11.22]
@@ -15,38 +11,38 @@
  109.66
  162.66
  205.8
- 252.3

For each method, we will show how to perform the fit and use the plot recipe to show the fitting curve.

Linear Interpolation

This is a linear interpolation between ends points of interval of input data point.

A = LinearInterpolation(u,t)
-scatter(t, u, label="input data")
-plot!(A)
Example block output

Quadratic Interpolation

This function fits a parabola passing through the two nearest points from the input data point as well as the next-closest point in the right or the left, depending on whether the forward- or backward-looking mode is selected (default mode is forward-looking). It is continuous and piecewise differentiable.

A = QuadraticInterpolation(u,t) # same as QuadraticInterpolation(u,t,:Forward)
+ 252.3

For each method, we will show how to perform the fit and use the plot recipe to show the fitting curve.

Linear Interpolation

This is a linear interpolation between ends points of interval of input data point.

A = LinearInterpolation(u, t)
+scatter(t, u, label = "input data")
+plot!(A)
Example block output

Quadratic Interpolation

This function fits a parabola passing through the two nearest points from the input data point as well as the next-closest point in the right or the left, depending on whether the forward- or backward-looking mode is selected (default mode is forward-looking). It is continuous and piecewise differentiable.

A = QuadraticInterpolation(u, t) # same as QuadraticInterpolation(u,t,:Forward)
 # alternatively: A = QuadraticInterpolation(u,t,:Backward)
-scatter(t, u, label="input data")
-plot!(A)
Example block output

Lagrange Interpolation

It fits polynomial of degree d (=length(t)-1), and is thuse a continuously differentiable function.

A = LagrangeInterpolation(u,t)
-scatter(t, u, label="input data")
-plot!(A)
Example block output

Constant Interpolation

This function is constant between data points. By default it takes value at left end of the interval. One can change that behavior by passing the keyword argument dir = :right.

A = ConstantInterpolation(u,t)
-scatter(t, u, label="input data")
-plot!(A)
Example block output

Or using the right endpoints:

A = ConstantInterpolation(u, t, dir=:right)
-scatter(t, u, label="input data")
-plot!(A)
Example block output

Quadratic Spline

This is the quadratic spline. It is a continuously differentiable interpolation which hits each of the data points exactly. Splines are a local interpolation method, meaning that the curve in a given spot is only affected by the points nearest to it.

A = QuadraticSpline(u,t)
-scatter(t, u, label="input data")
-plot!(A)
Example block output

Cubic Spline

This is the cubic spline. It is a continuously twice differentiable interpolation which hits each of the data points exactly.

A = CubicSpline(u,t)
-scatter(t, u, label="input data")
-plot!(A)
Example block output

B-Splines

This is an interpolating B-spline. B-splines are a global method, meaning that every data point is taken into account for each point of the curve. The interpolating B-spline is the version which hits each of the points. This method is described in more detail here. Let's plot a cubic B-spline (3rd order). Since the data points are not close to uniformly spaced, we will use the :ArcLen and :Average choices:

A = BSplineInterpolation(u, t, 3, :ArcLen, :Average)
-scatter(t, u, label="input data")
-plot!(A)
Example block output

The approximating B-spline is a smoothed version of the B-spline. It again is a global method. In this case, we need to give a number of control points length(t)>h and this method fits a B-spline through the control points which is a least square approximation. This has a natural effect of smoothing the data. For example, if we use 4 control points, we get the result:

A = BSplineApprox(u, t, 3, 4, :ArcLen, :Average)
-scatter(t, u, label="input data")
-plot!(A)
Example block output

Regularization Smoothing

Smoothing by regularization (a.k.a. ridge regression) finds a function $\hat{u}$ that minimizes the objective function:

$Q(\hat{u}) = \int_{t_1}^{t_N} |\hat{u}(t) - u(t)|^2 \mathrm{d}t + \lambda \int_{\hat{t}_1}^{\hat{t}_N} |\hat{u}^{(d)}(\hat{t})|^2 \mathrm{d} \hat{t}$

where $(d)$ denotes derivative order and $\lambda$ is the regularization (smoothing) parameter. The integrals are evaluated numerically at the set of $t$ values for the first term and $\hat{t}$ values for the second term (equal to $t$ if not provided). Regularization smoothing is a global method and creates a smooth curve directly. See Stickel (2010) Comput. Chem. Eng. 34:467 for details. The implementation in this package uses cubic splines to interpolate between the smoothed points after they are determined.

using RegularizationTools
+scatter(t, u, label = "input data")
+plot!(A)
Example block output

Lagrange Interpolation

It fits polynomial of degree d (=length(t)-1), and is thuse a continuously differentiable function.

A = LagrangeInterpolation(u, t)
+scatter(t, u, label = "input data")
+plot!(A)
Example block output

Constant Interpolation

This function is constant between data points. By default it takes value at left end of the interval. One can change that behavior by passing the keyword argument dir = :right.

A = ConstantInterpolation(u, t)
+scatter(t, u, label = "input data")
+plot!(A)
Example block output

Or using the right endpoints:

A = ConstantInterpolation(u, t, dir = :right)
+scatter(t, u, label = "input data")
+plot!(A)
Example block output

Quadratic Spline

This is the quadratic spline. It is a continuously differentiable interpolation which hits each of the data points exactly. Splines are a local interpolation method, meaning that the curve in a given spot is only affected by the points nearest to it.

A = QuadraticSpline(u, t)
+scatter(t, u, label = "input data")
+plot!(A)
Example block output

Cubic Spline

This is the cubic spline. It is a continuously twice differentiable interpolation which hits each of the data points exactly.

A = CubicSpline(u, t)
+scatter(t, u, label = "input data")
+plot!(A)
Example block output

B-Splines

This is an interpolating B-spline. B-splines are a global method, meaning that every data point is taken into account for each point of the curve. The interpolating B-spline is the version which hits each of the points. This method is described in more detail here. Let's plot a cubic B-spline (3rd order). Since the data points are not close to uniformly spaced, we will use the :ArcLen and :Average choices:

A = BSplineInterpolation(u, t, 3, :ArcLen, :Average)
+scatter(t, u, label = "input data")
+plot!(A)
Example block output

The approximating B-spline is a smoothed version of the B-spline. It again is a global method. In this case, we need to give a number of control points length(t)>h and this method fits a B-spline through the control points which is a least square approximation. This has a natural effect of smoothing the data. For example, if we use 4 control points, we get the result:

A = BSplineApprox(u, t, 3, 4, :ArcLen, :Average)
+scatter(t, u, label = "input data")
+plot!(A)
Example block output

Regularization Smoothing

Smoothing by regularization (a.k.a. ridge regression) finds a function $\hat{u}$ that minimizes the objective function:

$Q(\hat{u}) = \int_{t_1}^{t_N} |\hat{u}(t) - u(t)|^2 \mathrm{d}t + \lambda \int_{\hat{t}_1}^{\hat{t}_N} |\hat{u}^{(d)}(\hat{t})|^2 \mathrm{d} \hat{t}$

where $(d)$ denotes derivative order and $\lambda$ is the regularization (smoothing) parameter. The integrals are evaluated numerically at the set of $t$ values for the first term and $\hat{t}$ values for the second term (equal to $t$ if not provided). Regularization smoothing is a global method and creates a smooth curve directly. See Stickel (2010) Comput. Chem. Eng. 34:467 for details. The implementation in this package uses cubic splines to interpolate between the smoothed points after they are determined.

using RegularizationTools
 d = 2
 λ = 1e3
-A = RegularizationSmooth(u,t, d; λ=λ, alg=:fixed)
+A = RegularizationSmooth(u, t, d; λ = λ, alg = :fixed)
 û = A.û
 # interpolate using the smoothed values
 N = 200
-titp = collect(range(minimum(t), maximum(t), length=N))
+titp = collect(range(minimum(t), maximum(t), length = N))
 uitp = A.Aitp.(titp)
 lw = 1.5
-scatter(t,u, label="data")
-scatter!(t,û, marker=:square, label="smoothed data")
-plot!(titp,uitp, lw=lw, label="smoothed interpolation")
Example block output

Dense Data Demonstration

Some methods are better suited for dense data. Let's generate such data to demonstrate these methods.

import StableRNGs: StableRNG
+scatter(t, u, label = "data")
+scatter!(t, û, marker = :square, label = "smoothed data")
+plot!(titp, uitp, lw = lw, label = "smoothed interpolation")
Example block output

Dense Data Demonstration

Some methods are better suited for dense data. Let's generate such data to demonstrate these methods.

import StableRNGs: StableRNG
 rng = StableRNG(318)
 t = sort(10 .* rand(rng, 100))
 u = sin.(t) .+ 0.5 * randn(rng, 100);
100-element Vector{Float64}:
@@ -70,26 +66,26 @@
  -0.5319640155153034
  -0.9932887141154423
  -1.2766512199488596

Regularization Smoothing

Although smoothing by regularization can be used to interpolate sparse data as shown above, it is especially useful for dense and also scattered data (unequally spaced, unordered, and/or repeat-valued). Generalized cross validation (GCV) or so-called L-curve methods can be used to determine an "optimal" value for the smoothing parameter. In this example, we perform smoothing in two ways. In the first, we find smooth values at the original $t$ values and then interpolate. In the second, we perform the smoothing for the interpolatant $\hat{t}$ values directly. GCV is used to determine the regularization parameter for both cases.

d = 4
-A = RegularizationSmooth(u,t, d; alg=:gcv_svd)
+A = RegularizationSmooth(u, t, d; alg = :gcv_svd)
 û = A.û
 N = 200
-titp = collect(range(minimum(t), maximum(t), length=N))
+titp = collect(range(minimum(t), maximum(t), length = N))
 uitp = A.Aitp.(titp)
-Am = RegularizationSmooth(u,t, titp, d; alg=:gcv_svd)
+Am = RegularizationSmooth(u, t, titp, d; alg = :gcv_svd)
 ûm = Am.û
-scatter(t,u, label="simulated data", legend=:top)
-scatter!(t,û, marker=(:square, 4), label="smoothed data")
-plot!(titp,uitp, lw=lw, label="smoothed interpolation")
-plot!(titp,ûm, lw=lw, linestyle=:dash, label="smoothed, more points")
Example block output

Curve Fits

A curve fit works with both dense and sparse data. We will demonstrate the curve fit on the dense data since we generated it based on sin(t), so this is the curve we want to fit through it. Do do so, let's define a similar function with parameters. Let's choose the form:

m(t,p) = @. p[1]*sin(p[2]*t) + p[3]*cos(p[4]*t)
m (generic function with 1 method)

Notice that this is a function on the whole array of t and expects an array for the predicted u out. This choice of m is the assumption that our function is of the form p1*sin(p2*t)+p3*cos(p4*t). We want to find the p to match our data. Let's start with the guess of every p being zero, that is p=ones(4). Then we would fit this curve using:

using Optim
+scatter(t, u, label = "simulated data", legend = :top)
+scatter!(t, û, marker = (:square, 4), label = "smoothed data")
+plot!(titp, uitp, lw = lw, label = "smoothed interpolation")
+plot!(titp, ûm, lw = lw, linestyle = :dash, label = "smoothed, more points")
Example block output

Curve Fits

A curve fit works with both dense and sparse data. We will demonstrate the curve fit on the dense data since we generated it based on sin(t), so this is the curve we want to fit through it. Do do so, let's define a similar function with parameters. Let's choose the form:

m(t, p) = @. p[1] * sin(p[2] * t) + p[3] * cos(p[4] * t)
m (generic function with 1 method)

Notice that this is a function on the whole array of t and expects an array for the predicted u out. This choice of m is the assumption that our function is of the form p1*sin(p2*t)+p3*cos(p4*t). We want to find the p to match our data. Let's start with the guess of every p being zero, that is p=ones(4). Then we would fit this curve using:

using Optim
 A = Curvefit(u, t, m, ones(4), LBFGS())
-scatter(t, u, label="points", legend=:bottomright)
-plot!(A)
Example block output

We can check what the fitted parameters are via:

A.pmin
4-element Vector{Float64}:
+scatter(t, u, label = "points", legend = :bottomright)
+plot!(A)
Example block output

We can check what the fitted parameters are via:

A.pmin
4-element Vector{Float64}:
   1.002517318529601
   1.0396588440356678
  -0.13178842466234678
   1.0670107400182296

Notice that it essentially made p3=0 with p1=p2=1, meaning it approximately found sin(t)! But note that the ability to fit is dependent on the initial parameters. For example, with p=zeros(4) as the initial parameters the fit is not good:

A = Curvefit(u, t, m, zeros(4), LBFGS())
-scatter(t,u,label="points",legend=:bottomright)
-plot!(A)
Example block output

And the parameters show the issue:

A.pmin
4-element Vector{Float64}:
+scatter(t, u, label = "points", legend = :bottomright)
+plot!(A)
Example block output

And the parameters show the issue:

A.pmin
4-element Vector{Float64}:
  0.0
  0.0
  0.042632088464589324
diff --git a/dev/search_index.js b/dev/search_index.js
index 7f9b307b..2d0dad7c 100644
--- a/dev/search_index.js
+++ b/dev/search_index.js
@@ -1,3 +1,3 @@
 var documenterSearchIndex = {"docs":
-[{"location":"interface/#Interface-for-using-the-Interpolations-object","page":"Interface","title":"Interface for using the Interpolations object","text":"","category":"section"},{"location":"interface/","page":"Interface","title":"Interface","text":"We will again use the same data as the previous tutorial to demonstrate how to use the Interpolations object for computing interpolated values at any time point, its derivatives and integrals.","category":"page"},{"location":"interface/","page":"Interface","title":"Interface","text":"using DataInterpolations\n\n# Dependent variable\nu = [14.7, 11.51, 10.41, 14.95, 12.24, 11.22]\n\n# Independent variable\nt = [0.0, 62.25, 109.66, 162.66, 205.8, 252.3]","category":"page"},{"location":"interface/#Interpolated-values","page":"Interface","title":"Interpolated values","text":"","category":"section"},{"location":"interface/","page":"Interface","title":"Interface","text":"All Interpolation methods return an object from which we can compute the value of the dependent variable at any time point.","category":"page"},{"location":"interface/","page":"Interface","title":"Interface","text":"We will use CubicSpline method for demonstration but the API is same for all the methods.","category":"page"},{"location":"interface/","page":"Interface","title":"Interface","text":"A = CubicSpline(u, t)\n\n# For interpolation do, A(t)\nA(100.0) ","category":"page"},{"location":"interface/","page":"Interface","title":"Interface","text":"note: Note\nThe values computed beyond the range of the time points provided during interpolation will not be reliable as these methods only perform well within the range and the first/last piece polynomial fit is extrapolated on either sides which might not reflect the true nature of the data.","category":"page"},{"location":"interface/#Derivatives","page":"Interface","title":"Derivatives","text":"","category":"section"},{"location":"interface/","page":"Interface","title":"Interface","text":"Derivatives of the interpolated curves can also be computed at any point for all the methods. ","category":"page"},{"location":"interface/","page":"Interface","title":"Interface","text":"We will continue with the above example, but the API is same for all the methods.","category":"page"},{"location":"interface/","page":"Interface","title":"Interface","text":"# derivative(A, t)\nDataInterpolations.derivative(A, 1.0)","category":"page"},{"location":"interface/#Integrals","page":"Interface","title":"Integrals","text":"","category":"section"},{"location":"interface/","page":"Interface","title":"Interface","text":"Integrals of the interpolated curves can also be computed easily.","category":"page"},{"location":"interface/","page":"Interface","title":"Interface","text":"Currently, this is implemented only for a few methods - ConstantInterpolation, LinearInterpolation, QuadraticInterpolation, QuadraticSpline and CubicSpline.","category":"page"},{"location":"interface/","page":"Interface","title":"Interface","text":"To compute the integrals from the start of time points provided during interpolation to any point, we can do:","category":"page"},{"location":"interface/","page":"Interface","title":"Interface","text":"# integral(A, t)\nDataInterpolations.integral(A, 5.0)","category":"page"},{"location":"interface/","page":"Interface","title":"Interface","text":"If we want to compute integrals between two points, we can do:","category":"page"},{"location":"interface/","page":"Interface","title":"Interface","text":"# integral(A, t1, t2)\nDataInterpolations.integral(A, 1.0, 5.0)","category":"page"},{"location":"interface/","page":"Interface","title":"Interface","text":"note: Note\nIf the times provided in the integral goes beyond the range of the time points provided during interpolation, it uses extrapolation methods to compute the values and hence the integral can be misrepsentative and might not reflect the true nature of the data.","category":"page"},{"location":"methods/#Interpolation-using-different-methods","page":"Methods","title":"Interpolation using different methods","text":"","category":"section"},{"location":"methods/","page":"Methods","title":"Methods","text":"We will use the following data to demonstrate interpolation methods.","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"using DataInterpolations, Plots\ngr() # hide\n\n# Dependent variable\nu = [14.7, 11.51, 10.41, 14.95, 12.24, 11.22]\n\n# Independent variable\nt = [0.0, 62.25, 109.66, 162.66, 205.8, 252.3]","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"For each method, we will show how to perform the fit and use the plot recipe to show the fitting curve.","category":"page"},{"location":"methods/#Linear-Interpolation","page":"Methods","title":"Linear Interpolation","text":"","category":"section"},{"location":"methods/","page":"Methods","title":"Methods","text":"This is a linear interpolation between ends points of interval of input data point.","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"A = LinearInterpolation(u,t)\nscatter(t, u, label=\"input data\")\nplot!(A)","category":"page"},{"location":"methods/#Quadratic-Interpolation","page":"Methods","title":"Quadratic Interpolation","text":"","category":"section"},{"location":"methods/","page":"Methods","title":"Methods","text":"This function fits a parabola passing through the two nearest points from the input data point as well as the next-closest point in the right or the left, depending on whether the forward- or backward-looking mode is selected (default mode is forward-looking). It is continuous and piecewise differentiable.","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"A = QuadraticInterpolation(u,t) # same as QuadraticInterpolation(u,t,:Forward)\n# alternatively: A = QuadraticInterpolation(u,t,:Backward)\nscatter(t, u, label=\"input data\")\nplot!(A)","category":"page"},{"location":"methods/#Lagrange-Interpolation","page":"Methods","title":"Lagrange Interpolation","text":"","category":"section"},{"location":"methods/","page":"Methods","title":"Methods","text":"It fits polynomial of degree d (=length(t)-1), and is thuse a continuously differentiable function.","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"A = LagrangeInterpolation(u,t)\nscatter(t, u, label=\"input data\")\nplot!(A)","category":"page"},{"location":"methods/#Constant-Interpolation","page":"Methods","title":"Constant Interpolation","text":"","category":"section"},{"location":"methods/","page":"Methods","title":"Methods","text":"This function is constant between data points. By default it takes value at left end of the interval. One can change that behavior by passing the keyword argument dir = :right.","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"A = ConstantInterpolation(u,t)\nscatter(t, u, label=\"input data\")\nplot!(A)","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"Or using the right endpoints:","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"A = ConstantInterpolation(u, t, dir=:right)\nscatter(t, u, label=\"input data\")\nplot!(A)","category":"page"},{"location":"methods/#Quadratic-Spline","page":"Methods","title":"Quadratic Spline","text":"","category":"section"},{"location":"methods/","page":"Methods","title":"Methods","text":"This is the quadratic spline. It is a continuously differentiable interpolation which hits each of the data points exactly. Splines are a local interpolation method, meaning that the curve in a given spot is only affected by the points nearest to it.","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"A = QuadraticSpline(u,t)\nscatter(t, u, label=\"input data\")\nplot!(A)","category":"page"},{"location":"methods/#Cubic-Spline","page":"Methods","title":"Cubic Spline","text":"","category":"section"},{"location":"methods/","page":"Methods","title":"Methods","text":"This is the cubic spline. It is a continuously twice differentiable interpolation which hits each of the data points exactly.","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"A = CubicSpline(u,t)\nscatter(t, u, label=\"input data\")\nplot!(A)","category":"page"},{"location":"methods/#B-Splines","page":"Methods","title":"B-Splines","text":"","category":"section"},{"location":"methods/","page":"Methods","title":"Methods","text":"This is an interpolating B-spline. B-splines are a global method, meaning that every data point is taken into account for each point of the curve. The interpolating B-spline is the version which hits each of the points. This method is described in more detail here. Let's plot a cubic B-spline (3rd order). Since the data points are not close to uniformly spaced, we will use the :ArcLen and :Average choices:","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"A = BSplineInterpolation(u, t, 3, :ArcLen, :Average)\nscatter(t, u, label=\"input data\")\nplot!(A)","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"The approximating B-spline is a smoothed version of the B-spline. It again is a global method. In this case, we need to give a number of control points length(t)>h and this method fits a B-spline through the control points which is a least square approximation. This has a natural effect of smoothing the data. For example, if we use 4 control points, we get the result:","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"A = BSplineApprox(u, t, 3, 4, :ArcLen, :Average)\nscatter(t, u, label=\"input data\")\nplot!(A)","category":"page"},{"location":"methods/#Regularization-Smoothing","page":"Methods","title":"Regularization Smoothing","text":"","category":"section"},{"location":"methods/","page":"Methods","title":"Methods","text":"Smoothing by regularization (a.k.a. ridge regression) finds a function hatu that minimizes the objective function:","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"Q(hatu) = int_t_1^t_N hatu(t) - u(t)^2 mathrmdt + lambda int_hatt_1^hatt_N hatu^(d)(hatt)^2 mathrmd hatt","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"where (d) denotes derivative order and lambda is the regularization (smoothing) parameter. The integrals are evaluated numerically at the set of t values for the first term and hatt values for the second term (equal to t if not provided). Regularization smoothing is a global method and creates a smooth curve directly. See Stickel (2010) Comput. Chem. Eng. 34:467 for details. The implementation in this package uses cubic splines to interpolate between the smoothed points after they are determined.","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"using RegularizationTools\nd = 2\nλ = 1e3\nA = RegularizationSmooth(u,t, d; λ=λ, alg=:fixed)\nû = A.û\n# interpolate using the smoothed values\nN = 200\ntitp = collect(range(minimum(t), maximum(t), length=N))\nuitp = A.Aitp.(titp)\nlw = 1.5\nscatter(t,u, label=\"data\")\nscatter!(t,û, marker=:square, label=\"smoothed data\")\nplot!(titp,uitp, lw=lw, label=\"smoothed interpolation\")","category":"page"},{"location":"methods/#Dense-Data-Demonstration","page":"Methods","title":"Dense Data Demonstration","text":"","category":"section"},{"location":"methods/","page":"Methods","title":"Methods","text":"Some methods are better suited for dense data. Let's generate such data to demonstrate these methods.","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"import StableRNGs: StableRNG\nrng = StableRNG(318)\nt = sort(10 .* rand(rng, 100))\nu = sin.(t) .+ 0.5 * randn(rng, 100);","category":"page"},{"location":"methods/#Regularization-Smoothing-2","page":"Methods","title":"Regularization Smoothing","text":"","category":"section"},{"location":"methods/","page":"Methods","title":"Methods","text":"Although smoothing by regularization can be used to interpolate sparse data as shown above, it is especially useful for dense and also scattered data (unequally spaced, unordered, and/or repeat-valued). Generalized cross validation (GCV) or so-called L-curve methods can be used to determine an \"optimal\" value for the smoothing parameter. In this example, we perform smoothing in two ways. In the first, we find smooth values at the original t values and then interpolate. In the second, we perform the smoothing for the interpolatant hatt values directly. GCV is used to determine the regularization parameter for both cases.","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"d = 4\nA = RegularizationSmooth(u,t, d; alg=:gcv_svd)\nû = A.û\nN = 200\ntitp = collect(range(minimum(t), maximum(t), length=N))\nuitp = A.Aitp.(titp)\nAm = RegularizationSmooth(u,t, titp, d; alg=:gcv_svd)\nûm = Am.û\nscatter(t,u, label=\"simulated data\", legend=:top)\nscatter!(t,û, marker=(:square, 4), label=\"smoothed data\")\nplot!(titp,uitp, lw=lw, label=\"smoothed interpolation\")\nplot!(titp,ûm, lw=lw, linestyle=:dash, label=\"smoothed, more points\")","category":"page"},{"location":"methods/#Curve-Fits","page":"Methods","title":"Curve Fits","text":"","category":"section"},{"location":"methods/","page":"Methods","title":"Methods","text":"A curve fit works with both dense and sparse data. We will demonstrate the curve fit on the dense data since we generated it based on sin(t), so this is the curve we want to fit through it. Do do so, let's define a similar function with parameters. Let's choose the form:","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"m(t,p) = @. p[1]*sin(p[2]*t) + p[3]*cos(p[4]*t)","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"Notice that this is a function on the whole array of t and expects an array for the predicted u out. This choice of m is the assumption that our function is of the form p1*sin(p2*t)+p3*cos(p4*t). We want to find the p to match our data. Let's start with the guess of every p being zero, that is p=ones(4). Then we would fit this curve using:","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"using Optim\nA = Curvefit(u, t, m, ones(4), LBFGS())\nscatter(t, u, label=\"points\", legend=:bottomright)\nplot!(A)","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"We can check what the fitted parameters are via:","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"A.pmin","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"Notice that it essentially made p3=0 with p1=p2=1, meaning it approximately found sin(t)! But note that the ability to fit is dependent on the initial parameters. For example, with p=zeros(4) as the initial parameters the fit is not good:","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"A = Curvefit(u, t, m, zeros(4), LBFGS())\nscatter(t,u,label=\"points\",legend=:bottomright)\nplot!(A)","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"And the parameters show the issue:","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"A.pmin","category":"page"},{"location":"#DataInterpolations.jl","page":"DataInterpolations.jl","title":"DataInterpolations.jl","text":"","category":"section"},{"location":"","page":"DataInterpolations.jl","title":"DataInterpolations.jl","text":"DataInterpolations.jl is a library for performing interpolations of one-dimensional data. By \"data interpolations\" we mean techniques for interpolating possibly noisy data, and thus some methods are mixtures of regressions with interpolations (i.e. do not hit the data points exactly, smoothing out the lines). This library can be used to fill in intermediate data points in applications like timeseries data.","category":"page"},{"location":"#Available-Interpolations","page":"DataInterpolations.jl","title":"Available Interpolations","text":"","category":"section"},{"location":"","page":"DataInterpolations.jl","title":"DataInterpolations.jl","text":"In all cases, u an AbstractVector of values and t is an AbstractVector of timepoints corresponding to (u,t) pairs.","category":"page"},{"location":"","page":"DataInterpolations.jl","title":"DataInterpolations.jl","text":"ConstantInterpolation(u,t) - A piecewise constant interpolation.\nLinearInterpolation(u,t) - A linear interpolation.\nQuadraticInterpolation(u,t) - A quadratic interpolation.\nLagrangeInterpolation(u,t,n) - A Lagrange interpolation of order n.\nQuadraticSpline(u,t) - A quadratic spline interpolation.\nCubicSpline(u,t) - A cubic spline interpolation.\nAkimaInterpolation(u, t) - Akima spline interpolation provides a smoothing effect and is computationally efficient.\nBSplineInterpolation(u,t,d,pVec,knotVec) - An interpolation B-spline. This is a B-spline which hits each of the data points. The argument choices are: \t- d - degree of B-spline   \t- pVec - Symbol to Parameters Vector, pVec = :Uniform for uniform spaced parameters and pVec = :ArcLen for parameters generated by chord length method.   \t- knotVec - Symbol to Knot Vector, knotVec = :Uniform for uniform knot vector, knotVec = :Average for average spaced knot vector.\nBSplineApprox(u,t,d,h,pVec,knotVec) - A regression B-spline which smooths the fitting curve. The argument choices are the same as the BSplineInterpolation, with the additional parameter hh and this method fits a B-spline through the control points which is a least square approximation. This has a natural effect of smoothing the data. For example, if we use 4 control points, we get the result:","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"A = BSplineApprox(u, t, 3, 4, :ArcLen, :Average)\nscatter(t, u, label = \"input data\")\nplot!(A)","category":"page"},{"location":"methods/#Regularization-Smoothing","page":"Methods","title":"Regularization Smoothing","text":"","category":"section"},{"location":"methods/","page":"Methods","title":"Methods","text":"Smoothing by regularization (a.k.a. ridge regression) finds a function hatu that minimizes the objective function:","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"Q(hatu) = int_t_1^t_N hatu(t) - u(t)^2 mathrmdt + lambda int_hatt_1^hatt_N hatu^(d)(hatt)^2 mathrmd hatt","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"where (d) denotes derivative order and lambda is the regularization (smoothing) parameter. The integrals are evaluated numerically at the set of t values for the first term and hatt values for the second term (equal to t if not provided). Regularization smoothing is a global method and creates a smooth curve directly. See Stickel (2010) Comput. Chem. Eng. 34:467 for details. The implementation in this package uses cubic splines to interpolate between the smoothed points after they are determined.","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"using RegularizationTools\nd = 2\nλ = 1e3\nA = RegularizationSmooth(u, t, d; λ = λ, alg = :fixed)\nû = A.û\n# interpolate using the smoothed values\nN = 200\ntitp = collect(range(minimum(t), maximum(t), length = N))\nuitp = A.Aitp.(titp)\nlw = 1.5\nscatter(t, u, label = \"data\")\nscatter!(t, û, marker = :square, label = \"smoothed data\")\nplot!(titp, uitp, lw = lw, label = \"smoothed interpolation\")","category":"page"},{"location":"methods/#Dense-Data-Demonstration","page":"Methods","title":"Dense Data Demonstration","text":"","category":"section"},{"location":"methods/","page":"Methods","title":"Methods","text":"Some methods are better suited for dense data. Let's generate such data to demonstrate these methods.","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"import StableRNGs: StableRNG\nrng = StableRNG(318)\nt = sort(10 .* rand(rng, 100))\nu = sin.(t) .+ 0.5 * randn(rng, 100);","category":"page"},{"location":"methods/#Regularization-Smoothing-2","page":"Methods","title":"Regularization Smoothing","text":"","category":"section"},{"location":"methods/","page":"Methods","title":"Methods","text":"Although smoothing by regularization can be used to interpolate sparse data as shown above, it is especially useful for dense and also scattered data (unequally spaced, unordered, and/or repeat-valued). Generalized cross validation (GCV) or so-called L-curve methods can be used to determine an \"optimal\" value for the smoothing parameter. In this example, we perform smoothing in two ways. In the first, we find smooth values at the original t values and then interpolate. In the second, we perform the smoothing for the interpolatant hatt values directly. GCV is used to determine the regularization parameter for both cases.","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"d = 4\nA = RegularizationSmooth(u, t, d; alg = :gcv_svd)\nû = A.û\nN = 200\ntitp = collect(range(minimum(t), maximum(t), length = N))\nuitp = A.Aitp.(titp)\nAm = RegularizationSmooth(u, t, titp, d; alg = :gcv_svd)\nûm = Am.û\nscatter(t, u, label = \"simulated data\", legend = :top)\nscatter!(t, û, marker = (:square, 4), label = \"smoothed data\")\nplot!(titp, uitp, lw = lw, label = \"smoothed interpolation\")\nplot!(titp, ûm, lw = lw, linestyle = :dash, label = \"smoothed, more points\")","category":"page"},{"location":"methods/#Curve-Fits","page":"Methods","title":"Curve Fits","text":"","category":"section"},{"location":"methods/","page":"Methods","title":"Methods","text":"A curve fit works with both dense and sparse data. We will demonstrate the curve fit on the dense data since we generated it based on sin(t), so this is the curve we want to fit through it. Do do so, let's define a similar function with parameters. Let's choose the form:","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"m(t, p) = @. p[1] * sin(p[2] * t) + p[3] * cos(p[4] * t)","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"Notice that this is a function on the whole array of t and expects an array for the predicted u out. This choice of m is the assumption that our function is of the form p1*sin(p2*t)+p3*cos(p4*t). We want to find the p to match our data. Let's start with the guess of every p being zero, that is p=ones(4). Then we would fit this curve using:","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"using Optim\nA = Curvefit(u, t, m, ones(4), LBFGS())\nscatter(t, u, label = \"points\", legend = :bottomright)\nplot!(A)","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"We can check what the fitted parameters are via:","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"A.pmin","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"Notice that it essentially made p3=0 with p1=p2=1, meaning it approximately found sin(t)! But note that the ability to fit is dependent on the initial parameters. For example, with p=zeros(4) as the initial parameters the fit is not good:","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"A = Curvefit(u, t, m, zeros(4), LBFGS())\nscatter(t, u, label = \"points\", legend = :bottomright)\nplot!(A)","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"And the parameters show the issue:","category":"page"},{"location":"methods/","page":"Methods","title":"Methods","text":"A.pmin","category":"page"},{"location":"#DataInterpolations.jl","page":"DataInterpolations.jl","title":"DataInterpolations.jl","text":"","category":"section"},{"location":"","page":"DataInterpolations.jl","title":"DataInterpolations.jl","text":"DataInterpolations.jl is a library for performing interpolations of one-dimensional data. By \"data interpolations\" we mean techniques for interpolating possibly noisy data, and thus some methods are mixtures of regressions with interpolations (i.e. do not hit the data points exactly, smoothing out the lines). This library can be used to fill in intermediate data points in applications like timeseries data.","category":"page"},{"location":"#Installation","page":"DataInterpolations.jl","title":"Installation","text":"","category":"section"},{"location":"","page":"DataInterpolations.jl","title":"DataInterpolations.jl","text":"To install DataInterpolations.jl, use the Julia package manager:","category":"page"},{"location":"","page":"DataInterpolations.jl","title":"DataInterpolations.jl","text":"using Pkg\nPkg.add(\"DataInterpolations\")","category":"page"},{"location":"#Available-Interpolations","page":"DataInterpolations.jl","title":"Available Interpolations","text":"","category":"section"},{"location":"","page":"DataInterpolations.jl","title":"DataInterpolations.jl","text":"In all cases, u an AbstractVector of values and t is an AbstractVector of timepoints corresponding to (u,t) pairs.","category":"page"},{"location":"","page":"DataInterpolations.jl","title":"DataInterpolations.jl","text":"ConstantInterpolation(u,t) - A piecewise constant interpolation.\nLinearInterpolation(u,t) - A linear interpolation.\nQuadraticInterpolation(u,t) - A quadratic interpolation.\nLagrangeInterpolation(u,t,n) - A Lagrange interpolation of order n.\nQuadraticSpline(u,t) - A quadratic spline interpolation.\nCubicSpline(u,t) - A cubic spline interpolation.\nAkimaInterpolation(u, t) - Akima spline interpolation provides a smoothing effect and is computationally efficient.\nBSplineInterpolation(u,t,d,pVec,knotVec) - An interpolation B-spline. This is a B-spline which hits each of the data points. The argument choices are:\nd - degree of B-spline\npVec - Symbol to Parameters Vector, pVec = :Uniform for uniform spaced parameters and pVec = :ArcLen for parameters generated by chord length method.\nknotVec - Symbol to Knot Vector, knotVec = :Uniform for uniform knot vector, knotVec = :Average for average spaced knot vector.\nBSplineApprox(u,t,d,h,pVec,knotVec) - A regression B-spline which smooths the fitting curve. The argument choices are the same as the BSplineInterpolation, with the additional parameter hThe documentation of this SciML package was built using these direct dependencies,","category":"page"},{"location":"","page":"DataInterpolations.jl","title":"DataInterpolations.jl","text":"using Pkg # hide\nPkg.status() # hide","category":"page"},{"location":"","page":"DataInterpolations.jl","title":"DataInterpolations.jl","text":"","category":"page"},{"location":"","page":"DataInterpolations.jl","title":"DataInterpolations.jl","text":"
and using this machine and Julia version.","category":"page"},{"location":"","page":"DataInterpolations.jl","title":"DataInterpolations.jl","text":"using InteractiveUtils # hide\nversioninfo() # hide","category":"page"},{"location":"","page":"DataInterpolations.jl","title":"DataInterpolations.jl","text":"
","category":"page"},{"location":"","page":"DataInterpolations.jl","title":"DataInterpolations.jl","text":"
A more complete overview of all dependencies and their versions is also provided.","category":"page"},{"location":"","page":"DataInterpolations.jl","title":"DataInterpolations.jl","text":"using Pkg # hide\nPkg.status(; mode = PKGMODE_MANIFEST) # hide","category":"page"},{"location":"","page":"DataInterpolations.jl","title":"DataInterpolations.jl","text":"
","category":"page"},{"location":"","page":"DataInterpolations.jl","title":"DataInterpolations.jl","text":"using TOML\nusing Markdown\nversion = TOML.parse(read(\"../../Project.toml\", String))[\"version\"]\nname = TOML.parse(read(\"../../Project.toml\", String))[\"name\"]\nlink_manifest = \"https://github.com/SciML/\" * name * \".jl/tree/gh-pages/v\" * version *\n \"/assets/Manifest.toml\"\nlink_project = \"https://github.com/SciML/\" * name * \".jl/tree/gh-pages/v\" * version *\n \"/assets/Project.toml\"\nMarkdown.parse(\"\"\"You can also download the\n[manifest]($link_manifest)\nfile and the\n[project]($link_project)\nfile.\n\"\"\")","category":"page"}] }