{"id":1923,"date":"2026-10-18T13:26:16","date_gmt":"2026-10-18T17:26:16","guid":{"rendered":"https:\/\/web.uri.edu\/nld\/ncvd-toolbox\/"},"modified":"2026-10-21T20:00:31","modified_gmt":"2026-10-22T00:00:31","slug":"ncvd-toolbox","status":"publish","type":"page","link":"https:\/\/web.uri.edu\/nld\/ncvd-toolbox\/","title":{"rendered":"NCVD toolbox"},"content":{"rendered":"\n<div class=\"nld-page-band\" style=\"background:#132433;padding:28px 32px;display:flex;align-items:center;justify-content:space-between;gap:24px;margin:0 0 32px\">\n<div><p style=\"margin:0 0 10px;font-size:13px;line-height:16px;letter-spacing:0.12em;text-transform:uppercase;font-weight:600;color:#A9B6BF\"><span style=\"display:inline-block;width:24px;height:4px;background:#D98A52;vertical-align:middle;margin-right:10px\"><\/span>Nonlinear Dynamics Laboratory<\/p>\n<h1 style=\"color:#F7F6F2;font-size:36px;line-height:42px;margin:0\">NCVD toolbox<\/h1><\/div>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/web.uri.edu\/nld\/wp-content\/uploads\/sites\/1815\/nld-hero-on-navy.jpg\" alt=\"\" width=\"96\" height=\"96\" style=\"width:96px;height:auto;flex:none\">\n<\/div>\n\n\n\n<figure style=\"margin:24px 0\"><img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/nld-uri\/ncvd-toolbox\/main\/docs\/web\/backbone_tracking.gif\" alt=\"Animation: sliding-window NCVD along a Duffing free decay traces frequency-energy dependence\" style=\"width:100%;height:auto;border:1px solid #DCD9D2\"><figcaption style=\"font-size:14px;color:#5B6168;margin-top:8px\">One free decay of a three-mass chain with a cubic spring. Each shaded window is decomposed; the three resonances trace their frequency-energy dependence back to the linear frequencies.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Nonlinear Characteristic Value Decomposition: modal identification from a measured or simulated state record, with exact identities, pole correction for numerical derivatives, noise-robust operators, measured forcing, ensembles of records, and amplitude-dependent identification of nonlinear structures. MATLAB and Python, MIT license.<\/p>\n\n\n\n<p style=\"margin:8px 0 24px\"><a href=\"https:\/\/github.com\/nld-uri\/ncvd-toolbox\" style=\"display:inline-block;background:#9A5323;color:#FFFFFF;padding:10px 16px;border-radius:2px;text-decoration:none;font-weight:600;margin:0 8px 8px 0\">Code on GitHub<\/a><a href=\"https:\/\/github.com\/nld-uri\/ncvd-toolbox\/blob\/main\/docs\/manual\/NCVD_manual.pdf\" style=\"display:inline-block;border:1px solid #8A8578;color:#132433;padding:9px 16px;border-radius:2px;text-decoration:none;margin:0 8px 8px 0\">User manual (PDF)<\/a><a href=\"https:\/\/claude.ai\/artifact\/5XebWDvuxhZizJR5Ls6mmn\" style=\"display:inline-block;border:1px solid #8A8578;color:#132433;padding:9px 16px;border-radius:2px;text-decoration:none;margin:0 8px 8px 0\">Live slides<\/a><a href=\"https:\/\/github.com\/nld-uri\/ncvd-toolbox\/blob\/main\/docs\/slides\/NCVD_toolbox_slides.pdf\" style=\"display:inline-block;border:1px solid #8A8578;color:#132433;padding:9px 16px;border-radius:2px;text-decoration:none;margin:0 8px 8px 0\">Slides (PDF)<\/a><a href=\"https:\/\/github.com\/nld-uri\/ncvd-toolbox\/raw\/main\/docs\/slides\/NCVD_toolbox.pptx\" style=\"display:inline-block;border:1px solid #8A8578;color:#132433;padding:9px 16px;border-radius:2px;text-decoration:none;margin:0 8px 8px 0\">Slides (PowerPoint)<\/a><a href=\"https:\/\/doi.org\/10.5281\/zenodo.23549069\" style=\"display:inline-block;border:1px solid #8A8578;color:#132433;padding:9px 16px;border-radius:2px;text-decoration:none;margin:0 8px 8px 0\">doi:10.5281\/zenodo.23549069<\/a><\/p>\n\n\n\n<p style=\"margin:40px 0 8px;font-size:13px;line-height:16px;letter-spacing:0.12em;text-transform:uppercase;font-weight:600;color:#5B6168\"><span style=\"display:inline-block;width:24px;height:4px;background:#B4622A;vertical-align:middle;margin-right:10px\"><\/span>The decomposition<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">One state record, two identities, both exact<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">With displacement, velocity and acceleration at <math style=\"font-family:&apos;Latin Modern Math&apos;,&apos;STIX Two Math&apos;,&apos;Cambria Math&apos;,math;font-size:1.05em\"><semantics><mrow><mi>n<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">n<\/annotation><\/semantics><\/math> stations, the toolbox writes the state record and its rate as<\/p>\n\n\n\n<math display=\"block\" style=\"display:block math;font-family:&apos;Latin Modern Math&apos;,&apos;STIX Two Math&apos;,&apos;Cambria Math&apos;,math;font-size:1.15em;margin:16px 0\"><semantics><mrow><msub><mi>&#x1D417;<\/mi><mn>1<\/mn><\/msub><mo>&#x3D;<\/mo><mo stretchy=\"false\">[<\/mo><mi>&#x1D42A;<\/mi><mo>&#x2C;<\/mo><mtext>&#xA0;<\/mtext><mover><mrow><mi>&#x1D42A;<\/mi><\/mrow><mo>&#x2D9;<\/mo><\/mover><mo stretchy=\"false\">]<\/mo><mo>&#x3D;<\/mo><mi>&#x1D414;<\/mi><msup><mrow><mi>\ud835\udebd<\/mi><\/mrow><mrow><mi>&#x1D5A7;<\/mi><\/mrow><\/msup><mo>&#x2C;<\/mo><mspace width=\"2em\" \/><msub><mi>&#x1D417;<\/mi><mn>2<\/mn><\/msub><mo>&#x3D;<\/mo><mo stretchy=\"false\">[<\/mo><mover><mrow><mi>&#x1D42A;<\/mi><\/mrow><mo>&#x2D9;<\/mo><\/mover><mo>&#x2C;<\/mo><mtext>&#xA0;<\/mtext><mover><mrow><mi>&#x1D42A;<\/mi><\/mrow><mo>&#xA8;<\/mo><\/mover><mo stretchy=\"false\">]<\/mo><mo>&#x3D;<\/mo><mi>&#x1D414;<\/mi><mrow><mi>\ud835\udeb2<\/mi><\/mrow><msup><mrow><mi>\ud835\udebd<\/mi><\/mrow><mrow><mi>&#x1D5A7;<\/mi><\/mrow><\/msup><mo>&#x2B;<\/mo><mi>&#x1D411;<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">\\mathbf{X}_1=[\\mathbf{q},\\ \\dot{\\mathbf{q}}]=\\mathbf{U}\\boldsymbol{\\Phi}^{\\mathsf{H}},\\qquad \\mathbf{X}_2=[\\dot{\\mathbf{q}},\\ \\ddot{\\mathbf{q}}]=\\mathbf{U}\\boldsymbol{\\Lambda}\\boldsymbol{\\Phi}^{\\mathsf{H}}+\\mathbf{R}<\/annotation><\/semantics><\/math>\n\n\n\n<p class=\"wp-block-paragraph\">where <math style=\"font-family:&apos;Latin Modern Math&apos;,&apos;STIX Two Math&apos;,&apos;Cambria Math&apos;,math;font-size:1.05em\"><semantics><mrow><mi>\ud835\udc14<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">\\mathbf{U}<\/annotation><\/semantics><\/math> is the temporal basis, <math style=\"font-family:&apos;Latin Modern Math&apos;,&apos;STIX Two Math&apos;,&apos;Cambria Math&apos;,math;font-size:1.05em\"><semantics><mrow><mrow><mi>\ud835\udebd<\/mi><\/mrow><\/mrow><annotation encoding=\"application\/x-tex\">\\boldsymbol{\\Phi}<\/annotation><\/semantics><\/math> the characteristic shapes, <math style=\"font-family:&apos;Latin Modern Math&apos;,&apos;STIX Two Math&apos;,&apos;Cambria Math&apos;,math;font-size:1.05em\"><semantics><mrow><mrow><mi>\ud835\udeb2<\/mi><\/mrow><mo>=<\/mo><mo>diag<\/mo><mo stretchy=\"false\">(<\/mo><msub><mi>\u03bb<\/mi><mi>i<\/mi><\/msub><mo stretchy=\"false\">)<\/mo><\/mrow><annotation encoding=\"application\/x-tex\">\\boldsymbol{\\Lambda}=\\operatorname{diag}(\\lambda_i)<\/annotation><\/semantics><\/math> the characteristic values (poles) and <math style=\"font-family:&apos;Latin Modern Math&apos;,&apos;STIX Two Math&apos;,&apos;Cambria Math&apos;,math;font-size:1.05em\"><semantics><mrow><mi>\ud835\udc11<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">\\mathbf{R}<\/annotation><\/semantics><\/math> whatever no linear model of the record explains: noise, unmeasured forcing, nonlinearity. The first identity is always exact; the second is exact for a clean linear record, and each pole is paired with its shape by construction.<\/p>\n\n\n\n<figure style=\"margin:24px 0\"><img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/nld-uri\/ncvd-toolbox\/main\/docs\/web\/complex_mode.gif\" alt=\"Animation: a complex mode as a rotating, shrinking polygon of phasors\" style=\"width:100%;height:auto;border:1px solid #DCD9D2\"><figcaption style=\"font-size:14px;color:#5B6168;margin-top:8px\">With non-proportional damping a mode is complex: the station phasors form a polygon that rotates and shrinks, and the motion is its real part, so the nodes travel.<\/figcaption><\/figure>\n\n\n\n<p style=\"margin:40px 0 8px;font-size:13px;line-height:16px;letter-spacing:0.12em;text-transform:uppercase;font-weight:600;color:#5B6168\"><span style=\"display:inline-block;width:24px;height:4px;background:#B4622A;vertical-align:middle;margin-right:10px\"><\/span>The readout<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Rotating by the eigenvectors of the coupling matrix makes the decomposition exact<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The decomposition builds on the characteristic value decomposition (CVD\/GCVD) of Li, Stein and Chelidze (2025). It forms the same balanced quotient of second moments and its eigenvectors <math style=\"font-family:&apos;Latin Modern Math&apos;,&apos;STIX Two Math&apos;,&apos;Cambria Math&apos;,math;font-size:1.05em\"><semantics><mrow><mi>\ud835\udc15<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">\\mathbf{V}<\/annotation><\/semantics><\/math>, then diagonalises the coupling matrix and rotates:<\/p>\n\n\n\n<math display=\"block\" style=\"display:block math;font-family:&apos;Latin Modern Math&apos;,&apos;STIX Two Math&apos;,&apos;Cambria Math&apos;,math;font-size:1.15em;margin:16px 0\"><semantics><mrow><msub><mrow><mi>\ud835\udeba<\/mi><\/mrow><mn>2<\/mn><\/msub><mo>&#x3D;<\/mo><msup><mi>&#x1D415;<\/mi><mrow><mi>&#x1D5A7;<\/mi><\/mrow><\/msup><mi>&#x1D401;<\/mi><mspace width=\"0.167em\" \/><msup><mi>&#x1D415;<\/mi><mrow><mo>&#x2212;<\/mo><mi>&#x1D5A7;<\/mi><\/mrow><\/msup><mo>&#x3D;<\/mo><mi>&#x1D413;<\/mi><mrow><mi>\ud835\udeb2<\/mi><\/mrow><msup><mi>&#x1D413;<\/mi><mrow><mo>&#x2212;<\/mo><mn>1<\/mn><\/mrow><\/msup><mo>&#x2C;<\/mo><mspace width=\"2em\" \/><mi>&#x1D414;<\/mi><mo>&#x3D;<\/mo><mrow><mi>\ud835\udeb5<\/mi><\/mrow><mspace width=\"0.167em\" \/><mi>&#x1D413;<\/mi><mo>&#x2C;<\/mo><mspace width=\"2em\" \/><mrow><mi>\ud835\udebd<\/mi><\/mrow><mo>&#x3D;<\/mo><mi>&#x1D415;<\/mi><mspace width=\"0.167em\" \/><msup><mi>&#x1D413;<\/mi><mrow><mo>&#x2212;<\/mo><mi>&#x1D5A7;<\/mi><\/mrow><\/msup><\/mrow><annotation encoding=\"application\/x-tex\">\\boldsymbol{\\Sigma}_2=\\mathbf{V}^{\\mathsf{H}}\\mathbf{B}\\,\\mathbf{V}^{-\\mathsf{H}}=\\mathbf{T}\\boldsymbol{\\Lambda}\\mathbf{T}^{-1},\\qquad \\mathbf{U}=\\boldsymbol{\\Xi}\\,\\mathbf{T},\\qquad \\boldsymbol{\\Phi}=\\mathbf{V}\\,\\mathbf{T}^{-\\mathsf{H}}<\/annotation><\/semantics><\/math>\n\n\n\n<p class=\"wp-block-paragraph\">The values are then the eigenvalues of the least-squares state-rate operator <math style=\"font-family:&apos;Latin Modern Math&apos;,&apos;STIX Two Math&apos;,&apos;Cambria Math&apos;,math;font-size:1.05em\"><semantics><mrow><mi>\ud835\udc01<\/mi><mo>=<\/mo><msubsup><mi>\ud835\udc17<\/mi><mn>1<\/mn><mrow><mi>\u2020<\/mi><\/mrow><\/msubsup><msub><mi>\ud835\udc17<\/mi><mn>2<\/mn><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">\\mathbf{B}=\\mathbf{X}_1^{\\dagger}\\mathbf{X}_2<\/annotation><\/semantics><\/math>. Reading them from the diagonal of <math style=\"font-family:&apos;Latin Modern Math&apos;,&apos;STIX Two Math&apos;,&apos;Cambria Math&apos;,math;font-size:1.05em\"><semantics><mrow><msub><mrow><mi>\ud835\udeba<\/mi><\/mrow><mn>2<\/mn><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">\\boldsymbol{\\Sigma}_2<\/annotation><\/semantics><\/math> instead is exact only when <math style=\"font-family:&apos;Latin Modern Math&apos;,&apos;STIX Two Math&apos;,&apos;Cambria Math&apos;,math;font-size:1.05em\"><semantics><mrow><mi>\ud835\udc15<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">\\mathbf{V}<\/annotation><\/semantics><\/math> already diagonalises it. The balanced quotient applies the Joukowski map <math style=\"font-family:&apos;Latin Modern Math&apos;,&apos;STIX Two Math&apos;,&apos;Cambria Math&apos;,math;font-size:1.05em\"><semantics><mrow><mi>\u03bb<\/mi><mo>\u21a6<\/mo><mstyle displaystyle=\"false\" scriptlevel=\"0\"><mfrac><mn>1<\/mn><mn>2<\/mn><\/mfrac><\/mstyle><mo stretchy=\"false\">(<\/mo><mi>\u03bb<\/mi><mo>+<\/mo><msup><mi>\u03bb<\/mi><mrow><mo>\u2212<\/mo><mn>1<\/mn><\/mrow><\/msup><mo stretchy=\"false\">)<\/mo><\/mrow><annotation encoding=\"application\/x-tex\">\\lambda\\mapsto\\tfrac12(\\lambda+\\lambda^{-1})<\/annotation><\/semantics><\/math>, which folds the pole plane at the unit circle; averaged ensemble quotients and nonlinear windows also break diagonality. There the diagonal readout errs at second order in the poles and first order in the shapes.<\/p>\n\n\n\n<figure style=\"margin:24px 0\"><img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/nld-uri\/ncvd-toolbox\/main\/docs\/web\/joukowski_fold.gif\" alt=\"Animation: the Joukowski fold of the balanced quotient as the time unit changes\" style=\"width:100%;height:auto;border:1px solid #DCD9D2\"><figcaption style=\"font-size:14px;color:#5B6168;margin-top:8px\">Rescaling time moves the poles across the unit circle; where a pole meets its conjugate under the balanced map, the off-diagonal part of the coupling matrix spikes.<\/figcaption><\/figure>\n\n\n\n<figure style=\"margin:24px 0\"><img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/nld-uri\/ncvd-toolbox\/main\/docs\/web\/ex07_readout_error.jpg\" alt=\"Published against canonical readout errors\" style=\"width:100%;height:auto;border:1px solid #DCD9D2\"><figcaption style=\"font-size:14px;color:#5B6168;margin-top:8px\">Left: an exact tie at a unit natural frequency. Right: windows of a nonlinear decay; pole differences scale with the square of the off-diagonal ratio, shape differences with its first power.<\/figcaption><\/figure>\n\n\n\n<p style=\"margin:40px 0 8px;font-size:13px;line-height:16px;letter-spacing:0.12em;text-transform:uppercase;font-weight:600;color:#5B6168\"><span style=\"display:inline-block;width:24px;height:4px;background:#B4622A;vertical-align:middle;margin-right:10px\"><\/span>Practical data<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Derivatives, sensor noise, forcing and many records<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Your data<\/th><th>Use<\/th><\/tr><\/thead><tbody><tr><td>Displacement, velocity and acceleration<\/td><td><code>ncvd(d, v, a)<\/code><\/td><\/tr><tr><td>Displacement only<\/td><td><code>state_from_displacement, then correct_poles<\/code><\/td><\/tr><tr><td>White sensor noise, sampling well above the highest mode<\/td><td><code>operator='bcls', noise_var='auto'<\/code><\/td><\/tr><tr><td>Measured excitation<\/td><td><code>forcing=F<\/code><\/td><\/tr><tr><td>Several records at any sampling rates<\/td><td><code>ncvd_ensemble(records)<\/code><\/td><\/tr><tr><td>Spectrum spanning decades<\/td><td><code>rank=r<\/code><\/td><\/tr><tr><td>Nonlinear free decay<\/td><td><code>track(d, v, a, ...)<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Rates computed from displacement by any FIR stencil return the stencil symbol of the pole, not the pole itself:<\/p>\n\n\n\n<math display=\"block\" style=\"display:block math;font-family:&apos;Latin Modern Math&apos;,&apos;STIX Two Math&apos;,&apos;Cambria Math&apos;,math;font-size:1.15em;margin:16px 0\"><semantics><mrow><mover><mi>&#x3BB;<\/mi><mo stretchy=\"false\">&#x7E;<\/mo><\/mover><mo>&#x3D;<\/mo><mi>d<\/mi><mspace width=\"negativethinmathspace\" \/><mrow><mo stretchy=\"true\" fence=\"true\" form=\"prefix\">&#x28;<\/mo><msup><mi>e<\/mi><mrow><mi>&#x3BB;<\/mi><mi>&#x394;<\/mi><mi>t<\/mi><\/mrow><\/msup><mo stretchy=\"true\" fence=\"true\" form=\"postfix\">&#x29;<\/mo><\/mrow><mo>&#x2C;<\/mo><mspace width=\"2em\" \/><mi>d<\/mi><mo stretchy=\"false\">&#x28;<\/mo><mi>&#x3B8;<\/mi><mo stretchy=\"false\">&#x29;<\/mo><mo>&#x3D;<\/mo><msub><mi>f<\/mi><mi>s<\/mi><\/msub><munder><mo>&#x2211;<\/mo><mi>j<\/mi><\/munder><msub><mi>c<\/mi><mi>j<\/mi><\/msub><mspace width=\"0.167em\" \/><msup><mi>&#x3B8;<\/mi><mrow><mi>j<\/mi><\/mrow><\/msup><mo>&#x2C;<\/mo><mspace width=\"2em\" \/><mi>&#x3BB;<\/mi><mo>&#x3D;<\/mo><msub><mi>f<\/mi><mi>s<\/mi><\/msub><mi>log<\/mi><mi>&#x3B8;<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">\\tilde\\lambda=d\\!\\left(e^{\\lambda\\Delta t}\\right),\\qquad d(\\theta)=f_s\\sum_j c_j\\,\\theta^{j},\\qquad \\lambda=f_s\\log\\theta<\/annotation><\/semantics><\/math>\n\n\n\n<p class=\"wp-block-paragraph\">Inverting the symbol recovers the pole to machine precision for forward, central, five-point and Savitzky\u2013Golay stencils, inside each stencil&#8217;s band.<\/p>\n\n\n\n<figure style=\"margin:24px 0\"><img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/nld-uri\/ncvd-toolbox\/main\/docs\/web\/ex02_fd_correction.jpg\" alt=\"Pole errors from FIR derivatives before and after correction\" style=\"width:100%;height:auto;border:1px solid #DCD9D2\"><figcaption style=\"font-size:14px;color:#5B6168;margin-top:8px\">Three-mass chain with modes at 4.2, 71 and 158 rad\/s. Solid: poles from FIR rates. Dotted: after correction.<\/figcaption><\/figure>\n\n\n\n<figure style=\"margin:24px 0\"><img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/nld-uri\/ncvd-toolbox\/main\/docs\/web\/ex03_noise_operators.jpg\" alt=\"Frequency and damping errors under sensor noise for three operators\" style=\"width:100%;height:auto;border:1px solid #DCD9D2\"><figcaption style=\"font-size:14px;color:#5B6168;margin-top:8px\">Ten-mass chain under unmeasured random forcing with noise on every channel. Bias-compensated least squares keeps the frequency error below 2 % down to 15 dB, where least squares reaches 10 %.<\/figcaption><\/figure>\n\n\n\n<p style=\"margin:40px 0 8px;font-size:13px;line-height:16px;letter-spacing:0.12em;text-transform:uppercase;font-weight:600;color:#5B6168\"><span style=\"display:inline-block;width:24px;height:4px;background:#B4622A;vertical-align:middle;margin-right:10px\"><\/span>Nonlinear systems<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sliding windows trace frequency-energy dependence from one free decay<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Each short window of a decay is decomposed; its values are the best linear description of the local dynamics. Following each resonance through the windows gives the data-driven counterpart of a nonlinear normal mode backbone curve, and the window residual shows how strongly each window engages the nonlinearity.<\/p>\n\n\n\n<figure style=\"margin:24px 0\"><img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/nld-uri\/ncvd-toolbox\/main\/docs\/web\/ex05_duffing_backbone.jpg\" alt=\"Frequency against modal energy for three tracked resonances\" style=\"width:100%;height:auto;border:1px solid #DCD9D2\"><figcaption style=\"font-size:14px;color:#5B6168;margin-top:8px\">Damped frequency against modal energy, normalised by the linear value; crosses are the measured response frequency of mode 1 in each window.<\/figcaption><\/figure>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Excite every resonance you track<\/strong>; check the singular values of each window.<\/li>\n\n\n\n<li><strong>Span at least one period<\/strong> of the slowest mode per window; a dozen is comfortable.<\/li>\n\n\n\n<li><strong>Watch weak modes<\/strong>: a superharmonic of a strong mode can take a weak mode&#8217;s pole slot.<\/li>\n\n\n\n<li><strong>Validate every pole<\/strong> against the measured response frequency (<code>band_frequency<\/code>).<\/li>\n\n\n\n<li><strong>Trust frequencies and shapes<\/strong>; damping from single nonlinear windows scatters.<\/li>\n<\/ol>\n\n\n\n<p style=\"margin:40px 0 8px;font-size:13px;line-height:16px;letter-spacing:0.12em;text-transform:uppercase;font-weight:600;color:#5B6168\"><span style=\"display:inline-block;width:24px;height:4px;background:#B4622A;vertical-align:middle;margin-right:10px\"><\/span>Get started<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Using the code<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Python (NumPy and SciPy):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git clone https:\/\/github.com\/nld-uri\/ncvd-toolbox.git\ncd ncvd-toolbox\/python &amp;&amp; pip install -e .\n\nimport ncvd as nc\nrec = nc.ncvd(d, v, a)                  # X1 = U Phi^H, X2 = U Lam Phi^H + R\nmp  = nc.modal_parameters(rec.lam)      # wn, wd, zeta\ntr  = nc.track(d, v, a, fs=fs, length=800, step=400, M=M)   # backbones<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">MATLAB (base MATLAB, R2022a or later):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>addpath('ncvd-toolbox\/matlab')\nrec = ncvd.decompose(d, v, a);\nmp  = ncvd.modalParameters(rec.lam);\ntr  = ncvd.track(d, v, a, Fs=fs, Length=800, Step=400, M=M);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Both packages share the same API and are tested against each other. The <a href=\"https:\/\/github.com\/nld-uri\/ncvd-toolbox\/blob\/main\/docs\/manual\/NCVD_manual.pdf\">user manual<\/a> covers the theory, the options and seven worked examples; the <a href=\"https:\/\/github.com\/nld-uri\/ncvd-toolbox\">repository README<\/a> lists the contents.<\/p>\n\n\n\n<p style=\"margin:40px 0 8px;font-size:13px;line-height:16px;letter-spacing:0.12em;text-transform:uppercase;font-weight:600;color:#5B6168\"><span style=\"display:inline-block;width:24px;height:4px;background:#B4622A;vertical-align:middle;margin-right:10px\"><\/span>Citation<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How to cite<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Please cite both the software, archived on Zenodo as <a href=\"https:\/\/doi.org\/10.5281\/zenodo.23549069\">doi:10.5281\/zenodo.23549069<\/a>, and the method paper. <code>ncvd.cite()<\/code> in Python and <code>ncvd.cite<\/code> in MATLAB print the entries below.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@software{chelidze2026ncvd,\n  author    = {Chelidze, David and Li, Hewenxuan and Stein, Dalton L.},\n  title     = {{NCVD} toolbox: Nonlinear Characteristic Value Decomposition for {Python} and {MATLAB}},\n  version   = {1.0.0},\n  year      = {2026},\n  publisher = {Zenodo},\n  doi       = {10.5281\/zenodo.23549069},\n  url       = {https:\/\/github.com\/nld-uri\/ncvd-toolbox}\n}\n\n@article{li2025cvd,\n  author  = {Li, Hewenxuan and Stein, Dalton L. and Chelidze, David},\n  title   = {Characteristic value decomposition: A unifying paradigm for data-driven modal analysis},\n  journal = {Mechanical Systems and Signal Processing},\n  volume  = {222},\n  pages   = {111769},\n  year    = {2025},\n  doi     = {10.1016\/j.ymssp.2024.111769}\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For amplitude-dependent identification and the reduced-order-model tools, please also cite D. L. Stein, D. Chelidze, <em>Nonlinear Dynamics<\/em> 113 (2025) 25\u201345, <a href=\"https:\/\/doi.org\/10.1007\/s11071-024-10239-0\">doi:10.1007\/s11071-024-10239-0<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nonlinear Dynamics Laboratory NCVD toolbox One free decay of a three-mass chain with a cubic spring. Each shaded window is decomposed; the three resonances trace their frequency-energy dependence back to the linear frequencies. Nonlinear Characteristic Value Decomposition: modal identification from a measured or simulated state record, with exact identities, pole correction for numerical derivatives, noise-robust [&hellip;]<\/p>\n","protected":false},"author":1291,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":"","_links_to":"","_links_to_target":""},"class_list":["post-1923","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/web.uri.edu\/nld\/wp-json\/wp\/v2\/pages\/1923","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/web.uri.edu\/nld\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/web.uri.edu\/nld\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/web.uri.edu\/nld\/wp-json\/wp\/v2\/users\/1291"}],"replies":[{"embeddable":true,"href":"https:\/\/web.uri.edu\/nld\/wp-json\/wp\/v2\/comments?post=1923"}],"version-history":[{"count":4,"href":"https:\/\/web.uri.edu\/nld\/wp-json\/wp\/v2\/pages\/1923\/revisions"}],"predecessor-version":[{"id":1936,"href":"https:\/\/web.uri.edu\/nld\/wp-json\/wp\/v2\/pages\/1923\/revisions\/1936"}],"wp:attachment":[{"href":"https:\/\/web.uri.edu\/nld\/wp-json\/wp\/v2\/media?parent=1923"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}