{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "387c73d3",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:42:20.643943Z",
     "iopub.status.busy": "2026-10-02T14:42:20.643688Z",
     "iopub.status.idle": "2026-10-02T14:42:20.648445Z",
     "shell.execute_reply": "2026-10-02T14:42:20.647909Z"
    },
    "papermill": {
     "duration": 0.007649,
     "end_time": "2026-10-02T14:42:20.648969+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:42:20.641320+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "active-ipynb",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "try:\n",
    "    from openmdao.utils.notebook_utils import notebook_mode  # noqa: F401\n",
    "except ImportError:\n",
    "    !python -m pip install openmdao[notebooks]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c4560cb4",
   "metadata": {
    "papermill": {
     "duration": 0.000932,
     "end_time": "2026-10-02T14:42:20.651008+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:42:20.650076+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "# BrentSolver\n",
    "\n",
    "BrentSolver is an implementation of Scipy's Brentq, which is based on the Wijngaarden-Dekker-Brent method. It can solve for a single state bracketed between a lower and upper bound using the bisection method, where the value at the two bounding points must have opposite signs. Convergence is guaranteed for generally well-behaved problems on the interval. Derivatives are not required for this solver, though it is limited to solving a single state. Brent can be nested with other solvers, including other Brent solvers.\n",
    "\n",
    "\n",
    "## BrentSolver Options"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "0d488f41",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:42:20.672226Z",
     "iopub.status.busy": "2026-10-02T14:42:20.672089Z",
     "iopub.status.idle": "2026-10-02T14:42:22.007255Z",
     "shell.execute_reply": "2026-10-02T14:42:22.006514Z"
    },
    "papermill": {
     "duration": 1.337247,
     "end_time": "2026-10-02T14:42:22.007852+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:42:20.670605+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "<!DOCTYPE html>\n",
       "<html lang=\"en\">\n",
       "<head>\n",
       "    <style>\n",
       "        h2 {\n",
       "            text-align: center;\n",
       "        }\n",
       "    </style>\n",
       "</head>\n",
       "<body>\n",
       "    <h2></h2>\n",
       "        <table style=\"border: 1px solid #999; border-collapse: collapse;\">\n",
       "        <tr><th style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; background-color: #E9E9E9; text-align: left;\">Option</th><th style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; background-color: #E9E9E9; text-align: left;\">Default</th><th style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; background-color: #E9E9E9; text-align: left;\">Acceptable Values</th><th style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; background-color: #E9E9E9; text-align: left;\">Acceptable Types</th><th style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; background-color: #E9E9E9; text-align: left;\">Description</th></tr>\n",
       "       <tr style=\"background-color: ghostwhite;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">atol</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">1e-10</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">absolute error tolerance</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">debug_print</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">False</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">[True, False]</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">[&#x27;bool&#x27;]</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">If True, the values of input and output variables at the start of iteration are printed and written to a file after a failure to converge or when encountering aninvalid value in the residual.</td></tr>\n",
       "       <tr style=\"background-color: ghostwhite;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">err_on_non_converge</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">False</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">[True, False]</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">[&#x27;bool&#x27;]</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">When True, AnalysisError will be raised if we don&#x27;t converge.</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">iprint</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">1</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">[&#x27;int&#x27;]</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">whether to print output</td></tr>\n",
       "       <tr style=\"background-color: ghostwhite;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">lower_bound</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">0.0</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">Lower bound for the root search</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">lower_bound_target</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">Openmdao path to the lower bound. When specified, this takes precedence over the value specified in lower_bound.</td></tr>\n",
       "       <tr style=\"background-color: ghostwhite;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">maxiter</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">10</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">[&#x27;int&#x27;]</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">maximum number of iterations</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">restart_from_successful</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">False</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">[True, False]</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">[&#x27;bool&#x27;]</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">If True, the states are cached after a successful solve and used to restart the solver in the case of a failed solve.</td></tr>\n",
       "       <tr style=\"background-color: ghostwhite;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">rtol</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">1e-10</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">relative error tolerance</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">state_target</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">[&#x27;str&#x27;]</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">Name of the implicit state to be solved</td></tr>\n",
       "       <tr style=\"background-color: ghostwhite;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">upper_bound</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">100.0</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">Upper bound for the root search</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">upper_bound_target</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">Openmdao path to the upper bound. When specified, this takes precedence over the value specified in upper_bound.</td></tr>\n",
       "    </table>\n",
       "</body>\n",
       "</html>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import openmdao.api as om\n",
    "om.show_options_table(\"openmdao.solvers.nonlinear.brent.BrentSolver\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2d6baa8b",
   "metadata": {
    "papermill": {
     "duration": 0.001375,
     "end_time": "2026-10-02T14:42:22.010946+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:42:22.009571+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "\n",
    "## BrentSolver Constructor\n",
    "\n",
    "The call signature for the `BrentSolver` constructor is:\n",
    "\n",
    "```{eval-rst}\n",
    "    .. automethod:: openmdao.solvers.nonlinear.brent.BrentSolver.__init__\n",
    "        :noindex:\n",
    "```\n",
    "\n",
    "## BrentSolver Example\n",
    "\n",
    "The following simple example shows the use of the Brent solver to find the output of an `ImplicitComponent` that models the equation `x = a*x**n + b*x - c`. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "2f4e2b32",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:42:22.014835Z",
     "iopub.status.busy": "2026-10-02T14:42:22.014467Z",
     "iopub.status.idle": "2026-10-02T14:42:23.251464Z",
     "shell.execute_reply": "2026-10-02T14:42:23.250794Z"
    },
    "papermill": {
     "duration": 1.239839,
     "end_time": "2026-10-02T14:42:23.252141+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:42:22.012302+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1790952143.238972] [runnervm8df0l:7096 :0]        ib_iface.c:1269 UCX  ERROR mana_0: iface 0x55922981d260 failed to create UD QP TX wr:256 sge:6 inl:64 resp:0 RX wr:4096 sge:1 resp:0 failed: Operation not supported\n",
      "[1790952143.239217] [runnervm8df0l:7096 :0]      ucp_worker.c:1412 UCX  ERROR uct_iface_open(ud_verbs/mana_0:1) failed: Input/output error\n",
      "NL: BRENT 0 ; 0.780735554 1\n",
      "NL: BRENT 1 ; 10 12.8084342\n",
      "NL: BRENT 2 ; 267574.261 342720.732\n",
      "NL: BRENT 3 ; 9.99701022 12.8046048\n",
      "NL: BRENT 4 ; 710.851762 910.489806\n",
      "NL: BRENT 5 ; 9.85458137 12.6221757\n",
      "NL: BRENT 6 ; 97.5661059 124.966905\n",
      "NL: BRENT 7 ; 9.18003596 11.7581887\n",
      "NL: BRENT 8 ; 12.3023868 15.7574312\n",
      "NL: BRENT 9 ; 4.95794295 6.35034862\n",
      "NL: BRENT 10 ; 3.79808278 4.86474935\n",
      "NL: BRENT 11 ; 0.739762487 0.947519917\n",
      "NL: BRENT 12 ; 0.0830067028 0.106318589\n",
      "NL: BRENT 13 ; 0.000386953714 0.00049562712\n",
      "NL: BRENT 14 ; 1.10893672e-06 1.42037431e-06\n",
      "NL: BRENT 15 ; 1.47455381e-11 1.88867255e-11\n",
      "NL: BRENT 16 ; 1.83156308e-07 2.34594553e-07\n",
      "NL: BRENT 17 ; 1.47455381e-11 1.88867255e-11\n",
      "NL: BRENT Converged\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[runnervm8df0l:07096] pml_ucx.c:313  Error: Failed to create UCP worker\n"
     ]
    }
   ],
   "source": [
    "import openmdao.api as om\n",
    "\n",
    "class CompTest(om.ImplicitComponent):\n",
    "\n",
    "    def setup(self):\n",
    "        self.add_input('a', val=1.)\n",
    "        self.add_input('b', val=1.)\n",
    "        self.add_input('c', val=10.)\n",
    "        self.add_input('n', val=77.0/27.0)\n",
    "\n",
    "        self.add_output('x', val=2., lower=0, upper=100)\n",
    "\n",
    "    def apply_nonlinear(self, inputs, outputs, residuals, discrete_inputs=None, discrete_outputs=None):\n",
    "        a = inputs['a']\n",
    "        b = inputs['b']\n",
    "        c = inputs['c']\n",
    "        n = inputs['n']\n",
    "        x = outputs['x']\n",
    "\n",
    "        # Can't take fractional power of negative number\n",
    "        if x >= 0.0:\n",
    "            fact = x ** n\n",
    "        else:\n",
    "            fact = - (-x) ** n\n",
    "\n",
    "        residuals['x'] = a * fact + b * x - c\n",
    "\n",
    "\n",
    "prob = om.Problem()\n",
    "model = prob.model\n",
    "model.add_subsystem('comp', CompTest(), promotes=['*'])\n",
    "model.nonlinear_solver = om.BrentSolver(\n",
    "    state_target='x',\n",
    "    lower_bound=0.0,\n",
    "    upper_bound=80.0,\n",
    "    maxiter=100,\n",
    "    atol=1e-8,\n",
    "    rtol=1e-8,\n",
    ")\n",
    "\n",
    "prob.setup()\n",
    "prob.set_solver_print(2)\n",
    "\n",
    "prob.run_model()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "3e2e36d1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:42:23.255642Z",
     "iopub.status.busy": "2026-10-02T14:42:23.255492Z",
     "iopub.status.idle": "2026-10-02T14:42:23.258329Z",
     "shell.execute_reply": "2026-10-02T14:42:23.257660Z"
    },
    "papermill": {
     "duration": 0.005376,
     "end_time": "2026-10-02T14:42:23.258979+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:42:23.253603+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2.06720359]\n"
     ]
    }
   ],
   "source": [
    "print(prob.get_val('x'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "33d3eb83",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:42:23.262626Z",
     "iopub.status.busy": "2026-10-02T14:42:23.262455Z",
     "iopub.status.idle": "2026-10-02T14:42:23.266690Z",
     "shell.execute_reply": "2026-10-02T14:42:23.266030Z"
    },
    "papermill": {
     "duration": 0.006682,
     "end_time": "2026-10-02T14:42:23.267137+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:42:23.260455+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(1.5360063528897865e-12)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from openmdao.utils.assert_utils import assert_near_equal\n",
    "\n",
    "assert_near_equal(prob.get_val('x')[0], 2.06720359226, 1e-6)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "df23f34a",
   "metadata": {
    "papermill": {
     "duration": 0.001051,
     "end_time": "2026-10-02T14:42:23.269317+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:42:23.268266+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "The convergence history clearly shows the bisection and bracketing process, where the model is evaluated at closer points to the eventual solution.\n",
    "\n",
    "## BrentSolver Option Example: Upper and Lower Bounds from the Model\n",
    "\n",
    "The BrentSolver also allows the lower and upper bounds to be sourced from the model output, which is useful in cases where the interval of interest can be determined ahead of time by an upstream calculation. Note that the bounds are only queried at the start of the Brent iteration."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "3f930699",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:42:23.272069Z",
     "iopub.status.busy": "2026-10-02T14:42:23.271940Z",
     "iopub.status.idle": "2026-10-02T14:42:23.283080Z",
     "shell.execute_reply": "2026-10-02T14:42:23.282443Z"
    },
    "papermill": {
     "duration": 0.013155,
     "end_time": "2026-10-02T14:42:23.283552+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:42:23.270397+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "NL: BRENT 0 ; 63.9036778 1\n",
      "NL: BRENT 1 ; 2994.85472 46.8651386\n",
      "NL: BRENT 2 ; 3310761.75 51808.6261\n",
      "NL: BRENT 3 ; 2891.97277 45.2551851\n",
      "NL: BRENT 4 ; 819.781457 12.8283924\n",
      "NL: BRENT 5 ; 379685.178 5941.52311\n",
      "NL: BRENT 6 ; 764.522075 11.9636631\n",
      "NL: BRENT 7 ; 203.336544 3.18192241\n",
      "NL: BRENT 8 ; 38387.5788 600.710008\n",
      "NL: BRENT 9 ; 171.104403 2.67753608\n",
      "NL: BRENT 10 ; 36.6139392 0.572955117\n",
      "NL: BRENT 11 ; 2669.37076 41.7717861\n",
      "NL: BRENT 12 ; 13.1605549 0.205943623\n",
      "NL: BRENT 13 ; 1.31446198 0.0205694262\n",
      "NL: BRENT 14 ; 0.0566167805 0.000885970612\n",
      "NL: BRENT 15 ; 0.000262898643 4.11398299e-06\n",
      "NL: BRENT 16 ; 5.30071702e-08 8.29485439e-10\n",
      "NL: BRENT 17 ; 2.54417273e-06 3.98126183e-08\n",
      "NL: BRENT 18 ; 5.30071702e-08 8.29485439e-10\n",
      "NL: BRENT Converged\n"
     ]
    }
   ],
   "source": [
    "import openmdao.api as om\n",
    "\n",
    "prob = om.Problem()\n",
    "model = prob.model\n",
    "\n",
    "model.add_subsystem('lower', om.ExecComp('low = 2*a'), promotes=['*'])\n",
    "model.add_subsystem('upper', om.ExecComp('high = 2*b'), promotes=['*'])\n",
    "\n",
    "model.add_subsystem('comp', CompTest(), promotes=['*'])\n",
    "model.nonlinear_solver = om.BrentSolver(\n",
    "    state_target='x',\n",
    "    maxiter=100,\n",
    "    atol=1e-8,\n",
    "    rtol=1e-8,\n",
    "    lower_bound_target='low',\n",
    "    upper_bound_target='high',\n",
    ")\n",
    "\n",
    "prob.setup()\n",
    "prob.set_solver_print(2)\n",
    "\n",
    "prob.setup()\n",
    "\n",
    "prob.set_val('a', -5.0)\n",
    "prob.set_val('b', 55.0)\n",
    "\n",
    "prob.run_model()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "e2765ab2",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:42:23.286397Z",
     "iopub.status.busy": "2026-10-02T14:42:23.286265Z",
     "iopub.status.idle": "2026-10-02T14:42:23.289005Z",
     "shell.execute_reply": "2026-10-02T14:42:23.288357Z"
    },
    "papermill": {
     "duration": 0.005005,
     "end_time": "2026-10-02T14:42:23.289662+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:42:23.284657+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[-3.74515373]\n"
     ]
    }
   ],
   "source": [
    "print(prob.get_val('x'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "d5ac80a6",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:42:23.293091Z",
     "iopub.status.busy": "2026-10-02T14:42:23.292924Z",
     "iopub.status.idle": "2026-10-02T14:42:23.296860Z",
     "shell.execute_reply": "2026-10-02T14:42:23.296054Z"
    },
    "papermill": {
     "duration": 0.006469,
     "end_time": "2026-10-02T14:42:23.297403+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:42:23.290934+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(0.0)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from openmdao.utils.assert_utils import assert_near_equal\n",
    "assert_near_equal(prob.get_val('x')[0], -3.7451537261581453, 1e-6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1576c61e",
   "metadata": {
    "papermill": {
     "duration": 0.001533,
     "end_time": "2026-10-02T14:42:23.300426+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:42:23.298893+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "celltoolbar": "Tags",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.13.14"
  },
  "orphan": true,
  "papermill": {
   "default_parameters": {},
   "duration": 4.105274,
   "end_time": "2026-10-02T14:42:23.916792+00:00",
   "environment_variables": {},
   "exception": null,
   "input_path": "/home/runner/work/OpenMDAO/OpenMDAO/openmdao/docs/openmdao_book/features/building_blocks/solvers/brent.ipynb",
   "output_path": "/home/runner/work/OpenMDAO/OpenMDAO/openmdao/docs/_executed_book/features/building_blocks/solvers/brent.ipynb",
   "parameters": {},
   "start_time": "2026-10-02T14:42:19.811518+00:00",
   "version": "2.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}