.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "content/examples/10-pgi/plot_inv_1_PGI_Linear_1D_joint_WithRelationships.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code. .. rst-class:: sphx-glr-example-title .. _sphx_glr_content_examples_10-pgi_plot_inv_1_PGI_Linear_1D_joint_WithRelationships.py: Petrophysically guided inversion: Joint linear example with nonlinear relationships =================================================================================== We do a comparison between the classic least-squares inversion and our formulation of a petrophysically guided inversion. We explore it through coupling two linear problems whose respective physical properties are linked by polynomial relationships that change between rock units. .. GENERATED FROM PYTHON SOURCE LINES 11-432 .. image-sg:: /content/examples/10-pgi/images/sphx_glr_plot_inv_1_PGI_Linear_1D_joint_WithRelationships_001.png :alt: Problem 1, Problem 2, Petrophysical Distribution, Problem 1, Problem 2, Petrophysical Distribution, Problem 1, Problem 2, Petro Distribution :srcset: /content/examples/10-pgi/images/sphx_glr_plot_inv_1_PGI_Linear_1D_joint_WithRelationships_001.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none Running inversion with SimPEG v0.22.0 simpeg.InvProblem will set Regularization.reference_model to m0. simpeg.InvProblem will set Regularization.reference_model to m0. simpeg.InvProblem will set Regularization.reference_model to m0. simpeg.InvProblem is setting bfgsH0 to the inverse of the eval2Deriv. ***Done using the default solver Pardiso and no solver_opts.*** Alpha scales: [3.5111974374988844, 0.0, 3.4802923651593253e-06, 0.0] Calculating the scaling parameter. Scale Multipliers: [0.09429751 0.90570249] Initial data misfit scales: [0.09429751 0.90570249] model has any nan: 0 =============================== Projected GNCG =============================== # beta phi_d phi_m f |proj(x-g)-x| LS Comment ----------------------------------------------------------------------------- x0 has any nan: 0 0 1.91e+01 3.00e+05 0.00e+00 3.00e+05 1.41e+02 0 geophys. misfits: 1079.1 (target 30.0 [False]); 83.7 (target 30.0 [False]) | smallness misfit: 2929.7 (target: 200.0 [False]) Beta cooling evaluation: progress: [1079.1 83.7]; minimum progress targets: [240000. 240000.] 1 1.91e+01 1.78e+02 4.14e+01 9.69e+02 8.21e+01 0 geophys. misfits: 482.7 (target 30.0 [False]); 28.2 (target 30.0 [True]) | smallness misfit: 1350.3 (target: 200.0 [False]) Beta cooling evaluation: progress: [482.7 28.2]; minimum progress targets: [863.3 67. ] Updating scaling for data misfits by 1.0620202907137457 New scales: [0.09956358 0.90043642] 2 1.91e+01 7.35e+01 4.04e+01 8.45e+02 3.73e+01 0 Skip BFGS geophys. misfits: 439.6 (target 30.0 [False]); 28.1 (target 30.0 [True]) | smallness misfit: 1319.9 (target: 200.0 [False]) Beta cooling evaluation: progress: [439.6 28.1]; minimum progress targets: [386.2 30. ] Decreasing beta to counter data misfit decrase plateau. Updating scaling for data misfits by 1.0663187291080125 New scales: [0.1054701 0.8945299] 3 9.56e+00 7.15e+01 4.06e+01 4.59e+02 8.41e+01 0 Skip BFGS geophys. misfits: 148.9 (target 30.0 [False]); 22.7 (target 30.0 [True]) | smallness misfit: 1358.0 (target: 200.0 [False]) Beta cooling evaluation: progress: [148.9 22.7]; minimum progress targets: [351.7 30. ] Updating scaling for data misfits by 1.3196861608421822 New scales: [0.13464748 0.86535252] 4 9.56e+00 3.97e+01 4.30e+01 4.51e+02 5.69e+01 0 geophys. misfits: 118.6 (target 30.0 [False]); 23.5 (target 30.0 [True]) | smallness misfit: 1290.0 (target: 200.0 [False]) Beta cooling evaluation: progress: [118.6 23.5]; minimum progress targets: [119.1 30. ] Updating scaling for data misfits by 1.2791257490712276 New scales: [0.16599247 0.83400753] 5 9.56e+00 3.92e+01 4.33e+01 4.53e+02 6.36e+01 0 Skip BFGS geophys. misfits: 81.1 (target 30.0 [False]); 23.1 (target 30.0 [True]) | smallness misfit: 1275.2 (target: 200.0 [False]) Beta cooling evaluation: progress: [81.1 23.1]; minimum progress targets: [94.9 30. ] Updating scaling for data misfits by 1.298685061013985 New scales: [0.20538886 0.79461114] 6 9.56e+00 3.50e+01 4.39e+01 4.55e+02 5.61e+01 0 geophys. misfits: 63.3 (target 30.0 [False]); 23.2 (target 30.0 [True]) | smallness misfit: 1244.0 (target: 200.0 [False]) Beta cooling evaluation: progress: [63.3 23.2]; minimum progress targets: [64.9 30. ] Updating scaling for data misfits by 1.2926615014373246 New scales: [0.25044422 0.74955578] 7 9.56e+00 3.33e+01 4.42e+01 4.56e+02 5.75e+01 0 Skip BFGS geophys. misfits: 53.0 (target 30.0 [False]); 23.7 (target 30.0 [True]) | smallness misfit: 1219.0 (target: 200.0 [False]) Beta cooling evaluation: progress: [53. 23.7]; minimum progress targets: [50.6 30. ] Decreasing beta to counter data misfit decrase plateau. Updating scaling for data misfits by 1.263540875307549 New scales: [0.2968535 0.7031465] 8 4.78e+00 3.24e+01 4.44e+01 2.45e+02 7.61e+01 0 geophys. misfits: 28.9 (target 30.0 [True]); 20.9 (target 30.0 [True]) | smallness misfit: 1315.2 (target: 200.0 [False]) Beta cooling evaluation: progress: [28.9 20.9]; minimum progress targets: [42.4 30. ] Warming alpha_pgi to favor clustering: 1.2344826360406898 9 4.78e+00 2.33e+01 4.63e+01 2.45e+02 7.09e+01 0 geophys. misfits: 28.2 (target 30.0 [True]); 21.4 (target 30.0 [True]) | smallness misfit: 1242.5 (target: 200.0 [False]) Beta cooling evaluation: progress: [28.2 21.4]; minimum progress targets: [30. 30.] Warming alpha_pgi to favor clustering: 1.5218665825639803 10 4.78e+00 2.34e+01 4.69e+01 2.48e+02 6.06e+01 0 geophys. misfits: 26.3 (target 30.0 [True]); 21.9 (target 30.0 [True]) | smallness misfit: 1152.8 (target: 200.0 [False]) Beta cooling evaluation: progress: [26.3 21.9]; minimum progress targets: [30. 30.] Warming alpha_pgi to favor clustering: 1.908281988237571 11 4.78e+00 2.32e+01 4.78e+01 2.52e+02 4.72e+01 0 geophys. misfits: 25.4 (target 30.0 [True]); 22.5 (target 30.0 [True]) | smallness misfit: 1073.2 (target: 200.0 [False]) Beta cooling evaluation: progress: [25.4 22.5]; minimum progress targets: [30. 30.] Warming alpha_pgi to favor clustering: 2.400424867767163 12 4.78e+00 2.33e+01 4.89e+01 2.57e+02 3.17e+01 0 geophys. misfits: 24.9 (target 30.0 [True]); 23.2 (target 30.0 [True]) | smallness misfit: 987.5 (target: 200.0 [False]) Beta cooling evaluation: progress: [24.9 23.2]; minimum progress targets: [30. 30.] Warming alpha_pgi to favor clustering: 2.9976387400152387 13 4.78e+00 2.37e+01 5.00e+01 2.63e+02 5.81e+01 0 geophys. misfits: 24.5 (target 30.0 [True]); 24.1 (target 30.0 [True]) | smallness misfit: 912.7 (target: 200.0 [False]) Beta cooling evaluation: progress: [24.5 24.1]; minimum progress targets: [30. 30.] Warming alpha_pgi to favor clustering: 3.6965455513930157 14 4.78e+00 2.42e+01 5.12e+01 2.69e+02 6.56e+01 0 geophys. misfits: 24.9 (target 30.0 [True]); 25.1 (target 30.0 [True]) | smallness misfit: 838.2 (target: 200.0 [False]) Beta cooling evaluation: progress: [24.9 25.1]; minimum progress targets: [30. 30.] Warming alpha_pgi to favor clustering: 4.4339769943829594 15 4.78e+00 2.50e+01 5.23e+01 2.75e+02 7.87e+01 0 geophys. misfits: 24.5 (target 30.0 [True]); 25.7 (target 30.0 [True]) | smallness misfit: 782.3 (target: 200.0 [False]) Beta cooling evaluation: progress: [24.5 25.7]; minimum progress targets: [30. 30.] Warming alpha_pgi to favor clustering: 5.305715646440647 16 4.78e+00 2.53e+01 5.37e+01 2.82e+02 7.23e+01 0 geophys. misfits: 24.8 (target 30.0 [True]); 26.8 (target 30.0 [True]) | smallness misfit: 702.0 (target: 200.0 [False]) Beta cooling evaluation: progress: [24.8 26.8]; minimum progress targets: [30. 30.] Warming alpha_pgi to favor clustering: 6.174049240549029 17 4.78e+00 2.62e+01 5.47e+01 2.87e+02 7.78e+01 0 geophys. misfits: 25.0 (target 30.0 [True]); 27.5 (target 30.0 [True]) | smallness misfit: 651.7 (target: 200.0 [False]) Beta cooling evaluation: progress: [25. 27.5]; minimum progress targets: [30. 30.] Warming alpha_pgi to favor clustering: 7.077074939554095 18 4.78e+00 2.67e+01 5.58e+01 2.93e+02 5.73e+01 0 Skip BFGS geophys. misfits: 25.4 (target 30.0 [True]); 28.2 (target 30.0 [True]) | smallness misfit: 607.5 (target: 200.0 [False]) Beta cooling evaluation: progress: [25.4 28.2]; minimum progress targets: [30. 30.] Warming alpha_pgi to favor clustering: 7.954968826192312 19 4.78e+00 2.73e+01 5.68e+01 2.99e+02 6.48e+01 0 Skip BFGS geophys. misfits: 25.6 (target 30.0 [True]); 28.8 (target 30.0 [True]) | smallness misfit: 569.9 (target: 200.0 [False]) Beta cooling evaluation: progress: [25.6 28.8]; minimum progress targets: [30. 30.] Warming alpha_pgi to favor clustering: 8.798348914444245 20 4.78e+00 2.79e+01 5.77e+01 3.03e+02 6.53e+01 0 Skip BFGS geophys. misfits: 26.2 (target 30.0 [True]); 29.4 (target 30.0 [True]) | smallness misfit: 538.3 (target: 200.0 [False]) Beta cooling evaluation: progress: [26.2 29.4]; minimum progress targets: [30. 30.] Warming alpha_pgi to favor clustering: 9.533408118000374 21 4.78e+00 2.84e+01 5.84e+01 3.07e+02 7.85e+01 0 Skip BFGS geophys. misfits: 26.4 (target 30.0 [True]); 30.1 (target 30.0 [False]) | smallness misfit: 515.1 (target: 200.0 [False]) Beta cooling evaluation: progress: [26.4 30.1]; minimum progress targets: [30. 30.] Decreasing beta to counter data misfit increase. Updating scaling for data misfits by 1.1375763963523058 New scales: [0.27066988 0.72933012] 22 2.39e+00 2.91e+01 5.82e+01 1.68e+02 8.85e+01 0 geophys. misfits: 23.7 (target 30.0 [True]); 24.9 (target 30.0 [True]) | smallness misfit: 564.8 (target: 200.0 [False]) Beta cooling evaluation: progress: [23.7 24.9]; minimum progress targets: [30. 30.] Warming alpha_pgi to favor clustering: 11.784831908155274 23 2.39e+00 2.46e+01 6.23e+01 1.73e+02 8.44e+01 0 geophys. misfits: 23.1 (target 30.0 [True]); 24.3 (target 30.0 [True]) | smallness misfit: 518.2 (target: 200.0 [False]) Beta cooling evaluation: progress: [23.1 24.3]; minimum progress targets: [30. 30.] Warming alpha_pgi to favor clustering: 14.931368471700454 24 2.39e+00 2.40e+01 6.58e+01 1.81e+02 9.30e+01 0 geophys. misfits: 21.8 (target 30.0 [True]); 23.9 (target 30.0 [True]) | smallness misfit: 491.9 (target: 200.0 [False]) Beta cooling evaluation: progress: [21.8 23.9]; minimum progress targets: [30. 30.] Warming alpha_pgi to favor clustering: 19.650374200956737 25 2.39e+00 2.33e+01 7.09e+01 1.93e+02 1.02e+02 0 geophys. misfits: 21.8 (target 30.0 [True]); 22.7 (target 30.0 [True]) | smallness misfit: 443.6 (target: 200.0 [False]) Beta cooling evaluation: progress: [21.8 22.7]; minimum progress targets: [30. 30.] Warming alpha_pgi to favor clustering: 26.510066720861296 26 2.39e+00 2.25e+01 7.74e+01 2.08e+02 1.03e+02 0 geophys. misfits: 21.3 (target 30.0 [True]); 22.4 (target 30.0 [True]) | smallness misfit: 415.8 (target: 200.0 [False]) Beta cooling evaluation: progress: [21.3 22.4]; minimum progress targets: [30. 30.] Warming alpha_pgi to favor clustering: 36.37715172737612 27 2.39e+00 2.21e+01 8.60e+01 2.28e+02 1.13e+02 0 geophys. misfits: 23.2 (target 30.0 [True]); 22.3 (target 30.0 [True]) | smallness misfit: 360.4 (target: 200.0 [False]) Beta cooling evaluation: progress: [23.2 22.3]; minimum progress targets: [30. 30.] Warming alpha_pgi to favor clustering: 48.00309361234333 28 2.39e+00 2.25e+01 9.42e+01 2.47e+02 1.14e+02 0 geophys. misfits: 22.5 (target 30.0 [True]); 22.6 (target 30.0 [True]) | smallness misfit: 351.5 (target: 200.0 [False]) Beta cooling evaluation: progress: [22.5 22.6]; minimum progress targets: [30. 30.] Warming alpha_pgi to favor clustering: 63.879518397111084 29 2.39e+00 2.26e+01 1.05e+02 2.74e+02 1.19e+02 0 geophys. misfits: 27.4 (target 30.0 [True]); 22.3 (target 30.0 [True]) | smallness misfit: 306.3 (target: 200.0 [False]) Beta cooling evaluation: progress: [27.4 22.3]; minimum progress targets: [30. 30.] Warming alpha_pgi to favor clustering: 78.02898057143261 30 2.39e+00 2.36e+01 1.12e+02 2.92e+02 1.27e+02 0 geophys. misfits: 24.6 (target 30.0 [True]); 23.0 (target 30.0 [True]) | smallness misfit: 278.0 (target: 200.0 [False]) Beta cooling evaluation: progress: [24.6 23. ]; minimum progress targets: [30. 30.] Warming alpha_pgi to favor clustering: 98.43114270782824 31 2.39e+00 2.34e+01 1.21e+02 3.13e+02 1.19e+02 0 geophys. misfits: 36.6 (target 30.0 [False]); 25.6 (target 30.0 [True]) | smallness misfit: 226.2 (target: 200.0 [False]) Beta cooling evaluation: progress: [36.6 25.6]; minimum progress targets: [30. 30.] Decreasing beta to counter data misfit increase. Updating scaling for data misfits by 1.1732718933185409 New scales: [0.30334275 0.69665725] 32 1.19e+00 2.89e+01 1.16e+02 1.67e+02 1.18e+02 0 geophys. misfits: 27.1 (target 30.0 [True]); 25.5 (target 30.0 [True]) | smallness misfit: 213.4 (target: 200.0 [False]) Beta cooling evaluation: progress: [27.1 25.5]; minimum progress targets: [30. 30.] Warming alpha_pgi to favor clustering: 112.27045537462944 33 1.19e+00 2.60e+01 1.21e+02 1.71e+02 1.14e+02 0 geophys. misfits: 28.2 (target 30.0 [True]); 24.3 (target 30.0 [True]) | smallness misfit: 211.0 (target: 200.0 [False]) Beta cooling evaluation: progress: [28.2 24.3]; minimum progress targets: [30. 30.] Warming alpha_pgi to favor clustering: 129.08852518299622 34 1.19e+00 2.55e+01 1.28e+02 1.78e+02 1.10e+02 0 geophys. misfits: 29.2 (target 30.0 [True]); 25.6 (target 30.0 [True]) | smallness misfit: 194.5 (target: 200.0 [True]) All targets have been reached Beta cooling evaluation: progress: [29.2 25.6]; minimum progress targets: [30. 30.] Warming alpha_pgi to favor clustering: 142.12597606212722 ------------------------- STOP! ------------------------- 1 : |fc-fOld| = 0.0000e+00 <= tolF*(1+|f0|) = 3.0000e+04 0 : |xc-x_last| = 5.0874e-01 <= tolX*(1+|x0|) = 1.0000e-06 0 : |proj(x-g)-x| = 1.1035e+02 <= tolG = 1.0000e-01 0 : |proj(x-g)-x| = 1.1035e+02 <= 1e3*eps = 1.0000e-02 0 : maxIter = 50 <= iter = 35 ------------------------- DONE! ------------------------- Running inversion with SimPEG v0.22.0 simpeg.InvProblem will set Regularization.reference_model to m0. simpeg.InvProblem will set Regularization.reference_model to m0. simpeg.InvProblem will set Regularization.reference_model to m0. simpeg.InvProblem is setting bfgsH0 to the inverse of the eval2Deriv. ***Done using the default solver Pardiso and no solver_opts.*** Alpha scales: [0.00035290147269136, 0.0, 3.5122265027259625e-06, 0.0] Calculating the scaling parameter. Scale Multipliers: [0.09429751 0.90570249] Initial data misfit scales: [0.09429751 0.90570249] model has any nan: 0 =============================== Projected GNCG =============================== # beta phi_d phi_m f |proj(x-g)-x| LS Comment ----------------------------------------------------------------------------- x0 has any nan: 0 0 1.91e+03 3.00e+05 0.00e+00 3.00e+05 1.41e+02 0 geophys. misfits: 88746.2 (target 30.0 [False]); 62261.7 (target 30.0 [False]) | smallness misfit: 272.0 (target: 200.0 [False]) Beta cooling evaluation: progress: [88746.2 62261.7]; minimum progress targets: [240000. 240000.] 1 1.91e+03 6.48e+04 6.57e-01 6.60e+04 9.27e+01 0 geophys. misfits: 642.5 (target 30.0 [False]); 24.1 (target 30.0 [True]) | smallness misfit: 112.7 (target: 200.0 [True]) Beta cooling evaluation: progress: [642.5 24.1]; minimum progress targets: [70996.9 49809.3] Updating scaling for data misfits by 1.2471548335361147 New scales: [0.11492514 0.88507486] 2 1.91e+03 9.51e+01 3.23e-01 7.14e+02 8.44e+01 0 Skip BFGS geophys. misfits: 107.4 (target 30.0 [False]); 22.3 (target 30.0 [True]) | smallness misfit: 61.3 (target: 200.0 [True]) Beta cooling evaluation: progress: [107.4 22.3]; minimum progress targets: [514. 30.] Updating scaling for data misfits by 1.3427652544537596 New scales: [0.14846894 0.85153106] 3 1.91e+03 3.50e+01 1.53e-01 3.28e+02 1.05e+02 0 Skip BFGS geophys. misfits: 76.3 (target 30.0 [False]); 21.4 (target 30.0 [True]) | smallness misfit: 46.6 (target: 200.0 [True]) Beta cooling evaluation: progress: [76.3 21.4]; minimum progress targets: [85.9 30. ] Updating scaling for data misfits by 1.3995646935052177 New scales: [0.19615537 0.80384463] 4 1.91e+03 3.22e+01 1.27e-01 2.75e+02 7.57e+01 0 geophys. misfits: 56.0 (target 30.0 [False]); 22.0 (target 30.0 [True]) | smallness misfit: 47.4 (target: 200.0 [True]) Beta cooling evaluation: progress: [56. 22.]; minimum progress targets: [61. 30.] Updating scaling for data misfits by 1.3642761578592137 New scales: [0.24976333 0.75023667] 5 1.91e+03 3.05e+01 1.29e-01 2.76e+02 7.88e+01 0 Skip BFGS geophys. misfits: 44.7 (target 30.0 [False]); 22.5 (target 30.0 [True]) | smallness misfit: 47.9 (target: 200.0 [True]) Beta cooling evaluation: progress: [44.7 22.5]; minimum progress targets: [44.8 30. ] Updating scaling for data misfits by 1.3358205199459254 New scales: [0.30782035 0.69217965] 6 1.91e+03 2.93e+01 1.30e-01 2.77e+02 7.89e+01 0 Skip BFGS geophys. misfits: 38.0 (target 30.0 [False]); 23.0 (target 30.0 [True]) | smallness misfit: 48.3 (target: 200.0 [True]) Beta cooling evaluation: progress: [38. 23.]; minimum progress targets: [35.7 30. ] Decreasing beta to counter data misfit decrase plateau. Updating scaling for data misfits by 1.3017109355198204 New scales: [0.36664205 0.63335795] 7 9.57e+02 2.85e+01 1.30e-01 1.53e+02 9.91e+01 0 Skip BFGS geophys. misfits: 26.5 (target 30.0 [True]); 20.3 (target 30.0 [True]) | smallness misfit: 50.2 (target: 200.0 [True]) All targets have been reached Beta cooling evaluation: progress: [26.5 20.3]; minimum progress targets: [30.4 30. ] Warming alpha_pgi to favor clustering: 1.3051451777497802 ------------------------- STOP! ------------------------- 1 : |fc-fOld| = 0.0000e+00 <= tolF*(1+|f0|) = 3.0000e+04 0 : |xc-x_last| = 1.5127e-01 <= tolX*(1+|x0|) = 1.0000e-06 0 : |proj(x-g)-x| = 9.9134e+01 <= tolG = 1.0000e-01 0 : |proj(x-g)-x| = 9.9134e+01 <= 1e3*eps = 1.0000e-02 0 : maxIter = 50 <= iter = 8 ------------------------- DONE! ------------------------- Running inversion with SimPEG v0.22.0 simpeg.InvProblem will set Regularization.reference_model to m0. simpeg.InvProblem will set Regularization.reference_model to m0. simpeg.InvProblem is setting bfgsH0 to the inverse of the eval2Deriv. ***Done using the default solver Pardiso and no solver_opts.*** Alpha scales: [3.494765446396261e-05, 0.0, 3.50340917582425e-05, 0.0] Calculating the scaling parameter. Scale Multipliers: [0.09429751 0.90570249] /home/vsts/work/1/s/simpeg/directives/directives.py:334: UserWarning: There is no PGI regularization. Smallness target is turned off (TriggerSmall flag) Initial data misfit scales: [0.09429751 0.90570249] model has any nan: 0 =============================== Projected GNCG =============================== # beta phi_d phi_m f |proj(x-g)-x| LS Comment ----------------------------------------------------------------------------- x0 has any nan: 0 0 1.03e+06 3.00e+05 0.00e+00 3.00e+05 1.41e+02 0 geophys. misfits: 57071.4 (target 30.0 [False]); 35672.8 (target 30.0 [False]) 1 2.07e+05 3.77e+04 4.30e-02 4.66e+04 1.38e+02 0 geophys. misfits: 8548.9 (target 30.0 [False]); 3856.8 (target 30.0 [False]) 2 4.14e+04 4.30e+03 1.07e-01 8.73e+03 1.30e+02 0 Skip BFGS geophys. misfits: 574.4 (target 30.0 [False]); 258.8 (target 30.0 [False]) 3 8.27e+03 2.89e+02 1.41e-01 1.46e+03 1.02e+02 0 Skip BFGS geophys. misfits: 45.6 (target 30.0 [False]); 37.2 (target 30.0 [False]) 4 1.65e+03 3.80e+01 1.52e-01 2.90e+02 8.81e+01 0 Skip BFGS geophys. misfits: 21.2 (target 30.0 [True]); 19.8 (target 30.0 [True]) All targets have been reached ------------------------- STOP! ------------------------- 1 : |fc-fOld| = 0.0000e+00 <= tolF*(1+|f0|) = 3.0000e+04 0 : |xc-x_last| = 4.9534e-01 <= tolX*(1+|x0|) = 1.0000e-06 0 : |proj(x-g)-x| = 8.8080e+01 <= tolG = 1.0000e-01 0 : |proj(x-g)-x| = 8.8080e+01 <= 1e3*eps = 1.0000e-02 0 : maxIter = 50 <= iter = 5 ------------------------- DONE! ------------------------- /home/vsts/work/1/s/examples/10-pgi/plot_inv_1_PGI_Linear_1D_joint_WithRelationships.py:301: UserWarning: marker is redundantly defined by the 'marker' keyword argument and the fmt string "b.-" (-> marker='.'). The keyword argument will take precedence. /home/vsts/work/1/s/examples/10-pgi/plot_inv_1_PGI_Linear_1D_joint_WithRelationships.py:308: UserWarning: marker is redundantly defined by the 'marker' keyword argument and the fmt string "r.-" (-> marker='.'). The keyword argument will take precedence. /home/vsts/work/1/s/examples/10-pgi/plot_inv_1_PGI_Linear_1D_joint_WithRelationships.py:346: UserWarning: marker is redundantly defined by the 'marker' keyword argument and the fmt string "b.-" (-> marker='.'). The keyword argument will take precedence. /home/vsts/work/1/s/examples/10-pgi/plot_inv_1_PGI_Linear_1D_joint_WithRelationships.py:353: UserWarning: marker is redundantly defined by the 'marker' keyword argument and the fmt string "r.-" (-> marker='.'). The keyword argument will take precedence. /home/vsts/work/1/s/examples/10-pgi/plot_inv_1_PGI_Linear_1D_joint_WithRelationships.py:360: UserWarning: The following kwargs were not used by contour: 'label' /home/vsts/work/1/s/examples/10-pgi/plot_inv_1_PGI_Linear_1D_joint_WithRelationships.py:368: UserWarning: The following kwargs were not used by contour: 'label' /home/vsts/work/1/s/examples/10-pgi/plot_inv_1_PGI_Linear_1D_joint_WithRelationships.py:402: UserWarning: marker is redundantly defined by the 'marker' keyword argument and the fmt string "b.-" (-> marker='.'). The keyword argument will take precedence. /home/vsts/work/1/s/examples/10-pgi/plot_inv_1_PGI_Linear_1D_joint_WithRelationships.py:409: UserWarning: marker is redundantly defined by the 'marker' keyword argument and the fmt string "r.-" (-> marker='.'). The keyword argument will take precedence. | .. code-block:: Python import discretize as Mesh import matplotlib.pyplot as plt import numpy as np from simpeg import ( data_misfit, directives, inverse_problem, inversion, maps, optimization, regularization, simulation, utils, ) # Random seed for reproductibility np.random.seed(1) # Mesh N = 100 mesh = Mesh.TensorMesh([N]) # Survey design parameters nk = 30 jk = np.linspace(1.0, 59.0, nk) p = -0.25 q = 0.25 # Physics def g(k): return np.exp(p * jk[k] * mesh.cell_centers_x) * np.cos( np.pi * q * jk[k] * mesh.cell_centers_x ) G = np.empty((nk, mesh.nC)) for i in range(nk): G[i, :] = g(i) m0 = np.zeros(mesh.nC) m0[20:41] = np.linspace(0.0, 1.0, 21) m0[41:57] = np.linspace(-1, 0.0, 16) poly0 = maps.PolynomialPetroClusterMap(coeffyx=np.r_[0.0, -4.0, 4.0]) poly1 = maps.PolynomialPetroClusterMap(coeffyx=np.r_[-0.0, 3.0, 6.0, 6.0]) poly0_inverse = maps.PolynomialPetroClusterMap(coeffyx=-np.r_[0.0, -4.0, 4.0]) poly1_inverse = maps.PolynomialPetroClusterMap(coeffyx=-np.r_[0.0, 3.0, 6.0, 6.0]) cluster_mapping = [maps.IdentityMap(), poly0_inverse, poly1_inverse] m1 = np.zeros(100) m1[20:41] = 1.0 + (poly0 * np.vstack([m0[20:41], m1[20:41]]).T)[:, 1] m1[41:57] = -1.0 + (poly1 * np.vstack([m0[41:57], m1[41:57]]).T)[:, 1] model2d = np.vstack([m0, m1]).T m = utils.mkvc(model2d) clfmapping = utils.GaussianMixtureWithNonlinearRelationships( mesh=mesh, n_components=3, covariance_type="full", tol=1e-8, reg_covar=1e-3, max_iter=1000, n_init=100, init_params="kmeans", random_state=None, warm_start=False, means_init=np.array( [ [0, 0], [m0[20:41].mean(), m1[20:41].mean()], [m0[41:57].mean(), m1[41:57].mean()], ] ), verbose=0, verbose_interval=10, cluster_mapping=cluster_mapping, ) clfmapping = clfmapping.fit(model2d) clfnomapping = utils.WeightedGaussianMixture( mesh=mesh, n_components=3, covariance_type="full", tol=1e-8, reg_covar=1e-3, max_iter=1000, n_init=100, init_params="kmeans", random_state=None, warm_start=False, verbose=0, verbose_interval=10, ) clfnomapping = clfnomapping.fit(model2d) wires = maps.Wires(("m1", mesh.nC), ("m2", mesh.nC)) relatrive_error = 0.01 noise_floor = 0.0 prob1 = simulation.LinearSimulation(mesh, G=G, model_map=wires.m1) survey1 = prob1.make_synthetic_data( m, relative_error=relatrive_error, noise_floor=noise_floor, add_noise=True ) prob2 = simulation.LinearSimulation(mesh, G=G, model_map=wires.m2) survey2 = prob2.make_synthetic_data( m, relative_error=relatrive_error, noise_floor=noise_floor, add_noise=True ) dmis1 = data_misfit.L2DataMisfit(simulation=prob1, data=survey1) dmis2 = data_misfit.L2DataMisfit(simulation=prob2, data=survey2) dmis = dmis1 + dmis2 minit = np.zeros_like(m) # Distance weighting wr1 = np.sum(prob1.G**2.0, axis=0) ** 0.5 / mesh.cell_volumes wr1 = wr1 / np.max(wr1) wr2 = np.sum(prob2.G**2.0, axis=0) ** 0.5 / mesh.cell_volumes wr2 = wr2 / np.max(wr2) reg_simple = regularization.PGI( mesh=mesh, gmmref=clfmapping, gmm=clfmapping, approx_gradient=True, wiresmap=wires, non_linear_relationships=True, weights_list=[wr1, wr2], ) opt = optimization.ProjectedGNCG( maxIter=50, tolX=1e-6, maxIterCG=100, tolCG=1e-3, lower=-10, upper=10, ) invProb = inverse_problem.BaseInvProblem(dmis, reg_simple, opt) # directives scales = directives.ScalingMultipleDataMisfits_ByEig( chi0_ratio=np.r_[1.0, 1.0], verbose=True, n_pw_iter=10 ) scaling_schedule = directives.JointScalingSchedule(verbose=True) alpha0_ratio = np.r_[1e6, 1e4, 1, 1] alphas = directives.AlphasSmoothEstimate_ByEig( alpha0_ratio=alpha0_ratio, n_pw_iter=10, verbose=True ) beta = directives.BetaEstimate_ByEig(beta0_ratio=1e-5, n_pw_iter=10) betaIt = directives.PGI_BetaAlphaSchedule( verbose=True, coolingFactor=2.0, progress=0.2, ) targets = directives.MultiTargetMisfits(verbose=True) petrodir = directives.PGI_UpdateParameters(update_gmm=False) # Setup Inversion inv = inversion.BaseInversion( invProb, directiveList=[alphas, scales, beta, petrodir, targets, betaIt, scaling_schedule], ) mcluster_map = inv.run(minit) # Inversion with no nonlinear mapping reg_simple_no_map = regularization.PGI( mesh=mesh, gmmref=clfnomapping, gmm=clfnomapping, approx_gradient=True, wiresmap=wires, non_linear_relationships=False, weights_list=[wr1, wr2], ) opt = optimization.ProjectedGNCG( maxIter=50, tolX=1e-6, maxIterCG=100, tolCG=1e-3, lower=-10, upper=10, ) invProb = inverse_problem.BaseInvProblem(dmis, reg_simple_no_map, opt) # directives scales = directives.ScalingMultipleDataMisfits_ByEig( chi0_ratio=np.r_[1.0, 1.0], verbose=True, n_pw_iter=10 ) scaling_schedule = directives.JointScalingSchedule(verbose=True) alpha0_ratio = np.r_[100.0 * np.ones(2), 1, 1] alphas = directives.AlphasSmoothEstimate_ByEig( alpha0_ratio=alpha0_ratio, n_pw_iter=10, verbose=True ) beta = directives.BetaEstimate_ByEig(beta0_ratio=1e-5, n_pw_iter=10) betaIt = directives.PGI_BetaAlphaSchedule( verbose=True, coolingFactor=2.0, progress=0.2, ) targets = directives.MultiTargetMisfits( chiSmall=1.0, TriggerSmall=True, TriggerTheta=False, verbose=True ) petrodir = directives.PGI_UpdateParameters(update_gmm=False) # Setup Inversion inv = inversion.BaseInversion( invProb, directiveList=[alphas, scales, beta, petrodir, targets, betaIt, scaling_schedule], ) mcluster_no_map = inv.run(minit) # WeightedLeastSquares Inversion reg1 = regularization.WeightedLeastSquares( mesh, alpha_s=1.0, alpha_x=1.0, mapping=wires.m1, weights={"cell_weights": wr1} ) reg2 = regularization.WeightedLeastSquares( mesh, alpha_s=1.0, alpha_x=1.0, mapping=wires.m2, weights={"cell_weights": wr2} ) reg = reg1 + reg2 opt = optimization.ProjectedGNCG( maxIter=50, tolX=1e-6, maxIterCG=100, tolCG=1e-3, lower=-10, upper=10, ) invProb = inverse_problem.BaseInvProblem(dmis, reg, opt) # directives alpha0_ratio = np.r_[1, 1, 1, 1] alphas = directives.AlphasSmoothEstimate_ByEig( alpha0_ratio=alpha0_ratio, n_pw_iter=10, verbose=True ) scales = directives.ScalingMultipleDataMisfits_ByEig( chi0_ratio=np.r_[1.0, 1.0], verbose=True, n_pw_iter=10 ) scaling_schedule = directives.JointScalingSchedule(verbose=True) beta = directives.BetaEstimate_ByEig(beta0_ratio=1e-5, n_pw_iter=10) beta_schedule = directives.BetaSchedule(coolingFactor=5.0, coolingRate=1) targets = directives.MultiTargetMisfits( TriggerSmall=False, verbose=True, ) # Setup Inversion inv = inversion.BaseInversion( invProb, directiveList=[alphas, scales, beta, targets, beta_schedule, scaling_schedule], ) mtik = inv.run(minit) # Final Plot fig, axes = plt.subplots(3, 4, figsize=(25, 15)) axes = axes.reshape(12) left, width = 0.25, 0.5 bottom, height = 0.25, 0.5 right = left + width top = bottom + height axes[0].set_axis_off() axes[0].text( 0.5 * (left + right), 0.5 * (bottom + top), ("Using true nonlinear\npetrophysical relationships"), horizontalalignment="center", verticalalignment="center", fontsize=20, color="black", transform=axes[0].transAxes, ) axes[1].plot(mesh.cell_centers_x, wires.m1 * mcluster_map, "b.-", ms=5, marker="v") axes[1].plot(mesh.cell_centers_x, wires.m1 * m, "k--") axes[1].set_title("Problem 1") axes[1].legend(["Recovered Model", "True Model"], loc=1) axes[1].set_xlabel("X") axes[1].set_ylabel("Property 1") axes[2].plot(mesh.cell_centers_x, wires.m2 * mcluster_map, "r.-", ms=5, marker="v") axes[2].plot(mesh.cell_centers_x, wires.m2 * m, "k--") axes[2].set_title("Problem 2") axes[2].legend(["Recovered Model", "True Model"], loc=1) axes[2].set_xlabel("X") axes[2].set_ylabel("Property 2") x, y = np.mgrid[-1:1:0.01, -4:2:0.01] pos = np.empty(x.shape + (2,)) pos[:, :, 0] = x pos[:, :, 1] = y CS = axes[3].contour( x, y, np.exp(clfmapping.score_samples(pos.reshape(-1, 2)).reshape(x.shape)), 100, alpha=0.25, cmap="viridis", ) axes[3].scatter(wires.m1 * mcluster_map, wires.m2 * mcluster_map, marker="v") axes[3].set_title("Petrophysical Distribution") CS.collections[0].set_label("") axes[3].legend(["True Petrophysical Distribution", "Recovered model crossplot"]) axes[3].set_xlabel("Property 1") axes[3].set_ylabel("Property 2") axes[4].set_axis_off() axes[4].text( 0.5 * (left + right), 0.5 * (bottom + top), ("Using a pure\nGaussian distribution"), horizontalalignment="center", verticalalignment="center", fontsize=20, color="black", transform=axes[4].transAxes, ) axes[5].plot(mesh.cell_centers_x, wires.m1 * mcluster_no_map, "b.-", ms=5, marker="v") axes[5].plot(mesh.cell_centers_x, wires.m1 * m, "k--") axes[5].set_title("Problem 1") axes[5].legend(["Recovered Model", "True Model"], loc=1) axes[5].set_xlabel("X") axes[5].set_ylabel("Property 1") axes[6].plot(mesh.cell_centers_x, wires.m2 * mcluster_no_map, "r.-", ms=5, marker="v") axes[6].plot(mesh.cell_centers_x, wires.m2 * m, "k--") axes[6].set_title("Problem 2") axes[6].legend(["Recovered Model", "True Model"], loc=1) axes[6].set_xlabel("X") axes[6].set_ylabel("Property 2") CSF = axes[7].contour( x, y, np.exp(clfmapping.score_samples(pos.reshape(-1, 2)).reshape(x.shape)), 100, alpha=0.5, label="True Petro. Distribution", ) CS = axes[7].contour( x, y, np.exp(clfnomapping.score_samples(pos.reshape(-1, 2)).reshape(x.shape)), 500, cmap="viridis", linestyles="--", label="Modeled Petro. Distribution", ) axes[7].scatter( wires.m1 * mcluster_no_map, wires.m2 * mcluster_no_map, marker="v", label="Recovered model crossplot", ) axes[7].set_title("Petrophysical Distribution") axes[7].legend() axes[7].set_xlabel("Property 1") axes[7].set_ylabel("Property 2") # Tikonov axes[8].set_axis_off() axes[8].text( 0.5 * (left + right), 0.5 * (bottom + top), ("Least-Squares\n~Using a single cluster"), horizontalalignment="center", verticalalignment="center", fontsize=20, color="black", transform=axes[8].transAxes, ) axes[9].plot(mesh.cell_centers_x, wires.m1 * mtik, "b.-", ms=5, marker="v") axes[9].plot(mesh.cell_centers_x, wires.m1 * m, "k--") axes[9].set_title("Problem 1") axes[9].legend(["Recovered Model", "True Model"], loc=1) axes[9].set_xlabel("X") axes[9].set_ylabel("Property 1") axes[10].plot(mesh.cell_centers_x, wires.m2 * mtik, "r.-", ms=5, marker="v") axes[10].plot(mesh.cell_centers_x, wires.m2 * m, "k--") axes[10].set_title("Problem 2") axes[10].legend(["Recovered Model", "True Model"], loc=1) axes[10].set_xlabel("X") axes[10].set_ylabel("Property 2") CS = axes[11].contour( x, y, np.exp(clfmapping.score_samples(pos.reshape(-1, 2)).reshape(x.shape)), 100, alpha=0.25, cmap="viridis", ) axes[11].scatter(wires.m1 * mtik, wires.m2 * mtik, marker="v") axes[11].set_title("Petro Distribution") CS.collections[0].set_label("") axes[11].legend(["True Petro Distribution", "Recovered model crossplot"]) axes[11].set_xlabel("Property 1") axes[11].set_ylabel("Property 2") plt.subplots_adjust(wspace=0.3, hspace=0.3, top=0.85) plt.show() .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 52.142 seconds) **Estimated memory usage:** 9 MB .. _sphx_glr_download_content_examples_10-pgi_plot_inv_1_PGI_Linear_1D_joint_WithRelationships.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_inv_1_PGI_Linear_1D_joint_WithRelationships.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_inv_1_PGI_Linear_1D_joint_WithRelationships.py ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_