Skip to main content

Automated Experimental Modal Analysis using Bayesian Optimization

Project description

Automation of Experimental Modal Analysis Using Bayesian Optimization (AutoEMA)

DOWNLOAD THE PAPER

Implementation of the paper "Automation of Experimental Modal Analysis Using Bayesian Optimization". For further information, please check the publication. Cite as:

@Article{ellinger2023autoema,
    AUTHOR = {Ellinger, Johannes and Beck, Leopold and Benker, Maximilian and Hartl, Roman and Zaeh, Michael F.},
    TITLE = {Automation of Experimental Modal Analysis Using Bayesian Optimization},
    JOURNAL = {Applied Sciences},
    VOLUME = {13},
    YEAR = {2023},
    NUMBER = {2},
    ARTICLE-NUMBER = {949},
    URL = {https://www.mdpi.com/2076-3417/13/2/949},
    ISSN = {2076-3417},
    ABSTRACT = {The dynamic characterization of structures by means of modal parameters offers many valuable insights into the vibrational behavior of these structures. However, modal parameter estimation has traditionally required expert knowledge and cumbersome manual effort such as, for example, the selection of poles from a stabilization diagram. Automated approaches which replace the user inputs with a set of rules depending on the input data set have been developed to address this shortcoming. This paper presents an alternative approach based on Bayesian optimization. This way, the possible solution space for the modal parameter estimation is kept as widely open as possible while ensuring a high accuracy of the final modal model. The proposed approach was validated on both a synthetic test data set and experimental modal analysis data of a machine tool. Furthermore, it was benchmarked against a similar tool from a well-known numerical computation software application.},
    DOI = {10.3390/app13020949}
}

Installation

Pip is recommended to install this package. See this for more information.

pip install autoema

Quick start

Import the package and load the example:

from AutoEMA import AutoEMA as ae

Initializing the OptimizationModel (OptModel) and optimize it:

frf, f = ae.load_example() 
model = ae.OptModel(frf=frf, f_axis=f) 
model.optimize(n_init=2, n_iter=2)  # Do more iterations on real data 
|   iter    |  target   |   dist    | err_ceta  |  err_fn   | max_ceta  | max_norm  | min_poles |   n_max   |
-------------------------------------------------------------------------------------------------------------
|  1        |  0.7799   |  1.901    |  0.158    |  0.001011 |  0.2302   |  0.2027   |  0.2369   |  71.18    |
|  2        |  0.7799   |  1.644    |  0.1095   |  0.05434  |  0.2419   |  0.5797   |  0.2818   |  112.7    |
|  3        |  0.7799   |  2.281    |  0.09488  |  0.03839  |  0.2495   |  0.6356   |  0.5874   |  72.3     |
|  4        |  0.7799   |  0.5249   |  0.1351   |  0.01548  |  0.2752   |  0.1158   |  0.2957   |  66.13    |
=============================================================================================================

Visualize the result by plotting the stability diagram:

_ = model.plot_stability_diagram() 

png

Visualize the damping ratios:

model.plot_damping_ratios()

png

Print the results of the optimized modal analysis:

print(model)
Model order: 22
FRAC: 100.0%
Natural frequencies: ['11.2', '33.3', '53.4', '78.4', '96.9', '118.4', '154.6', '167.6', '176.3', '199.4', '233.0', '244.5', '270.3', '284.7', '290.7', '325.3', '338.9', '368.2', '372.1', '377.8', '391.8', '395.4']
Damping ratios: ['0.145', '0.051', '0.035', '0.027', '0.025', '0.023', '0.023', '0.023', '0.024', '0.024', '0.026', '0.027', '0.028', '0.029', '0.029', '0.032', '0.032', '0.034', '0.035', '0.035', '0.036', '0.036']

Get the modal parameters:

reconstructed_frf, freq_axis, nat_freqs, damp_ratios, mode_shapes = model.get_results() 
FRAC = model.get_frac() 

Have a look at the optimized parameter:

optimized_params = model.params
print(optimized_params)
{'n_max': 71, 'err_fn': 0.0010113231069171437, 'err_ceta': 0.15804867401632372, 'min_ceta': 0, 'max_ceta': 0.23023325726318397, 'dist': 1.9012792169292663, 'min_poles': 0.23693543790751914, 'max_norm': 0.20272912357197914}

Using the same optimized parameters for another modal analysis without optimizing again:

bmodel = ae.BaseModel(frf=frf, f_axis=f, params=optimized_params)
bmodel.run()
print(bmodel)
Model order: 22
FRAC: 100.0%
Natural frequencies: ['11.2', '33.3', '53.4', '78.4', '96.9', '118.4', '154.6', '167.6', '176.3', '199.4', '233.0', '244.5', '270.3', '284.7', '290.7', '325.3', '338.9', '368.2', '372.1', '377.8', '391.8', '395.4']
Damping ratios: ['0.145', '0.051', '0.035', '0.027', '0.025', '0.023', '0.023', '0.023', '0.024', '0.024', '0.026', '0.027', '0.028', '0.029', '0.029', '0.032', '0.032', '0.034', '0.035', '0.035', '0.036', '0.036']

Advanced

Play around with the regularization parameter when optimizing the model. An increasing regularization parameter leads to a lower model order.

model = ae.OptModel(frf=frf, f_axis=f, reg=0.1, show_progress=False) 
model.optimize(n_init=10, n_iter=10)
print(model)
Model order: 20
FRAC: 100.0%
Natural frequencies: ['11.2', '33.3', '53.4', '78.4', '96.9', '118.4', '154.6', '167.6', '176.3', '199.4', '233.0', '244.5', '270.3', '284.7', '290.7', '325.3', '338.9', '370.2', '377.8', '393.7']
Damping ratios: ['0.145', '0.051', '0.035', '0.027', '0.025', '0.023', '0.023', '0.023', '0.024', '0.024', '0.026', '0.027', '0.028', '0.029', '0.029', '0.032', '0.032', '0.034', '0.035', '0.036']

Project details


Release history Release notifications | RSS feed

This version

0.0

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

AutoEMA-0.0.tar.gz (11.4 kB view details)

Uploaded Source

File details

Details for the file AutoEMA-0.0.tar.gz.

File metadata

  • Download URL: AutoEMA-0.0.tar.gz
  • Upload date:
  • Size: 11.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.6

File hashes

Hashes for AutoEMA-0.0.tar.gz
Algorithm Hash digest
SHA256 45a1e4036332a552b2349d03f5895c8c4050a307cb9a9e7e166d5d09be937c68
MD5 b169ca2ca5f877b56fc8d7d3873513a9
BLAKE2b-256 f18f3cb4a038dfe4fc83c3181043e9bc1da5a591fd0bf1ad9e97041de64016d7

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page