"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Često se pri raznim mjerenjima pojavljuje veliki broj podataka. Da bi lakše protumačili te podatke pribjegava se grafičkom predstavljanju tih podataka. Na primjer pri izvodjenju nekog eksperimenta dobijeni su podaci \n",
"$$(x_0,y_0),\\,(x_1,y_1),\\dots,(x_7,y_7).$$\n",
"\n",
"Ovakve podatke moguće je predstaviti grafikom, na primjer kao na sljedećoj slici.\n",
"\n",
"\n",
"
\n",
"
Podaci iz prethodne tabele predstavljeni grafički
\n",
"
\n",
"\n",
"Na prvi pogled grafik linearne funkcije najbolje bi odgovara ovim eksperimentalnim podacima. Sljedeći korak bi bio da odredimo linearnu funkciju \n",
"\n",
"$$y=ax+b,$$ \n",
"\n",
"odnosno koeficijente $a$ i $b.$ Postavlja se pitanje: Koja je to prava koja je najbliže prolazi predstavljenim tačkama $(x_0,y_0)-(x_7,y_7)?$ ili u opštem slučaju tačkama $(x_0,y_0)-(x_n,y_n)?$ Pretpostavimo da su $a$ i $b$ tražene vrijednosti. Neka je $(x_k,y_k)$ jedna od datih tačaka i neka kroz ovu tačku ne prolazi prava $y=ax+b,$ tada je $y_k\\neq ax_k+b,$ tj. $y_k-a x_k-b\\neq 0.$ \n",
"\n",
"\n",
"Da bi izračunali $a$ i $b$ posmatrajmo funkciju \n",
"$$\\varphi(a,b)=\\sum_{k=0}^{n}(ax_k+b-y_k)^2. \\:(\\star)$$ \n",
"\n",
"\n",
"Ako greška ima normalnu statističku raspodjelu, onda minimizacijom funkcije $\\varphi$ dobijamo najbolje procjena za $a$ i $b.$ Računanje parametara $a$ i $b$ na ovakav način, odnosno linearne funkcije kojom ćemo aproksimirati naziva se $l_2$ aproksimacija.
\n",
"\n",
"\n",
"
\n",
" Napomena. Norma $l_p$ definisana je na sljedeći način \n",
"$$ || x ||_p=\\left\\{ \\sum_{i=1}^{n}|x_i|^p \\right\\}^{1/p},\\:1\\leqslant p<\\infty,$$\n",
"za neki vektor $x=(x_1,\\ldots,x_n)^T.$\n",
"
\n",
"\n",
"Odredimo sada minimum funkcije $\\varphi.$ Potrebni uslovi za minimum funkcije $\\varphi$ su\n",
"\n",
"$$ \\frac{\\partial \\varphi}{\\partial a}=0,\\quad \\frac{\\partial \\varphi}{\\partial b}=0,$$ \n",
"\n",
"računajući prethodne uslove dobijamo\n",
"\n",
"\\begin{align*}\n",
" \\sum_{k=0}^{n}{2(ax_k+b-y_k)x_k}=&0\\\\\n",
" \\sum_{k=0}^{n}{2(ax_k+b-y_k)}=&0 , \n",
"\\end{align*}\n",
"\n",
"Prethodne jednačine su po nepoznatim $a$ i $b$ i možemo ih napisati u obliku\n",
"\n",
"\n",
"\\begin{align}\n",
"\\left(\\sum_{k=0}^{n}{x^2_k}\\right)a+ \\left(\\sum_{k=0}^{n}{x_k}\\right)b=&\\sum_{k=0}^{n}{x_k y_k}\\\\ \n",
"\\left(\\sum_{k=0}^{n}{x_k}\\right)a+ (n+1)b=&\\sum_{k=0}^{n}{y_k}, \n",
"\\end{align}\n",
"\n",
"\n",
"gdje je $\\sum_{k=0}^{n}{1}=n+1.$\n",
"\n",
"\n",
"Rješenje prethodnog sistema je \n",
"\n",
"\n",
"\n",
"\\begin{align*}\n",
" a=& \\frac{1}{d}\\left[(n+1)\\sum_{k=0}^{n}{x_k y_k}-\\left(\\sum_{k=0}^{n}{x_k}\\right)\\left(\\sum_{k=0}^{n} {y_k}\\right) \\right] \\\\\n",
" b=&\\frac{1}{d}\\left[\\left(\\sum_{k=0}^{n} {x^2_k}\\right)\\left(\\sum_{k=0}^{n} {y_k}\\right) \n",
" -\\left(\\sum_{k=0}^{n}{x_k}\\right)\\left(\\sum_{k=0}^{n} {x_ky_k}\\right) \\right], \n",
"\\end{align*}\n",
"\n",
"\n",
"gdje je $$d=(n+1)\\sum_{k=0}^{n}{x^2_k}-\\left(\\sum_{k=0}^{n}{x_k^2 }\\right)^2.$$ \n",
"\n",
"\n",
"\n",
"\n",
"\n",
"
\n",
" Zadatak. Izračunati za podatke \n",
" $(0.5,2.25),(1,3.7),\\,(2,4.1),\\,(2.5,4.3),\\,(3,5);$ linearnu funkciju $y=ax+b $ metodom najmanjih kvadrata.\n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Umjesto računanja linearne funkcije $y=ax+b,$ metoda najmanjih kvadrata može se poopštiti na računanje funkcije $$y=\\sum_{j=0}^{m}{c_jg_j(x)}$$ kojom ćemo predstaviti podatke koji su nam na raspolaganju. Funkcije $g_0,\\ldots,g_m$ su poznate, fiksirane i linearno nezavisne. Koeficijente $c_0,\\ldots,c_m$ ponovo treba izračunati koristeći prethodno izloženi princip najmanjih kvadrata. Drugim riječima, ponovo su poznate kordinate tačaka $(x_k,y_k),\\,i=0,\\ldots,n;$ koje smo dobili mjerenjem, eksperimentalno ili na neki drugi način, i cilj nam je izračunati koeficijente $c_0,\\ldots,c_m;$ tako da funkcija \n",
"\\begin{equation}\n",
"\\varphi(c_0,\\ldots,c_m)=\\sum_{k=0}^{n}{\\left[ \\sum_{j=0}^{m}{c_jg_j(x_k)-y_k}\\right]^2 } \n",
"\\label{funkcija1}\n",
"\\end{equation}\n",
"ima što je moguće manju vrijednost. Potrebni uslovi za dobijanje minimuma funkcije $\\varphi$ su \n",
"$$ \\frac{\\partial \\varphi}{\\partial c_i}=0,\\:i=0,\\ldots,m$$\n",
"gdje su \n",
"$$\\frac{\\partial \\varphi}{\\partial c_i}=\\sum_{k=0}^{n}{2\\left[\\sum_{j=0}^{m}{c_jg_j(x_k)-y_k} \\right]}g_i(x_k),\\:i=0,\\ldots,m.$$\n",
"Na kraju dobijamo\n",
"$$ \\sum_{j=0}^{m}{\\left[ \\sum_{k=0}^{n}{g_i(x_k)g_j(x_k)}\\right]c_j}= \\sum_{k=0}^{n}{y_kg_i(x_k)},\\:i=0,\\ldots,m.$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
\n",
" Zadatak. Izračunati za podatke $(-1.5,2.3),\\, (-1,1.1),\\,(-0.5,0.24),\\,(0,0.01),\\,(0.5,0.26),\\,(1,1.2),\\,(1.5,2.25)$ kvadratnu funkciju $y=c_2x^2+c_1x+c_0$ metodom najmanjih kvadrata.\n",
"
"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"from IPython import get_ipython; # briše varijable, funkcije ...\n",
"get_ipython().magic('reset -sf') #\n",
"\n",
"import numpy as np\n",
"from matplotlib import pyplot\n",
"from numpy import linalg\n",
"from numpy import polynomial\n",
"from matplotlib import rc\n",
"\n",
"pyplot.style.use('tableau-colorblind10')\n",
"newparams={'figure.figsize':(15,8),'font.size': 13,'axes.grid': True,'lines.markersize':10, 'lines.linewidth':2,'figure.dpi':300}\n",
"pyplot.rcParams.update(newparams)\n",
"\n",
"xdata=np.array([-1.5,-1,-.5,0,.5 ,1,1.5])\n",
"ydata=np.array([2.3,1.1,.24,.01,.26,1.2,2.25])\n",
"\n",
"brojTacaka=len(xdata)\n",
"brojBaznih=3\n",
"\n",
"matricaBaznih=np.zeros((brojBaznih,brojTacaka))\n",
"matricaSistema=np.zeros((brojBaznih,brojBaznih))\n",
"vektorSlob=np.zeros(brojBaznih)\n",
"\n",
"def bazne(x,stepen):\n",
" return x**stepen\n",
"\n",
"for i in range(brojBaznih):\n",
" for j in range(brojTacaka):\n",
" matricaBaznih[i,j]=bazne(xdata[j],i)\n",
" \n",
"for i in range(brojBaznih):\n",
" for j in range(brojBaznih):\n",
" for k in range(brojTacaka):\n",
" matricaSistema[i,j]=matricaSistema[i,j]+matricaBaznih[i,k]*matricaBaznih[j,k]\n",
"\n",
"for i in range(brojBaznih):\n",
" for k in range(brojTacaka):\n",
" vektorSlob[i]=vektorSlob[i]+ydata[k]*matricaBaznih[i,k] \n",
" \n",
"koeficijenti=linalg.solve(matricaSistema,vektorSlob) \n",
"\n",
"pol=np.polynomial.Polynomial(koeficijenti)\n",
"\n",
"iks=np.linspace(min(xdata),max(xdata),250)\n",
"y=pol(iks)\n",
"fig=pyplot.subplot()\n",
"pyplot.plot(xdata,ydata,'o',markersize=10)\n",
"pyplot.plot(iks,y) \n",
"pyplot.legend(('Podaci','polinom $p_{10}$'),loc='upper center');\n",
"pyplot.savefig('/home/samir/Dropbox/Python/Zadaci/Slike/najmanji4d.png')\n",
"#pyplot.xlabel(' Broj tačaka je %i'%len(xdata));\n",
"#pyplot.show()\n",
"pyplot.close()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
\n",
"
Konstrukcija polinoma $p_2(x)=c_2x²+c_1x+c_0$ za uzorak od 7 tačaka
\n",
"
\n",
"
\n",
"
Konstrukcija polinoma $p_2(x)=c_2x²+c_1x+c_0$ za uzorak od 200 tačaka
\n",
"
\n",
"
\n",
"
Konstrukcija polinoma $p_3(x)=c_3x^3+c_2x^2+c_1x+c_0$ za uzorak od 200 tačaka
\n",
"
\n",
"
\n",
"
Konstrukcija polinoma $p_4(x)=c_4x^4+c_3x^3+c_2x^2+c_1x+c_0$ za uzorak od 200 tačaka
\n",
"
\n",
"
\n",
"
Konstrukcija polinoma $p_5(x)=c_5x^5+c_4x^4+c_3x^3+c_2x^2+c_1x+c_0$ za uzorak od 200 tačaka
\n",
"
\n",
"\n",
"\n",
"\n",
"\n",
"
\n",
"
Konstrukcija polinoma $p_{10}$ za uzorak od 500 tačaka