Hybrid reliability methods#

In this example, we demonstrate the usage of the so-called hybrid reliability methods:

  • FDIR (form_then_directional_sampling) - reliability calculations are first performed using FORM. If FORM does not converge, the calculations are completed using Directional Sampling.

  • DSFI (directional_sampling_then_form) - reliability calculations are initially performed with Directional Sampling, after which FORM is used to re-calculate the design point.

Define model#

First, let’s import the necessary classes:

[10]:
from probabilistic_library import ReliabilityMethod, ReliabilityProject, DistributionType

Next, we define a simple limit state function:

\(Z = 1.9 - (a+b)\)

[11]:
from utils.models import linear_a_b

Define reliability project#

We define the reliability project and the random variables \(a\) and \(b\):

[12]:
project = ReliabilityProject()
project.model = linear_a_b

project.variables["a"].distribution = DistributionType.uniform
project.variables["a"].minimum = -1
project.variables["a"].maximum = 1

project.variables["b"].distribution = DistributionType.uniform
project.variables["b"].minimum = -1
project.variables["b"].maximum = 1

Run calculations with FORM#

We begin by running form calculations and consider two cases: one with convergence and one without.

With convergence#

[13]:
project.settings.reliability_method = ReliabilityMethod.form
project.settings.relaxation_factor = 0.15
project.settings.maximum_iterations = 50
project.settings.epsilon_beta = 0.01

project.run()

project.design_point.print()
Reliability (FORM)
 Reliability index = 2.773
 Probability of failure = 0.002778
 Convergence = 0.008383 (converged)
 Model runs = 126
Alpha values:
 a: alpha = -0.7071, x = 0.9501
 b: alpha = -0.7071, x = 0.9501

Without convergence#

By reducing the maximum number of iterations, we create a case where form does not converge:

[14]:
project.settings.reliability_method = ReliabilityMethod.form
project.settings.relaxation_factor = 0.15
project.settings.maximum_iterations = 10
project.settings.epsilon_beta = 0.01

project.run()

project.design_point.print()
Reliability (FORM)
 Reliability index = 2.348
 Probability of failure = 0.009427
 Convergence = 1.224 (not converged)
 Model runs = 30
Alpha values:
 a: alpha = -0.7071, x = 0.9032
 b: alpha = -0.7071, x = 0.9032

Calculations with Directional Sampling#

We also run the reliability calculations with directional_sampling:

[15]:
project.settings.reliability_method = ReliabilityMethod.directional_sampling
project.settings.variation_coefficient = 0.02
project.settings.minimum_directions = 10000
project.settings.maximum_directions = 50000

project.run()

project.design_point.print()
Reliability (Directional Sampling)
 Reliability index = 3.018
 Probability of failure = 0.001273
 Convergence = 0.02 (converged)
 Model runs = 109683
Alpha values:
 a: alpha = -0.7065, x = 0.967
 b: alpha = -0.7077, x = 0.9673

Run calculations with FDIR#

We now perform calculations using form_then_directional_sampling.

If form converges, the results should match the form results.

[16]:
project.settings.reliability_method = ReliabilityMethod.form_then_directional_sampling
project.settings.relaxation_factor = 0.15
project.settings.maximum_iterations = 50
project.settings.epsilon_beta = 0.01
project.settings.variation_coefficient = 0.02
project.settings.minimum_directions = 10000
project.settings.maximum_directions = 20000

project.run()

project.design_point.print()
Reliability (FORM)
 Reliability index = 2.773
 Probability of failure = 0.002778
 Convergence = 0.008383 (converged)
 Model runs = 126
Alpha values:
 a: alpha = -0.7071, x = 0.9501
 b: alpha = -0.7071, x = 0.9501

When form does not converge, the results should match those of directional_sampling:

[17]:
project.settings.reliability_method = ReliabilityMethod.form_then_directional_sampling
project.settings.relaxation_factor = 0.15
project.settings.maximum_iterations = 10
project.settings.epsilon_beta = 0.01
project.settings.variation_coefficient = 0.02
project.settings.minimum_directions = 10000
project.settings.maximum_directions = 50000

project.run()

project.design_point.print()
Reliability (Directional Sampling)
 Reliability index = 3.018
 Probability of failure = 0.001273
 Convergence = 0.02 (converged)
 Model runs = 109683
Alpha values:
 a: alpha = -0.7065, x = 0.967
 b: alpha = -0.7077, x = 0.9673

Contributing design points:
  Reliability (FORM)
   Reliability index = 2.348
   Probability of failure = 0.009427
   Convergence = 1.224 (not converged)
   Model runs = 30
  Alpha values:
   a: alpha = -0.7071, x = 0.9032
   b: alpha = -0.7071, x = 0.9032

Calculations with DSFI#

We now perform reliability calculations using directional_sampling_then_form. The resulting reliability index (beta) must match the reliability index calculated with directional_sampling. However, the design point is re-calculated using form and, therefore, differs from the one obtained with directional_sampling.

[18]:
project.settings.reliability_method = ReliabilityMethod.directional_sampling_then_form
project.settings.relaxation_factor = 0.15
project.settings.maximum_iterations = 50
project.settings.epsilon_beta = 0.01
project.settings.variation_coefficient = 0.02
project.settings.minimum_directions = 10000
project.settings.maximum_directions = 50000

project.run()

project.design_point.print()
project.design_point.plot_alphas()

Reliability (Dir. Sampling then FORM)
 Reliability index = 3.018
 Probability of failure = 0.001273
 Model runs = 0
Alpha values:
 a: alpha = -0.7071, x = 0.9499
 b: alpha = -0.7071, x = 0.9499

Contributing design points:
  Reliability (Directional Sampling)
   Reliability index = 3.018
   Probability of failure = 0.001273
   Convergence = 0.02 (converged)
   Model runs = 109683
  Alpha values:
   a: alpha = -0.7065, x = 0.967
   b: alpha = -0.7077, x = 0.9673

  Reliability (FORM)
   Reliability index = 2.771
   Probability of failure = 0.002798
   Convergence = 0.009011 (converged)
   Model runs = 54
  Alpha values:
   a: alpha = -0.7071, x = 0.9499
   b: alpha = -0.7071, x = 0.9499

../_images/_examples_hybrid_reliability_methods_18_1.png