Skip to content

Commit 4f6d5d8

Browse files
committed
Updated docuumentation
1 parent 4712915 commit 4f6d5d8

File tree

4 files changed

+234
-31
lines changed

4 files changed

+234
-31
lines changed

docs/source/modal_tutorials/Modal_03_Multi_DoF_Vibrations/Modal_03_Multi_DoF_Vibrations.ipynb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -311,13 +311,13 @@
311311
"\n",
312312
"Let's examine some of the features of the plots. Similar to the single degree of freedom case, the frequency response functions have peaks, which are resonances of the structure. Unlike the single degree of freedom case, we now have steep valleys in the plots, which are called anti-resonances. These are frequencies that the structure does not like to respond. Note that while resonances tend to be global (peaks occur at the same frequency for all degrees of freedom), anti-resonances tend to be local to the specific degree of freedom (the anti-resonance in the 1,1 plot occurs at 5.59 Hz, and the anti-resonance in the 2,2 plot occurs at 5.02 Hz).\n",
313313
"\n",
314-
"Note the diagonal entries in the plots are the plots where the response is equal to the input. These are called drive point frequency response functions, because they are the frequency response functions for just the point that is being driven by the force. Drive point frequency response functions have special properties, namely there is always an anti-resonance between each consecutive pair of resonances, and the phase is always one-sided, meaning it is always positive or always negative for a displacement or an acceleration frequency response function.\n",
314+
"Note the diagonal entries in the above plots are the frequency response functions where the response is equal to the input. These are called drive point frequency response functions, because they are the frequency response functions for just the point that is being driven by the force. Drive point frequency response functions have special properties, namely there is always an anti-resonance between each consecutive pair of resonances, and the phase is always one-sided, meaning it is always positive or always negative for a displacement or an acceleration frequency response function.\n",
315315
"\n",
316316
"Another interesting aspect is the behavior of the phase as it goes through a resonance or anti-resonance. In the single degree of freedom case, we saw the phase flip 180 degrees as it travelled through resonances. This still holds here, but now the phase can traverse multiple resonances, reducing by 180 degrees each time (note that the phase will wrap around from -180 to 180, or from 0 to 360 depending on how it is plotted, due to it being a circular quantity). Interestingly, after passing an anti-resonance the phase will increase by 180 degrees. This behavior combined with the flipping between anti-resonance and resonance in the drive point frequency response functions is what keeps the phase on one half of the unit circle for the drive point frequency response functions.\n",
317317
"\n",
318318
"Finally, thinking back to the damping investigations performed in the single degree of freedom tutorial, it looks as if the second peak has more damping associated with it: the second peak is less sharp and is at a lower amplitude than the first peak.\n",
319319
"\n",
320-
"Clearly there is a lot that can be learned aboud a system from its frequency response functions. Let's look at the same information, this time in the real and imaginary parts."
320+
"Clearly there is a lot that can be learned about a system from its frequency response functions. Let's look at the same information, this time in the real and imaginary parts."
321321
]
322322
},
323323
{
@@ -405,7 +405,7 @@
405405
"id": "fbe5c969",
406406
"metadata": {},
407407
"source": [
408-
"We can now use the `System` object to interogate our system. Like the single degree of freedom case, we can still compute frequency response functions, but now we can also pass in coordinate information to only retrieve certain rows and columns of the frequency response function matrix. For example, if we wanted all frequency responses from all responses, but only the first force locations, we can specify a `CoordinateArray` object to the `frequency_response` method using the `references` and `responses` optional arguments."
408+
"We can now use the `System` object to interrogate our system. Like the single degree of freedom case, we can still compute frequency response functions, but now we can also pass in coordinate information to only retrieve certain rows and columns of the frequency response function matrix. For example, if we wanted all frequency responses from all responses, but only the first force locations, we can specify a `CoordinateArray` object to the `frequency_response` method using the `references` and `responses` optional arguments."
409409
]
410410
},
411411
{

docs/source/modal_tutorials/Modal_04_Modal_Analysis/Modal_04_Modal_Analysis.ipynb

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@
328328
"\n",
329329
"Recall in the first tutorial, we described the properties of modes. There was a frequency, a damping, and a shape associated with each mode. Well, here we have seen that an eigenvalue of a system tells us the frequency of vibration, and the eigenvector tells us the shape of the vibration (we will discuss damping shortly). The eigensolution is actually telling us the modal properties of our system. This makes it very useful indeed!\n",
330330
"\n",
331-
"Let's investigate a bit more about these modes. First, it is important to recognize that there is one mode (eigenvalue/frequency and eigenvector/shape) for each degree of freedom in the system. This is because the characteristic equation will end up having a polynomial order equal to the number of degrees of freedom of the system, and there will therefore be a number of roots equal to the number of degrees of freedom of the system. Extrapolating for a second to real systems with effectively infinite degrees of freedom, there are effectively infinite modes of the system. Thankfully, we can often only consider modes within a bandwidth of interest. For example in the current case, if our environment only contained frequency content up to 5 Hz, we may only need to consider the response of the first mode at 3.21 Hz, and we may be able to ignore the higher frequency mode at 6.83 Hz.\n",
331+
"Let's investigate a bit more about these modes. First, it is important to recognize that there are the same number of modes (eigenvalues/frequencies and eigenvectors/shapes) as there are degrees of freedom in the system. This is because the characteristic equation will end up having a polynomial order equal to the number of degrees of freedom of the system, and there will therefore be a number of roots equal to the number of degrees of freedom of the system. Extrapolating for a second to real systems with effectively infinite degrees of freedom, there are effectively infinite modes of the system. Thankfully, we can often only consider modes within a bandwidth of interest. For example in the current case, if our environment only contained frequency content up to 4 Hz, we may only need to consider the response of the first mode at 3.21 Hz, and we may be able to ignore the higher frequency mode at 6.83 Hz.\n",
332332
"\n",
333333
"Eigenvectors (i.e. mode shapes) are typically represented as column vectors, as seen in the above equations. However, they are often concatenated together into a *mode shape matrix* where the rows represent degrees of freedom and the columns represent mode indices. Mode shape matrices are often given the variable $\\Phi$.\n",
334334
"\n",
@@ -393,7 +393,7 @@
393393
"source": [
394394
"From the above, we see that the modal mass and stiffness matrices are diagonal (except for small numerical errors). This is a very interesting result, because it means that the system of equations are now *decoupled*, meaning the response of $q_1$ doesn't depend at all on the response of $q_2$. This is opposed to the original system of equations, where if we modified $x_1$ (i.e. moved mass 1) it would also move mass 2. This effectively lets us treat the modal system of equations as two simple single degree of freedom systems with masses 1.7 and 2.4 and stiffnesses 693 and 4460, rather than a single more complicated system.\n",
395395
"\n",
396-
"We remarked earlier that eigenvectors, and therefore mode shapes, are not unique. We can scale the mode shape by any factor, and it will still be a valid mode shape. One might wonder if there is any kind of \"preferred\" scaling of the mode shape matrix, and there is. For example, to simplify the modal equations, we can scale the mode shape such that modal mass matrix is the identity matrix. If we scale the existing eigenvectors by $1/\\sqrt{\\Phi^T M \\Phi}$, we will get shape vectors that produce an identity mass matrix when the modal transformation is performed."
396+
"We remarked earlier that eigenvectors, and therefore mode shapes, are not unique. We can scale the mode shape by any factor, and it will still be a valid mode shape. One might wonder if there is any kind of \"preferred\" scaling of the mode shape matrix, and there is. For example, to simplify the modal equations, we can scale the mode shape such that modal mass matrix is the identity matrix. If we scale the existing eigenvectors by $1/\\sqrt{\\Phi^T \\mathbf{M} \\Phi}$, we will get shape vectors that produce an identity mass matrix when the modal transformation is performed."
397397
]
398398
},
399399
{
@@ -521,7 +521,7 @@
521521
"A second way to model damping is to ignore any physical damping mechanisms and assign damping per mode. This is typically the approach used in experimental modal analysis, where we cannot measure the disappation due to specific joints or other features of the structure, but we can measure more global quantities like energy dissapation per cycle. This is typically applied via a fraction of critical damping $\\zeta$ for each mode of the structure, where the total damping for that mode is equal to $\\tilde{c}=2\\zeta\\omega$.\n",
522522
"\n",
523523
"### General Damping Matrices\n",
524-
"If there are discrete damping elements present in the system, for example in the suspension of an automobile, it is typically useful to model those specifically, which will require a general damping matrix. It is possible that the eigenvectors will not diagonalize this damping matrix. In some cases, the off-diagonal elements may be small, and therefore it is not terrible approximation to simply discard the off-diagonal elements and assume the matrix was diagonalized. Alternatively, the eigensolution can be reformulated to include the damping matrix as well. This will result in *complex modes*, where the shape is no longer a real number, but instead a complex number. Complex modes will be covered in a later tutorial. If we do proceed with simply discarding the off-diagonal elements, we can then compute the fraction of critical damping for each mode with the equation $\\zeta = {\\tilde{c} / ({2\\omega}})$ where $\\tilde{c}$ is the diagonal value of the modal damping matrix.\n",
524+
"If there are discrete damping elements present in the system, for example in the suspension of an automobile, it is typically useful to model those explicitly, which will require a general damping matrix. It is possible that the eigenvectors will not diagonalize this damping matrix. In some cases, the off-diagonal elements may be small, and therefore it is not terrible approximation to simply discard the off-diagonal elements and assume the matrix was diagonalized. Alternatively, the eigensolution can be reformulated to include the damping matrix as well. This will result in *complex modes*, where the shape is no longer a real number, but instead a complex number. Complex modes will be covered in a later tutorial. If we do proceed with simply discarding the off-diagonal elements, we can then compute the fraction of critical damping for each mode with the equation $\\zeta = {\\tilde{c} / ({2\\omega}})$ where $\\tilde{c}$ is the diagonal value of the modal damping matrix.\n",
525525
"\n",
526526
"We will investigate this latter case in our system, assuming there are dampers $c_1$ and $c_2$ along with the springs $k_1$ and $k_2$."
527527
]
@@ -1224,8 +1224,7 @@
12241224
"execution_count": 24,
12251225
"id": "20ff0a67",
12261226
"metadata": {},
1227-
"outputs": [
1228-
],
1227+
"outputs": [],
12291228
"source": [
12301229
"plate_geometry.plot();"
12311230
]
@@ -1297,8 +1296,7 @@
12971296
"execution_count": 26,
12981297
"id": "9ad343f1",
12991298
"metadata": {},
1300-
"outputs": [
1301-
],
1299+
"outputs": [],
13021300
"source": [
13031301
"plotter = plate_geometry.plot_coordinate(\n",
13041302
" np.unique(plate_shapes.coordinate), # Use np.unique to remove duplicate coordinates\n",
@@ -1333,7 +1331,6 @@
13331331
]
13341332
},
13351333
{
1336-
"attachments": {},
13371334
"cell_type": "markdown",
13381335
"id": "918795f7",
13391336
"metadata": {},
@@ -1386,7 +1383,7 @@
13861383
],
13871384
"metadata": {
13881385
"kernelspec": {
1389-
"display_name": "Python 3",
1386+
"display_name": "Python 3 (ipykernel)",
13901387
"language": "python",
13911388
"name": "python3"
13921389
},
@@ -1400,7 +1397,7 @@
14001397
"name": "python",
14011398
"nbconvert_exporter": "python",
14021399
"pygments_lexer": "ipython3",
1403-
"version": "3.8.10"
1400+
"version": "3.10.9"
14041401
}
14051402
},
14061403
"nbformat": 4,

docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/Modal_05a_Computing_FRF_from_Time_Data.ipynb

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@
2323
"execution_count": 1,
2424
"id": "bee5fffa",
2525
"metadata": {},
26-
"outputs": [
27-
],
26+
"outputs": [],
2827
"source": [
2928
"# Import sdynpy for structural dynamics\n",
3029
"import sdynpy as sdpy\n",
@@ -126,7 +125,7 @@
126125
"id": "f83b7bf3",
127126
"metadata": {},
128127
"source": [
129-
"We can see that there is some start-up transients, but after about a second and a half, the system has reached steady state, so we can compute the amplitude and phase of the signals at this point."
128+
"We can see that there are some start-up transients, but after about a second and a half, the system has reached steady state, so we can compute the amplitude and phase of the signals at this point."
130129
]
131130
},
132131
{
@@ -212,8 +211,7 @@
212211
"execution_count": 4,
213212
"id": "f2c2f65f",
214213
"metadata": {},
215-
"outputs": [
216-
],
214+
"outputs": [],
217215
"source": [
218216
"excitation_frequencies = np.linspace(50,120,71)\n",
219217
"\n",
@@ -518,17 +516,17 @@
518516
"\n",
519517
"The estimate of the frequency response function matrix using the H1 technique is computed by\n",
520518
"\n",
521-
"$$\\mathbf{H}_1 = \\mathbf{P_{XF}} \\mathbf{P_{FF}}^{-1}$$\n",
519+
"$$\\mathbf{H}_1 = \\mathbf{P}_{XF} {\\mathbf{P}_{FF}}^{-1}$$\n",
522520
"\n",
523521
"which is the ratio of the cross-power spectra matrix $\\mathbf{P_{XF}}$ and the auto-power spectra matrix $\\mathbf{P_{FF}}$.\n",
524522
"\n",
525523
"#### The H<sub>2</sub> Technique\n",
526524
"\n",
527525
"Unlike the H<sub>1</sub> technique, the **H<sub>2</sub> Technique** is not commonly used. Instead of minimizing the noise on the responses, it instead minimizes noise on the excitation signals. It will also overestimate the frequency response function matrix at resonance and therefore understimate damping. The equation for the H<sub>2</sub> technique is\n",
528526
"\n",
529-
"$$\\mathbf{H}_2 = \\mathbf{P_{XX}} \\mathbf{P_{FX}}^{-1}$$\n",
527+
"$$\\mathbf{H}_2 = \\mathbf{P}_{XX} {\\mathbf{P}_{FX}}^{-1}$$\n",
530528
"\n",
531-
"which is the ratio of the auto-power spectra matrix $\\mathbf{P_{XX}}$ and the cross-power spectra matrix $\\mathbf{P_{FX}}$. Note the implications of this formula. Because the matrix $\\mathbf{P_{FX}}$ needs to be inverted, the matrix must be square if multiple input forces are applied. This restricts the H<sub>2</sub> frequency response function estimate to cases where the number of responses is equal to the number of excitation signals (which is very rarely the case) or when the number of excitation signals is 1 (in which case, each response can be treated independently as if it were a single-input, single-output test). This restriction greatly reduces the utility of the H<sub>2</sub> technique, so it is seldom used.\n",
529+
"which is the ratio of the auto-power spectra matrix $\\mathbf{P}_{XX}$ and the cross-power spectra matrix $\\mathbf{P}_{FX}$. Note the implications of this formula. Because the matrix $\\mathbf{P}_{FX}$ needs to be inverted, the matrix must be square if multiple input forces are applied. This restricts the H<sub>2</sub> frequency response function estimate to cases where the number of responses is equal to the number of excitation signals (which is very rarely the case) or when the number of excitation signals is 1 (in which case, each response can be treated independently as if it were a single-input, single-output test). This restriction greatly reduces the utility of the H<sub>2</sub> technique, so it is seldom used.\n",
532530
"\n",
533531
"#### The H<sub>3</sub> Technique\n",
534532
"\n",
@@ -632,8 +630,7 @@
632630
"execution_count": 12,
633631
"id": "ea58b8ab-df5e-422a-9a64-de92c89fa38f",
634632
"metadata": {},
635-
"outputs": [
636-
],
633+
"outputs": [],
637634
"source": [
638635
"# Set up references are responses\n",
639636
"references = sdpy.coordinate_array([201],3)\n",
@@ -690,7 +687,7 @@
690687
"id": "7e420f5c-3995-4b5b-b7ca-46751d040115",
691688
"metadata": {},
692689
"source": [
693-
"At this point, we can simulate a modal test. We will do this using the `simulate_test` method of the `system` object, specifying a bandwidth of 50 Hz, a frame length of 2000 samples, 50 averages, pseudorandom excitation, our reference and response degrees of freedom, and an amount of time to wait for the system to hit steady state. We pass all of this information into the `simulate_test` method. Output from the method is our response and references signals from the test that we will compute frequency response functions from."
690+
"At this point, we can simulate a modal test. We will do this using the `simulate_test` method of the `system` object, specifying a bandwidth of 50 Hz, a frame length of 2000 samples, 50 averages, pseudorandom excitation, our reference and response degrees of freedom, and an amount of time to wait for the system to hit steady state. We pass all of this information into the `simulate_test` method. Output from the method is our response and reference signals from the test that we will compute frequency response functions from."
694691
]
695692
},
696693
{
@@ -958,7 +955,7 @@
958955
"name": "python",
959956
"nbconvert_exporter": "python",
960957
"pygments_lexer": "ipython3",
961-
"version": "3.10.8"
958+
"version": "3.10.9"
962959
}
963960
},
964961
"nbformat": 4,

0 commit comments

Comments
 (0)