{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "0f3d07ef-5267-4715-9819-51aba110dce1",
   "metadata": {},
   "outputs": [],
   "source": [
    "import lmfit\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2d951f03-8a2e-4941-b077-777a0a796e42",
   "metadata": {},
   "source": [
    "lavoreremo in unità atomiche:\n",
    "https://en.wikipedia.org/wiki/Atomic_units"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "d6fb3614-9839-4969-9344-77e7f160e40f",
   "metadata": {},
   "outputs": [],
   "source": [
    "U_cm_1=5.2917721e-09\n",
    "U_c=137.036\n",
    "U_amu=1822.89\n",
    "U_h=2.0*np.pi\n",
    "U_angs=1.8897261\n",
    "U_eV=1/27.211386\n",
    "U_kJ_mol=1/2625.4996\n",
    "conv_v=U_cm_1*U_c*U_h\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "f36ff7a0-e882-48b6-8364-5fa0c1603bea",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.009765046635958882, 0.019408985880292336)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "w1_CO=2143.18*conv_v\n",
    "w2_CO=4259.78*conv_v\n",
    "mu_CO=(12.0+15.999)*U_amu\n",
    "w1_CO,w2_CO"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "e861dd53-67a8-441e-8ec1-9ad91596cf05",
   "metadata": {},
   "outputs": [],
   "source": [
    "#livelli energetici, tratti da https://en.wikipedia.org/wiki/Morse_potential\n",
    "def energy_levels(alpha, De, mu):\n",
    "    w0=alpha*np.sqrt(2*De/mu)\n",
    "    wm_a=w0*(np.arange(3)+1/2)\n",
    "    return wm_a-wm_a**2/4/De\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "adda19e6-fd9c-4328-86da-3b582b889703",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.00121278, 0.00340324, 0.0052802 ])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "energy_levels(4.0, 1e-2, mu_CO)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "24b17e30-a6a9-4b21-b240-847a3efcc4c5",
   "metadata": {},
   "outputs": [],
   "source": [
    "def obj_fun(parms, mu):\n",
    "    wm_a=energy_levels(parms['alpha'].value, parms['De'].value, mu)\n",
    "    w1=wm_a[1]-wm_a[0]\n",
    "    w2=wm_a[2]-wm_a[0]\n",
    "    return (w1-w1_CO)**2+(w2-w2_CO)**2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "518f9dc6-a912-4f99-92fb-a8962b620d3c",
   "metadata": {},
   "outputs": [],
   "source": [
    "parms_CO=lmfit.create_params(alpha=4.0, De=1.0e-2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "87ae1f20-db9c-4257-8648-a1db33939fe6",
   "metadata": {},
   "outputs": [],
   "source": [
    "fit_result=lmfit.minimize(obj_fun, parms_CO, method='bfgs', args=[mu_CO],\n",
    "                         tol=1e-11)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "be25207b-3d8b-4f65-9984-f372186adc48",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<h2>Fit Result</h2> <table class=\"jp-toc-ignore\"><caption class=\"jp-toc-ignore\">Fit Statistics</caption><tr><td style='text-align:left'>fitting method</td><td style='text-align:right'>BFGS</td></tr><tr><td style='text-align:left'># function evals</td><td style='text-align:right'>414</td></tr><tr><td style='text-align:left'># data points</td><td style='text-align:right'>1</td></tr><tr><td style='text-align:left'># variables</td><td style='text-align:right'>2</td></tr><tr><td style='text-align:left'>chi-square</td><td style='text-align:right'> 5.8989e-31</td></tr><tr><td style='text-align:left'>reduced chi-square</td><td style='text-align:right'> 5.8989e-31</td></tr><tr><td style='text-align:left'>Akaike info crit.</td><td style='text-align:right'>-65.6053787</td></tr><tr><td style='text-align:left'>Bayesian info crit.</td><td style='text-align:right'>-69.6053787</td></tr></table><table class=\"jp-toc-ignore\"><caption>Parameters</caption><tr><th style='text-align:left'>name</th><th style='text-align:left'>value</th><th style='text-align:left'>initial value</th><th style='text-align:left'>min</th><th style='text-align:left'>max</th><th style='text-align:right'>vary</th></tr><tr><td style='text-align:left'>alpha</td><td style='text-align:left'> 2.48684028</td><td style='text-align:left'>4.0</td><td style='text-align:left'>       -inf</td><td style='text-align:left'>        inf</td><td style='text-align:right'>True</td></tr><tr><td style='text-align:left'>De</td><td style='text-align:left'> 0.40331053</td><td style='text-align:left'>0.01</td><td style='text-align:left'>       -inf</td><td style='text-align:left'>        inf</td><td style='text-align:right'>True</td></tr></table>"
      ],
      "text/plain": [
       "<lmfit.minimizer.MinimizerResult at 0x7f453c821160>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fit_result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "0130328e-62d4-4499-bcc7-367f5359c976",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table class=\"jp-toc-ignore\"><caption>Parameters</caption><tr><th style='text-align:left'>name</th><th style='text-align:left'>value</th><th style='text-align:left'>initial value</th><th style='text-align:left'>min</th><th style='text-align:left'>max</th><th style='text-align:right'>vary</th></tr><tr><td style='text-align:left'>alpha</td><td style='text-align:left'> 2.48684028</td><td style='text-align:left'>4.0</td><td style='text-align:left'>       -inf</td><td style='text-align:left'>        inf</td><td style='text-align:right'>True</td></tr><tr><td style='text-align:left'>De</td><td style='text-align:left'> 0.40331053</td><td style='text-align:left'>0.01</td><td style='text-align:left'>       -inf</td><td style='text-align:left'>        inf</td><td style='text-align:right'>True</td></tr></table>"
      ],
      "text/plain": [
       "Parameters([('alpha', <Parameter 'alpha', value=np.float64(2.4868402786074983), bounds=[-inf:inf]>), ('De', <Parameter 'De', value=np.float64(0.403310525222541), bounds=[-inf:inf]>)])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fit_result.params"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "077093bf-738e-41a7-b079-6bd47eb4312a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(7.680403738808353e-16)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "obj_fun(fit_result.params, mu_CO)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "c5cd4df3-d86a-4433-9089-93e178396e1a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.00492797, 0.01469305, 0.02433695])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p=fit_result.params\n",
    "el=energy_levels(p['alpha'].value, p['De'].value, mu_CO)\n",
    "el"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "bc9f3b33-d886-4433-a3fe-5b5aee62e966",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(np.float64(0.009765071278924427), 0.009765046635958882)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "el[1]-el[0], w1_CO"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "55ecbada-efe8-45e0-bc5b-5b743e35ec9a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(np.float64(0.01940897320099334), 0.019408985880292336)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "el[2]-el[0], w2_CO"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "70682c90-9bf8-4686-8be3-93d5b505ce32",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(4.6994469810158614)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p['alpha'].value*U_angs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "1bee6fc3-9c8c-4bef-be13-4e78d9924f5e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(1058.8916226475715)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p['De'].value/U_kJ_mol"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "4c1a2261-aaf3-4d53-80fb-9024b8f0dcdc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(10.9746383796933)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p['De'].value/U_eV"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8ea8e791-c962-4727-81dd-7d508dd536d6",
   "metadata": {},
   "source": [
    "## esercizi:\n",
    "1. aggiungete un grafico della curva di morse corrispondente\n",
    "2. applicate i parametri per HCl"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d1a5a9f8-0c56-41c1-9a57-210a16c9250d",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "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.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
