VPT Decoupling#

The decoupling of susbtructures is performed in a similar fashion as the coupling, with the only difference that a minus sign must be applied on the subsystem to be decoupled. The operation is also based on the Lagrange-Multiplier Frequency-Based Substructuring (LM-FBS) 1 formulation. In the following, a basic decoupling of two numerically-generated substructures is presented. The virtual point transformation 2 is applied to impose collocated matching DoFs at the interface. This can also be performed analogously with experimentally acquired data.


Download example showing a substructure decoupling application: 08_decoupling_VPT.ipynb


Why use virtual point when decoupling substructures?

  • Complex interfaces are very often inaccessible for the measurement equipment. Therefore measurements are often performed away from the actual interface. Also, the collocation of DoFs at the neighboring interfaces is almost impossible to ensure. Virtual point, on the other hand, can be defined in an arbitrary location at the interface that coincides for all substructures.

  • Virtual point accounts for rotational degrees of freedom, which are mandatory for the successful decoupling of the substructures.

  • By the reduction of measurements to the virtual point the interface problem is weakened. That means that compatibility and equilibrium conditions on the measured DoFs are a bit more relaxed. In this manner, unwanted stiffening effects can be avoided.

  • Due to the reduction, measurement errors such as bias from sensor positioning or uncorrelated measurement noise are filtered out to some extend.

Example Datasets and 3D view#

Load the required predefined datasets and open the 3D viewer in the background as already shown in 3D Display. Also for decoupling, a subplot representation, as already presented in Coupling, can be used.



With pyFBS you can simply prepare the experiments before hand! Position your virtual accelerometers and sensors on 3D model, generate numerical FRFs and make sure that everything is in order. Then, perform your experiment, following the sensor setup you prepared in your virtual example. Simply replace numerical FRFs with experimental ones, and results are only few clicks away!

Virtual point transformation#


It would be impractical to measure interface admittance for both substructures in multiple DoFs at the interface and furthermore ensure, that these DoFs are perfectly collocated. Therefore we adopt VPT in order to obtain a collocated full-DoF interface admittance matrix for each substructure.

The VPT can be performed directly on the generated data. See the 04_VPT.ipynb example for more options and details.

df_vp = pd.read_excel(pos_xlsx, sheet_name='VP_Channels')
df_vpref = pd.read_excel(pos_xlsx, sheet_name='VP_RefChannels')

vpt_AB = pyFBS.VPT(df_chn_AB_up,df_imp_AB_up,df_vp,df_vpref)
vpt_B = pyFBS.VPT(df_chn_B_up,df_imp_B_up,df_vp,df_vpref)

Apply the defined VP transformation on the FRFs:


Extract the requried FRFs and the frequency vector:

freq = MK_AB.freq
Y_AB = vpt_AB.vptData
Y_B = vpt_B.vptData

LM-FBS Decoupling#

First, construct an admittance matrix for the uncoupled system, containing substructure admittances. Note that the operation is equivalent to the one performed for the coupling case with the difference that a minus sign here is applied on the subsystem to be decoupled.

\[\begin{split}\mathbf{Y}^\text{AB|B} = \begin{bmatrix} \mathbf{Y}^\text{AB} & \mathbf{0} \\ \mathbf{0} & -\mathbf{Y}^\text{B} \end{bmatrix}\end{split}\]
Y_ABnB = np.zeros((Y_AB.shape[0],Y_AB.shape[1]+Y_B.shape[1],Y_AB.shape[2]+Y_B.shape[2]), dtype=complex)

Y_ABnB[:,:Y_AB.shape[1],:Y_AB.shape[2]] = Y_AB
Y_ABnB[:,Y_AB.shape[1]:,Y_AB.shape[2]:] = -1*Y_B

Next the compatibility and the equilibrium conditions has to be defined through the signed Boolean matrices Bu and Bf.

\[\mathbf{B}_\text{u}\,\boldsymbol{u} = \mathbf{0}\]
\[\boldsymbol{g} = - \mathbf{B}_\text{f}^\text{T} \boldsymbol{\lambda}\]

Make sure that the correct DoFs are selected for the decoupling. For this case, the interface is extended to the internal DoFs common to both AB and B, making in total 6 + 12 compatibility and equilibrium conditions. Adding compatibility and equilibrium at the internal DoFs contributes to increase the observability and controllability of the interface dynamics 3.

k = 6 + 12

Bu = np.zeros((k,Y_AB.shape[1]+Y_B.shape[1]))
Bu[:k,6:6+k] = 1*np.eye(k)
Bu[:k,24:24+k] = -1*np.eye(k)

Bf = np.zeros((k,Y_AB.shape[1]+Y_B.shape[1]))
Bf[:k,6:6+k] = 1*np.eye(k)
Bf[:k,24:24+k] = -1*np.eye(k)

For the LM FBS method, having defined \(\mathbf{Y^{\text{AB|B}}}\), \(\mathbf{B}_\text{u}\) and \(\mathbf{B}_\text{f}\) is already sufficient to perform coupling:

\[\mathbf Y^{\text{A}} = \mathbf Y^{\text{AB|B}} - \mathbf Y^{\text{AB|B}}\,\mathbf B^\mathrm{T} \left( \mathbf B \mathbf Y^{\mathrm{AB|B}} \mathbf{B}^\mathrm{T} \right)^{-1} \mathbf B \mathbf Y^\text{AB|B}\]
Y_An = np.zeros_like(Y_ABnB,dtype = complex)

Y_int = Bu @ Y_ABnB @ Bf.T
Y_An =Y_ABnB - Y_ABnB @ Bf.T @ np.linalg.pinv(Y_int) @ Bu @ Y_ABnB


First extract the FRFs at the reference DoFs:

arr_coup = [0,1,2,3,4,5]
Y_A_coupled = Y_An[:,arr_coup,:][:,:,arr_coup]
Y_A_ref = MK_A.FRF

The decoupled and the reference results can then be compared and evaluated:

That’s a wrap!

Want to know more, see a potential application? Contact us at info.pyfbs@gmail.com!



de Klerk D, Rixen DJ, Voormeeren SN. General framework for dynamic substructuring: history, review and classification of techniques. AIAA journal. 2008 May;46(5):1169-81.


van der Seijs MV, van den Bosch DD, Rixen DJ, de Klerk D. An improved methodology for the virtual point transformation of measured frequency response functions in dynamic substructuring. In4th ECCOMAS thematic conference on computational methods in structural dynamics and earthquake engineering 2013 Jun (No. 4).


Voormeeren SN, Rixen DJ. A family of substructure decoupling techniques based on a dual assembly approach. Mechanical Systems and Signal Processing. 2012 Feb 1;27:379-96.