Authors: Jakob Scheffels, Viet Ha Dinh

Supervisors: Jonas Hillenbrand, Sebastian Schopper

Introduction

Many gradient-based optimization problems require design sensitivity analyses to quantify the changes in performance of the design with respect to design parameters. In structural dynamics, it is common that optimization problems depend on a large amount of design parameters [3], and so computing the sensitivities – in the form of gradients – with the finite difference approach is extremely inefficient and time-consuming. Another approach for computing the gradients is the adjoint method, which is very efficient for a large amount of parameters. This project aims to implement the adjoint method in sensitivity analysis for transient problems and validate the implementation with practical examples such as the performance of a tuned mass damper with respect to its design parameters. The implementation of the adjoint sensitivity analysis is done using with MATLAB with the package bm_mfem as the basis.

Sensitivity Analysis

Optimization problem

First an optimization problem is set up. 

Consider a single degree of freedom system consisting of a mass, a spring and a damper. A harmonic load F(t) = F_0\cos(\omega t) is applied to the mass element.

     

We have: 

  • Design variables : s

  e.g.: [𝑴&𝑪&𝑲]^𝑇

  • State variables: 𝒖(𝒔, 𝑡)  with t : time

Primal problem

  • Equation of motion for transient problem :
𝑹(𝒔, 𝒖, 𝒖 ̇, 𝒖 ̈,𝑡)=𝑴(𝒔) 𝒖 ̈+𝑪(𝒔) 𝒖 ̇+𝑲(𝒔)𝒖−𝑭(𝒕) \equiv 0 \\ 𝒖(𝑡=0)= 𝒖_0 \\ 𝒖 ̇(𝑡=0)= 𝒖 ̇_0

The above equation represents the primal problem in which the displacement u, the velocity \dot{u}, the acceleration \ddot{u} are solved iteratively by the Newmark method. 

  • Response function: 𝑱(𝒔, 𝒖, 𝒖 ̇ )= \int_0^T 𝒋(𝒔, 𝒖, 𝒖 ̇ )dt 

In structural dynamics, a common response function is the energy dissipation function : 𝑾_𝒄= −\int_𝟎^𝑻 𝒖 ̇^𝑇 𝑪 𝒖 ̇ 𝑑𝑡

The sensitivity analysis is applied to assess the response function of the system with respect to its design parameters. This can be done by computing the derivatives of response function J to design parameter s_i  for i as the index of the respected element in the system.

  • Local sensitivity: 
\frac{dJ}{ds_i} = \int_o^T \frac{dj}{ds_i}dt = \int_o^T (\frac{dj}{ds_i} + \frac{dj}{du} \cdot \frac{du}{ds_i} + \frac{dj}{d \dot{u}} \cdot \frac{d \dot{u}}{ds_i} + \frac{dj}{d \ddot{u}} \cdot \frac{d \ddot{u}}{ds_i} )dt


Adjoint problem

We introduce the Lagrange equation by adding the product of the lambda multiplier and the equation of motion to the response function. For a system in equilibrium, R = 0, therefore, adding it will not deviate the sensitivity results. 

L(u,\dot{u}, \ddot{u}, s) = J + \int_0^T \lambda^T Rdt = \int_0^T({j + \lambda^TR})dt

Differentiate the Lagrange equation, we have the sensitivity:

\frac{d{J}}{d{s_i}} = \frac{d{L}}{d{s_i}} = \int_0^T \left ( \frac{\partial{j}}{\partial{s_i}} + {\lambda}^T \cdot \frac{\partial{R}}{\partial{s_i}} \right)dt

Throughout further derivation, specifically inserting the derivative of R to the sensitivity and integrating by parts (see Appendix), we achieve a second-order differential equation where lambda is the unknown as below.

M^T\frac{d\dot{\lambda}}{dt} - C^T\dot{\lambda} + K^T\lambda = - \left (\frac{\partial j}{\partial u} \right)^T + \dot{u}^T + \left ( \frac{\partial^2{j}}{\partial u \partial{\dot{u}}} \right) ^T + \ddot{u}^T \left (\frac{\partial^2 j}{\partial{\dot{u^2}}} \right )^T \\ \lambda(T) = 0 \\ M^T\dot{\lambda}(T) = -\left (\frac{\partial j}{\partial \dot{u}} \right)_{t=T}

We can see that the derivatives \frac{du}{ds_i}, \frac{d \dot{u}}{ds_i} and \frac{d \ddot{u}}{ds_i} are omitted, thus there is no dependency of the design variables in this adjoint problem.

Since the conditions are given at time t = T instead of t = 0, we need to solve the equation backwards in time. Therefore, we introduce the substitution:

\tau = T - t \\ \lambda(t) = \Lambda(T-t) = \Lambda(\tau), \dot{\lambda}(t) = - \dot{\Lambda}(\tau), \ddot\lambda(t) = \ddot\Lambda(\tau)

Thus, the adjoint problem reads:

M^T\frac{d\dot{\Lambda}}{dt} + C^T\dot{\Lambda} + K^T\Lambda = - \left (\frac{\partial j}{\partial u} \right)^T + \dot{u}^T + \left ( \frac{\partial^2{j}}{\partial u \partial{\dot{u}}} \right) ^T + \ddot{u}^T \left (\frac{\partial^2 j}{\partial{\dot{u^2}}} \right )^T \\ \Lambda(0) = 0 \\ M^T\dot{\Lambda}(0) = -\left (\frac{\partial j}{\partial \dot{u}} \right)_{t=T}

We solve the adjoint problem for lambda, and then insert lambda back to \frac{dJ}{ds} for our sensitivities. 

\frac{dJ}{ds} = \int_0^T {\left ( \frac{\partial{j}}{\partial{s_i}} + \Lambda^T(T-t) \frac{\partial{R}}{\partial{s_i}} \right )dt}

The adjoint problem acquires the use of the transpose matrix of M, C, K and shifting the derivatives to the Lagrange parameters \lambda, which is the definition of an 'adjoint operator'. Thus the method is named "adjoint method".

Through this method, we only need to solve for lambda once and then inserting lambda in the integral to compute the sensitivities. Therefore, the adjoint method is very efficient, especially for problems with a large amount of parameters, as we do not need to compute the derivative of u with respect to different parameters.  

Examples

Single Degree-of-Freedom System

To show the functionality of the Adjoint Sensitivity Method, we start with a simple mass-spring-damper-system with a single degree of freedom. The system has known design parameters s={m,k,c} and is subjected to a harmonic load with a single excitation frequency \omega_{ex} . The system is exposed to an initial displacement u(0) = u_0 and an initial velocity v(0) = v_0. We choose as response function J = \int_0^T u^2 (t) + v^2 (t) dt. For this example we chose the following values for the parameters:

m = 1.0kg, k = 10\frac{N}{m}, c = 2.5 \frac{Ns}{m}, |f| = 2N, \omega_{ex} = 1.0\frac{rad}{s}, T = 10s, dt = 0.01s, u(0) = u_0 = 2m, v(0) = v_0 = -0.4\frac{m}{s}.

Solving our primal problem with a Newmark solver, we get the following displacement of the Dof:

.

Note that our excitation frequency is smaller than the natural eigenfrequency of the system \omega_n = \sqrt\frac{k}{m} = \sqrt10. Analyzing the response of the SDOF system in the frequency domain, we get:

From the frequency response, we can deduct an expectation of the sensitivity of the spring-stiffness parameter k. Note that the relation between \omega_n and k is proportional to \sqrt{k}. Therefore, we can shift the resonance frequency of the system according to k. Since our excitation frequency is smaller than the natural eigenfrequency, we see that a shift of the resonance to the right would lead to a smaller response (equivalent to \omega_{ex} becoming smaller), This means that with an increase of k we expect a smaller response. With our choice of J, we expect the sensitivity of J with respect to k to be negative (\frac{dJ}{dk} < 0).

Solving the adjoint problem in MATLAB for the given parameters, we get the following sensitivities:

We notice that the sensitivity of the stiffness parameter k is positive, which is contradicting our assumption we made based on the frequency analysis. Looking at the displacement plot of the SDOF system on the other hand, we are able to explain this phenomenon: the response of the system is dominated by the initial conditions. Increasing k with fixed u(0) would lead to more strain energy in the spring in the first place (as E_{init} = 0.5*k*x^2(0)). If we run the simulation again with silent initial conditions, we get the following sensitivities:

Here we can see the expected value for the sensitivity \frac{dJ}{dk} = -0.969 < 0

Tower

The implemented adjoint sensitivity method is not limited to simple structures consisting of spring-damper- and concentrated-mass-elements. It can deal with any kind of element and with any amount of degree of freedoms. To show that it's working with more complex models, we build a two-dimensional tower of bar-elements with 22 degrees of freedom. The tower is fixed at the bottom and subjected to a horizontal force acting on the nodes at the top to invoke its first eigenmode.

 Not only is the number of Dofs not relevant for the sensitivity analysis, also the number of design parameters s_i is irrelevant. In this example, each of the 21 bar elements has three parameters: a Young's modulus (E), its cross-section (A) and the density of the material (\rho). In this example, we set them all to the same values:

E = 180 GPa, A = 0.01 m^2, \rho = 8000 \frac{kg}{m^3}

To prevent large shear deformations, we scaled the Young's modulus of the diagonal bar elements by a factor of 100. 

After solving the primal problem, we choose the same response function J = \int_0^T x^2(t)+v^2(t) dt to solve the adjoint problem and to calculate the sensitivities of our design parameters s_i. Even though the corresponding design parameters of the elements have the same value (except for the scaled Young's modulus of the diagonal elements), we expect them to have different sensitivities. After solving the adjoint problem for \Lambda once, we are able to get the sensitivity of all parameters by solving the respective integral.

Remember that we have to interpret the sensitivities with respect to our choice of the response function J. Since we chose the same function as in the Single Degree of Freedom example, a negative sensitivity of a design parameter with respect to J means a decrease of the oscillation and velocity value. In this example, we notice that our sensitivities scaled by the parameter value show a trend: while for elements at the bottom of the structure (element 2-6) most sensitivities of the cross section and density are negative, while for the elements at the top (element 17-21) are positive. This can be explained by trying to strengthen the structure at the bottom (increase A and \rho) and reduce the weight at the top (decrease A and \rho) to minimize the response of the structure due to the applied load.

To validate the sensitivities, we adjusted the parameters of the elements according to their sensitivity. Every parameter with a positive sensitivity was scaled by 0.9 and negative sensitivity by 1.1. We ran the primal problem again and compared the value of J for the initial run and the one with the adjusted design parameters and noticed a reduction of J by 14%. We expected a reduction of J as we chose to adjust the parameter in a way to decrease the response function J.

Tuned-Mass-Damper

In the final example we tested the sensitivity analysis on a tuned mass damper attached to a single degree of freedom system with parameters m = 10 kg, c = 2.0 \frac{Ns}{m} and k = 10 \frac{N}{m}. We chose the ratio of masses \mu = \frac{m_d}{m} = 0.1. In literature, there are different criteria to pick 'optimal' design parameters for the tuned mass damper to reduce the movement of the single degree of freedom oscillator [1]. Here we chose two criteria to compare: parameters following Den Hartog criteria and H2 optimization criteria.

Den Hartog: k_d = k * \frac{\mu}{(1+\mu)^2} = 0.8264 \frac{N}{m}, \\ c_d = \sqrt{k_d * m_d}*\sqrt\frac{3\mu}{(2*(1+\mu)} = 0.3357 \frac{Ns}{m}\\ H2: k_d = \frac{1}{(1+\mu)^2} * \frac{2+\mu}{\mu} * m_d = 17.3554 \frac{N}{m}, \\ c_d = \sqrt{k_d*m_d}*2*\sqrt\frac{\mu*(4+3\mu)}{8*(1+\mu)(2+\mu)} = 1.271 \frac{Ns}{m}
Frequency Analysis

We first perform a frequency analysis of the SDOF system and the two systems with the added tuned mass damper.

As expected, the SDOF system ('Normal') shows large resonance around the natural eigenfrequency of the system \omega_n = \sqrt\frac{k}{m} = 1 . The two systems with tuned mass damper should reduce the movement of the SDOF oscillator and therefore have a lower response to different excitation frequencies. For the Den Hartog parameters (red curve), we notice a significant drop around the natural eigenfrequency of the SDOF with two peaks shifted to lower and larger frequencies compared to the resonance case of the SDOF system. This behavior can be interpreted as a strong reduction of the movement for excitation frequencies close to the resonance case, but either no different or worse behavior in other frequency ranges. For the H2 optimized parameter values, we see a significant drop at a comparably larger frequency ( \omega = 4 ) and a slight decrease of the response over a broader frequency range.

With this knowledge, we set up two different cases for the excitation frequency \omega_{ex}: first an excitation with a single frequency  \omega_{ex} = 1.0 and therefore the natural eigenfrequency of the SDOF oscillator, and second an excitation with a frequency band containing three different frequencies \omega_{ex} = [0.75, 1.5, 2.0] to analyze the performance of the different system and compare the sensitivities of the parameters of the tuned mass damper.

As in the previous examples, we chose the response function J = \int_0^T x^2(t)+v^2(t) dt. But compared to the other examples, we are not interested in the movement of the mass (DoF) of the tuned mass damper and therefore only consider the values for the first mass of the single degree of freedom oscillator J = \int_0^T x_1^2(t) + v_1^2(t)dt.

Single Frequency Excitation

For the single frequency excitation we get the following displacement for the three different systems:

As we can see, the system with Den Hartog optimized parameters performs better (oscillates less) than the other two. This behavior is expected after looking at the frequency plot of the system and seeing a much lower value at the frequency of interest  \omega = 1.0. Comparing the value of the response function J, we see that it is significantly lower for the Den Hartog system than the other two (  J_{DH} = 4.66,  J_{H2} = 10.30 and J_{SDOF} = 11.60). We solve the adjoint problem of the two systems with tuned mass damper to get the sensitivities of the stiffness and the damping value to interpret the results and validate the sensitivity analysis. Note that we are not interested in the sensitivity of the mass of the attached tuned mass damper  m_d as a larger mass always leads to smaller movement of the SDOF oscillator and is therefore not optimizable but chosen in the problem settings.


J

c_d

k_d

\frac{dJ}{dc}

\frac{dJ}{dk}


Den Hartog4.660.340.834.96-5.29
H210.301.2717.36-0.020.01

To test the calculated sensitivities, we run the primal problem again with adjusted design parameters for the two different cases to compare a change in the respective response value. Since we are interested in reducing J (reduce oscillation of first mass), we follow the negative sensitivity of the parameters to expect an improvement:


J

c_d

k_d

\frac{dJ}{dc}

\frac{dJ}{dk}


Den Hartog4.660.340.834.96-5.29

increase k_d

4.340.340.95.98

-3.4

reduce c_d

4.120.30.96.26-3.81

J

c_d

k_d

\frac{dJ}{dc}

\frac{dJ}{dk}


H210.30161.2717.36-0.020.01

increase c_d

10.30111.317.36-0.020.01

reduce k_d ,

increase c_d

10.29531.417-0.020.01

As we can deduct from the tables, adjusting the parameters of the tuned mass damper according to their sensitivities, we are able to influence the movement of the first mass. This shows that the sensitivities calculated by the implemented adjoint method work. However, one can notice that they do not point at the same direction/  a global maximum for the two different cases of Den Hartog and H2 optimized parameters. This can be seen by looking at the damping value c for both systems (0.34 \frac{Ns}{m} & 1.27 \frac{Ns}{m}) and their respective sensitivities. The sensitivities indicate that in the first case, a decrease of  c_d leads to a decrease of J ( \frac{dJ}{dc} > 0 ), whereas in the latter case an increase of c_d leads to the decrease. This shows that the sensitivities do not point at a 'best' value for c_d in between but they point in different directions/ local minima.

Multiple Excitation Frequencies

For multiple excitation frequencies, namely \omega_{ex} = [0.75, 1.5, 2.0], we get the following displacement plot for the three systems:

We notice that it's hard to determine the least oscillating system by observing the plot, as the response of the three systems is pretty similar. Comparing the value of the response function gives us a value to quantify the performance, but also indicates similar behavior, as the value for the three systems are pretty close together (J_{SDOF} = 4.6J_{DH} = 4.67 and J_{H2} = 5.32 ). According to the value of the response function, the SDOF system actually performs better than the systems with tuned mass damper.

In the same way as for the single frequency excitation, we now focus on the two systems with a tuned mass damper to check their sensitivities and validate them.


J

c_d

k_d

\frac{dJ}{dc}

\frac{dJ}{dk}


Den Hartog4.66560.340.830.01153.2197

decrease c_d

4.66640.30.83-0.05933.5786

increase k_d

4.92370.30.9-0.79823.3769

decrease k_d

4.2280.30.71.30493.1722

We notice that by decreasing  c_d in the first altering simulation, J increases instead of decreasing even though we followed the negative sensitivity (expect a smaller J). This can be explained by looking at the sensitivity \frac{dJ}{dc}. In our original setup with parameter values according to Den Hartog, the sensitivity \frac{dJ}{dc} > 0, but when adjusted the sensitivity flips its sign and becomes negative. Since the performance of the system is linked to both parameters -  c_d and k_d - we can explain the worse behavior of the adjusted system by the dependence between c_d and k_d. By decreasing c_d and keeping k_d constant, we crossed the point, where decreasing the damping constant has a reducing factor on the sensitivity and went too far, which led to an increase of the response. It can also be seen, that for our second trial, we followed the positive sensitivity of the stiffness parameter and increased k_d. This led to an increase of J, which is the behavior we expected based on the positive sensitivity \frac{dJ}{dk} > 0.


J

c_d

k_d

\frac{dJ}{dc}

\frac{dJ}{dk}


H25.32111.2717.36-0.00250.0006

increase c_d

5.32081.417.36-0.00240.0006

decrease k_d

5.32061.417-0.00250.0006

decrease k_d

5.32021.416.5-0.00260.0007

For the H2 optimized parameters we show that the system behaves as expected, but changing the parameter values only has a little effect on the response of the system. This can also be seen by the value of the sensitivities, which are very close to 0.

How to Use the Implementation (User's Guide)

Assuming that user knows, how to set up a model and solve the primal problem in bm_mfem - namely creating/importing a model, defining the simulation time T and the time step dt (also in the model by model.setDt(dt)/.setEndTime(T)!), selecting a solver and solving the problem - the first step is to choose a response function J. As part of this project, we implemented two different response functions: the one we used in the examples J = \int_0^T x^2(t)+v^2(t)dt as well as the energy dissipation of the system J = \int_0^T - v^T(t)*C*v(t) dt. Note that interpreting the sensitivities \frac{dJ}{ds_i} depends on the choice of the respected response function J.

In bm_mfem, user can simply create an instance of either response function by calling the respective constructor and giving the model as input variable:

User can get the actual value of J by simply calling the member function 'getValue()' of the instances (i.e. response.getValue()), but that is not necessary for the sensitivity calculation.

After choosing a response function and creating an instance of it, we are ready to solve the adjoint problem. To solve the adjoint problem, we create an instance of a Newmark solver especially implemented to solve for \Lambda. This can be done by simply calling the constructor of 'NewmarkSolvingStrategyAdjointProblem' and giving the defined model and the instance of the response as input variables:

Since we set dt = d\tau, meaning that we do the same time step to solve the adjoint problem as for solving the primal problem, we have to create a loop running through the steps (starting at 2 until counter = steps + 1, steps = endTime/dt). In the loop, we simply call the member function 'solve(counter)' and increase our counter by 1:

After solving the adjoint problem, we can create an instance of the 'Sensitivity' class with our model and response function as input parameters.

The sensitivity class has two callable functions: first we can either call 'getSensitivity(element, parameter)' with a specific element and a parameter name as parameters (i.e. sensitivity.getSensitivity(springElement,"ELEMENTAL_STIFFNESS")). This function will return the sensitivity of the respective parameter with respect to our response function J. 

The second member function 'getAllSensitivities()' calculates the sensitivity of all elements and all respective parameters. It returns an array containing the element id, the parameter name and the value of the sensitivity. With the for loop, user is able to display the sensitivities in the command line.

References

[1] Asami, T., Nishihara, O., and Baz, A. M. (March 26, 2002). "Analytical Solutions to H∞ and H2 Optimization of Dynamic Vibration Absorbers Attached to Damped Linear Systems ." ASME. J. Vib. Acoust. April 2002; 124(2): 284–295. https://doi.org/10.1115/1.1456458

[2] Emma Smith Zbarsky (2023). Mass-Spring-Damper Systems (https://github.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/releases/tag/v1.0.1), GitHub. Retrieved February 9, 2023.

[3] Fernandez, F., & Tortorelli, D. A. (2018). Semi-analytical sensitivity analysis for nonlinear transient problems. Structural and Multidisciplinary Optimization, 58(6), 2387-2410.

Appendix

Derivation of the adjoint problem

The equation of motion R is differentiated with respect to s_i.

\frac{\partial{R}}{\partial{s_i}} = \frac{\partial{R}}{\partial{\ddot{u}}} \frac{\partial{\ddot{u}} }{\partial{s_i}} + \frac{\partial{R}}{\partial{\dot{u}}} \frac{\partial{\dot{u}} }{\partial{s_i}} + \frac{\partial{R}}{\partial{u}} \frac{\partial {u}}{\partial{s_i}} = 0

where

\frac{\partial{R}}{\partial{\ddot{u}}} = M, \frac{\partial{R}}{\partial{\dot{u}}} = C, \frac{\partial{R}}{\partial{u}} = K

Multiply \frac{dR}{ds_i} with Lagrange parameters \lambda and add to the sensitivity, results in:

\frac{d{J}}{d{s_i}} = \frac{d{J}}{d{s_i}} + \int_0^T{\lambda}^T \cdot \frac{dR}{ds_i}dt

Substituting \frac{dR}{ds_i} into \frac{dJ}{ds_i} and reformulate:

\frac{dJ}{ds_i} = \int_0^T\left ( (\frac{\partial{j}}{\partial{s_i}} + \lambda^T\frac{\partial{R}}{\partial{s_i}}) + ((\lambda^TK + \frac{\partial{j}}{\partial{u}}) \frac{du}{ds_i} + (\lambda^TC + \frac{\partial{j}}{\partial{\dot{u}}})\frac{d{\dot{u}}}{ds_i} + \lambda^TM\frac{d{\ddot{u}}}{ds_i})\right )dt

where \lambda is the arbitrary adjoint vector. Integrating by parts to eliminate the high derivatives :

\int_0^T(\lambda^TC + \frac{\partial j}{\partial{\dot{u}}})\frac{d{\dot{u}}}{ds_i}}dt = \left [(\lambda^TC + \frac{\partial{j}}{\partial{s_i}})\frac{du}{ds_i} \right ]_0^T - \int_0^T(\dot{\lambda}^TC + \frac{d}{dt}\frac{\partial j}{\partial{\dot{u}}})\frac{du}{ds_i}dt \\ \int_0^T\lambda^TM\frac{d\ddot{u}}{ds_i}dt = \left [ \lambda^TM\frac{d\dot{u}}{ds_i} \right ]_0^T - \left [ \dot{\lambda}^TM\frac{du}{ds_i} \right ]_0^T + \int_0^T \frac{d}{dt}\dot{\lambda}^TM\frac{du}{ds_i}dt

Rearranging the equation, we get:

\frac{dJ}{ds_i} = \int_0^T\left ( \frac{\partial{j}}{\partial{s_i}} + \lambda^T\frac{\partial{R}}{\partial{s_i}} \right )dt + \left [(\lambda^TC + \frac{\partial{j}}{\partial{s_i}})\frac{du}{ds_i} \right ]_0^T + \left [ \lambda^TM\frac{d\dot{u}}{ds_i} \right ]_0^T - \left [\dot{\lambda}^TM\frac{du}{ds_i} \right ]_0^T \\ { } + \int_0^T \left (\frac{d}{dt}\dot{\lambda}^TM - \dot{\lambda}^TC + \lambda^TK + \frac{\partial{j}}{\partial{u}} - \frac{d}{dt}\frac{\partial j}{\partial{\dot{u}}} \right )\frac{du}{ds_i}dt \\
\frac{dJ}{ds_i} = \int_0^T\left ( \frac{\partial{j}}{\partial{s_i}} + \lambda^T\frac{\partial{R}}{\partial{s_i}} \right )dt - \left [(\lambda^TC + \frac{\partial{j}}{\partial{s_i}} - \dot{\lambda}^TM)\frac{du}{ds_i}\right]_{t=0} - \left[\lambda^TM\frac{d\dot{u}}{ds_i}\right]_{t=0} \\ { }+ \int_0^T \left (\frac{d}{dt}\dot{\lambda}^TM - \dot{\lambda}^TC + \lambda^TK + \frac{\partial{j}}{\partial{u}} - \frac{d}{dt}\frac{\partial j}{\partial{\dot{u}}} \right )\frac{du}{ds_i}dt + \left [(\lambda^TC + \frac{\partial{j}}{\partial{s_i}} - \dot{\lambda}^TM)\frac{du}{ds_i} \right ]_{t=T} + \left [ \lambda^TM\frac{d\dot{u}}{ds_i} \right ]_{t=T}

Assuming the initial conditions are independent of si → \frac{du}{ds_i}|_{t=0} = 0, \frac{d\dot{u}}{ds_i}|_{t=0} = 0 and setting \ddot{\lambda}^TM - \dot{\lambda}^TC + \lambda^TK + \frac{\partial{j}}{\partial{u}} - \frac{d}{dt}\frac{\partial j}{\partial{\dot{u}}} = 0 to get rid of \frac{du}{ds_i}, we obtain a system of a second-order differential equation with two conditions:

M^T\ddot\lambda - C^T\dot{\lambda} + K^T\lambda = - \left (\frac{\partial j}{\partial u} \right)^T + \dot{u}^T + \left ( \frac{\partial^2{j}}{\partial u \partial{\dot{u}}} \right) ^T + \ddot{u}^T \left (\frac{\partial^2 j}{\partial{\dot{u^2}}} \right )^T \\ \lambda(T) = 0 \\ M^T\dot{\lambda}(T) = -\left (\frac{\partial j}{\partial \dot{u}} \right)_{t=T}

Since the conditions are given at time t = T instead of t = 0, we need to solve the equation backwards in time. Therefore, we introduce the substitution:

\tau = T - t \\ \lambda(t) = \Lambda(T-t) = \Lambda(\tau), \dot{\lambda}(t) = - \dot{\Lambda}(\tau), \ddot\lambda(t) = \ddot\Lambda(\tau)

Thus, the adjoint problem reads:

M^T\ddot\Lambda + C^T\dot{\Lambda} + K^T\Lambda = - \left (\frac{\partial j}{\partial u} \right)^T + \dot{u}^T + \left ( \frac{\partial^2{j}}{\partial u \partial{\dot{u}}} \right) ^T + \ddot{u}^T \left (\frac{\partial^2 j}{\partial{\dot{u^2}}} \right )^T \\ \Lambda(0) = 0 \\ M^T\dot{\Lambda}(0) = -\left (\frac{\partial j}{\partial \dot{u}} \right)_{t=T}

Sensitivity analysis methods

Finite Difference method

The forward finite difference method approximates the derivatives of the response function J  using Taylor series expansion:

\frac{dJ}{ds_i} \approx \frac{J(u(s + \in e_i), \dot{u}(s + \in e_i), s + \in e_i, t) - J(s, u, \dot{u})}{\in}

where e_i = [0,0,...,1,...,0,0]^T is the unit vector of component i, and \in is the perturbation. 

The finite difference method has the advantages of easy implementation and good order of convergence. However, as seen above, it is necessary to compute J(u + \in e_i)for each design variable s_i by modifying the finite element model, and so makes the whole process very computationally costly [3].

Direct differentiation method

Recalling the equation of motion 𝑹(𝒔, 𝒖, 𝒖 ̇, 𝒖 ̈,𝑡)=𝑴(𝒔) 𝒖 ̈+𝑪(𝒔) 𝒖 ̇+𝑲(𝒔)𝒖−𝑭(𝒕) \equiv 0

Differentiate both sides of R with respect to s_i, we have:

\frac{\partial{R}}{\partial{s_i}} = M \frac{\partial{\ddot{u}} }{\partial{s_i}} + C \frac{\partial{\dot{u}} }{\partial{s_i}} + K \frac{\partial {u}}{\partial{s_i}} \\ \frac{\partial u(0)}{\partial s_{i}} = \frac{\partial {u^0}}{\partial s_{i}} \\ \frac{\partial \dot{u}(0)}{\partial s_{i}} = \frac{\partial \dot{u}^{0}}{\partial s_{i}}

With the direct solver used for the primal problem above, \frac{\partial{\ddot{u}} }{\partial{s_i}}, \frac{\partial{\dot{u}} }{\partial{s_i}}, \frac{\partial {u}}{\partial{s_i}} can be obtained. Then, we plug these implicit derivatives into the equation of \frac{dJ}{ds_i} to evaluate the sensitivity.

Clearly, this method is computationally inefficient especially for a large amount of design variables, as it solves for the implicit derivatives using \frac{dR}{ds_i} for each s_i regardless of the number of design parameters. On the other hand, this method provides numerically exact sensitivities [3].

  • Keine Stichwörter