{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Multiple sensors and correlations\n", "## Imports" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "# Problem definition\n", "from probeye.definition.inverse_problem import InverseProblem\n", "from probeye.definition.forward_model import ForwardModelBase\n", "from probeye.definition.distribution import Normal\n", "from probeye.definition.sensor import Sensor\n", "from probeye.definition.likelihood_model import GaussianLikelihoodModel\n", "from probeye.definition.correlation_model import ExpModel\n", "\n", "# Inference\n", "from probeye.inference.emcee.solver import EmceeSolver\n", "\n", "# Postprocessing\n", "from probeye.postprocessing.sampling_plots import create_posterior_plot" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Problem setup" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Fixed parameters\n", "I = 1e9 # mm^4\n", "L = 10_000 # mm\n", "Q = 100 # kN\n", "\n", "# Measurements\n", "x_sensors = [2500, 5000] # mm (always from lower to higher, bug in inv_cov_vec_1D in tripy)\n", "d_sensors = [35, 50] # mm\n", "sigma_model = 10 # mm\n", "pearson = 0.5\n", "l_corr = ... # mm (calculate using an exponential correlation function)\n", "\n", "# Prior\n", "E_mean = 60 # GPa\n", "E_std = 20 # GPa" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Define forward model" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def beam_deflection(E, x): # x is sensor position\n", " return Q * x * (3 * L ** 2 - 4 * x ** 2) / (48 * E * I)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "class BeamModel(ForwardModelBase):\n", " def interface(self):\n", " self.parameters = ...\n", " self.input_sensors = ...\n", " self.output_sensors = ...\n", "\n", " def response(self, inp: dict) -> dict:\n", " E = ...\n", " x = ...\n", " return {...}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Define inverse problem" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Instantiate the inverse problem\n", "problem = InverseProblem(...)\n", "\n", "# Add latent parameters\n", "problem.add_parameter(...)\n", "\n", "# Add fixed parameters\n", "problem.add_parameter(...)\n", "problem.add_parameter(...) # Correlation length parameter\n", "\n", "# Add measurement data\n", "problem.add_experiment(...)\n", " \n", "# Add forward model\n", "problem.add_forward_model(...)\n", "\n", "# Add likelihood model\n", "likelihood_model = GaussianLikelihoodModel(...) # Include correlation model\n", "problem.add_likelihood_model(likelihood_model)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solve with MCMC" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "emcee_solver = EmceeSolver(problem, show_progress=True)\n", "inference_data = emcee_solver.run(n_steps=2000, n_initial_steps=2000)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plot" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "post_plot_array = create_posterior_plot(\n", " inference_data,\n", " emcee_solver.problem,\n", " kind=\"kde\",\n", " title=\"Kernel density estimate of the posterior distribution\",\n", ")" ] } ], "metadata": { "kernelspec": { "display_name": "venv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.5" } }, "nbformat": 4, "nbformat_minor": 2 }