{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "La formula per il fit di un set di dati con una retta usando SymPy\n", "===================================================================\n", "

" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from sympy import *" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La somma degli scarti di dati $(x_i,y_i)$ (pesati con l'errore $\\sigma_i$ sugli $y_i$) rispetto una linea $y = b \\cdot x + a$ è:\n", "$$ \\chi^2 = \\sum_i \\frac{(y_i - b \\cdot x_i - a)^2}{\\sigma_i^2} $$\n", "\n", "Per trovare il minimo di questa espressione al variare di $b$ e $a$, cerchiamo gli zeri contemporanei delle derivate di $\\chi^2$ rispetto ad $a$ e rispetto a $b$, generalizzando in modo ovvio la formula per gli estremi in una variabile.
\n", "È sufficiente limitarsi al caso di tre sole misure e poi generalizzare. \n", "\n", "__Domanda:__ Perchè tre misure e non una oppure due?" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "x1,x2,x3,y1,y2,y3,a,b,sq1,sq2,sq3 = symbols('x1 x2 x3 y1 y2 y3 a b sq1 sq2 sq3')" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "chi2 = (y1 - b*x1 - a)**2/sq1 + (y2 - b*x2 - a)**2/sq2 + (y3 - b*x3 - a)**2/sq3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Derivata rispetto ad a:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle \\frac{2 a + 2 b x_{3} - 2 y_{3}}{sq_{3}} + \\frac{2 a + 2 b x_{2} - 2 y_{2}}{sq_{2}} + \\frac{2 a + 2 b x_{1} - 2 y_{1}}{sq_{1}}$" ], "text/plain": [ "(2*a + 2*b*x3 - 2*y3)/sq3 + (2*a + 2*b*x2 - 2*y2)/sq2 + (2*a + 2*b*x1 - 2*y1)/sq1" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chi2_prime_a = diff(chi2,a)\n", "chi2_prime_a" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Espandiamo il risultato per poi estrarre i coefficienti di a e b:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle \\frac{2 a}{sq_{3}} + \\frac{2 a}{sq_{2}} + \\frac{2 a}{sq_{1}} + \\frac{2 b x_{3}}{sq_{3}} + \\frac{2 b x_{2}}{sq_{2}} + \\frac{2 b x_{1}}{sq_{1}} - \\frac{2 y_{3}}{sq_{3}} - \\frac{2 y_{2}}{sq_{2}} - \\frac{2 y_{1}}{sq_{1}}$" ], "text/plain": [ "2*a/sq3 + 2*a/sq2 + 2*a/sq1 + 2*b*x3/sq3 + 2*b*x2/sq2 + 2*b*x1/sq1 - 2*y3/sq3 - 2*y2/sq2 - 2*y1/sq1" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chi2_prime_a_expand = expand(chi2_prime_a)\n", "chi2_prime_a_expand" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle a \\left(\\frac{2}{sq_{3}} + \\frac{2}{sq_{2}} + \\frac{2}{sq_{1}}\\right) + b \\left(\\frac{2 x_{3}}{sq_{3}} + \\frac{2 x_{2}}{sq_{2}} + \\frac{2 x_{1}}{sq_{1}}\\right) - \\frac{2 y_{3}}{sq_{3}} - \\frac{2 y_{2}}{sq_{2}} - \\frac{2 y_{1}}{sq_{1}}$" ], "text/plain": [ "a*(2/sq3 + 2/sq2 + 2/sq1) + b*(2*x3/sq3 + 2*x2/sq2 + 2*x1/sq1) - 2*y3/sq3 - 2*y2/sq2 - 2*y1/sq1" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "collect(chi2_prime_a_expand,(a,b))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Derivata rispetto a b:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle - \\frac{2 x_{3} \\left(- a - b x_{3} + y_{3}\\right)}{sq_{3}} - \\frac{2 x_{2} \\left(- a - b x_{2} + y_{2}\\right)}{sq_{2}} - \\frac{2 x_{1} \\left(- a - b x_{1} + y_{1}\\right)}{sq_{1}}$" ], "text/plain": [ "-2*x3*(-a - b*x3 + y3)/sq3 - 2*x2*(-a - b*x2 + y2)/sq2 - 2*x1*(-a - b*x1 + y1)/sq1" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chi2_prime_b = diff(chi2,b)\n", "chi2_prime_b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Espandiamo e estraiamo i coefficienti di a e b:" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle \\frac{2 a x_{3}}{sq_{3}} + \\frac{2 a x_{2}}{sq_{2}} + \\frac{2 a x_{1}}{sq_{1}} + \\frac{2 b x_{3}^{2}}{sq_{3}} + \\frac{2 b x_{2}^{2}}{sq_{2}} + \\frac{2 b x_{1}^{2}}{sq_{1}} - \\frac{2 x_{3} y_{3}}{sq_{3}} - \\frac{2 x_{2} y_{2}}{sq_{2}} - \\frac{2 x_{1} y_{1}}{sq_{1}}$" ], "text/plain": [ "2*a*x3/sq3 + 2*a*x2/sq2 + 2*a*x1/sq1 + 2*b*x3**2/sq3 + 2*b*x2**2/sq2 + 2*b*x1**2/sq1 - 2*x3*y3/sq3 - 2*x2*y2/sq2 - 2*x1*y1/sq1" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chi2_prime_b_expand = expand(chi2_prime_b)\n", "chi2_prime_b_expand" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle a \\left(\\frac{2 x_{3}}{sq_{3}} + \\frac{2 x_{2}}{sq_{2}} + \\frac{2 x_{1}}{sq_{1}}\\right) + b \\left(\\frac{2 x_{3}^{2}}{sq_{3}} + \\frac{2 x_{2}^{2}}{sq_{2}} + \\frac{2 x_{1}^{2}}{sq_{1}}\\right) - \\frac{2 x_{3} y_{3}}{sq_{3}} - \\frac{2 x_{2} y_{2}}{sq_{2}} - \\frac{2 x_{1} y_{1}}{sq_{1}}$" ], "text/plain": [ "a*(2*x3/sq3 + 2*x2/sq2 + 2*x1/sq1) + b*(2*x3**2/sq3 + 2*x2**2/sq2 + 2*x1**2/sq1) - 2*x3*y3/sq3 - 2*x2*y2/sq2 - 2*x1*y1/sq1" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "collect(chi2_prime_b_expand,(a,b))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A questo punto è facile scrivere l'equazione matriciale che determina $a$ e $b$:\n", "\n", "$$\n", "\\begin{bmatrix}\n", "\\sum \\frac{1}{\\sigma_i^2} & \\sum \\frac{x_i}{\\sigma_i^2} \\\\\n", "\\sum \\frac{x_i}{\\sigma_i^2} & \\sum \\frac{x^2_i}{\\sigma_i^2}\n", "\\end{bmatrix}\n", "\\begin{bmatrix} a \\\\ b\n", "\\end{bmatrix}\n", "= \n", "\\begin{bmatrix} \n", "\\sum \\frac{y_i}{\\sigma_i^2} \\\\ \\sum \\frac{x_i y_i}{\\sigma_i^2} \n", "\\end{bmatrix}\n", "$$\n", "\n", "$$\n", "\\begin{bmatrix}\n", "Sinv & Sx \\\\\n", "Sx & Sxsq\n", "\\end{bmatrix}\n", "\\begin{bmatrix} a \\\\ b\n", "\\end{bmatrix}\n", "= \n", "\\begin{bmatrix} \n", "Sy \\\\ Sxy\n", "\\end{bmatrix}\n", "$$\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{a: (-Sx*Sxy + Sxsq*Sy)/(Sinv*Sxsq - Sx**2),\n", " b: (Sinv*Sxy - Sx*Sy)/(Sinv*Sxsq - Sx**2)}" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a, b, Sinv, Sx, Sxsq, Sy, Sxy = symbols('a b Sinv Sx Sxsq Sy Sxy')\n", "\n", "eq1 = Sinv*a + Sx*b - Sy\n", "eq2 = Sx*a + Sxsq*b -Sxy\n", "\n", "solve((eq1,eq2),a,b)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nel caso particolare in cui tutti i $\\sigma_i$ sono uguali, definendo $\\bar{u} = \\sum u_i /N$ ($u = 1,x,y,xy$)\n", "l'equazione che determina $a, b$ diventa:
\n", " \n", "$$\n", "M \\begin{bmatrix} a \\\\ b\n", "\\end{bmatrix}\n", "=\n", "\\begin{bmatrix}\n", "1 & \\overline{x_i} \\\\\n", "\\overline{x} & \\overline{x^2}\n", "\\end{bmatrix}\n", "\\begin{bmatrix} a \\\\ b\n", "\\end{bmatrix}\n", "= \n", "\\begin{bmatrix} \n", "\\overline{y} \\\\ \\overline{xy} \n", "\\end{bmatrix},\n", "\\qquad\n", "M^{-1} = \\frac{1}{\\Delta} \\begin{bmatrix}\n", "\\overline{x^2} & -\\overline{x_i} \\\\\n", "-\\overline{x} & 1\n", "\\end{bmatrix},\\,\\, \\Delta=\\overline{x^2}-\\overline{x}^2\n", "$$\n", "
\n", "con soluzione $a = (\\overline{x^2}\\cdot \\overline{y}-\\overline{x}\\cdot\\overline{xy})/\\Delta$, \n", " $b = (\\overline{xy}-\\overline{x}\\cdot\\overline{y})/\\Delta$\n", "
\n", "È facile mostrare che il punto $(\\overline{x},\\overline{y})$ appartiene alla retta di fit cioè che\n", " $ \\overline{y} = b \\cdot \\overline{x} +a $.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.7.3" } }, "nbformat": 4, "nbformat_minor": 4 }