La retta dei minimi quadrati

Riferimento:
G.C. Barozzi: Primo Corso di Analisi Matematica
Zanichelli (Bologna), 1998, ISBN 88-08-01169-0, Esempio 4.4-8, Laboratorio 4.1-1.

Costruzione del quadrato che ha un vertice in un assegnato punto (x, y ) e un secondo vertice, allineato in verticale col precedente, nel punto (x, ys):

\(vertQuad[{x_, y_, ys_}] := 
	
      Module[{d = ys - y}, 

        	{{x, y}, {x, ys}, {x + d, ys}, {x + d, y}, {x, y}}]\)

Costruzione dei punti "sperimentali": i punti sono distribuiti approssimativamente attorno alla retta di equazione y 
= mp*x + qp

dati[mp_, qp_, n_] :=  
      Table[{x +  .5*( Random[] - 0.5), 
          (mp*x + qp) + 1.5 ( Random[] - 0.5)}, {x, 0, n}]

Ad esempio:

punti  =  dati[0.2, 1, 6]

Coordinate del baricentro:

xbar  =  Apply[Plus, First[Transpose[punti]]]/Length[punti]

ybar  =  Apply[Plus, Last[Transpose[punti]]]/Length[punti]

Visualizzazione dei quadrati delle distanze (misurate in verticale) tra i punti dati e la retta di equazione y = m*x + q:

\(\(\ minimiQuadrati[m_, q_, punti_] := 
	
      Module[{ascisse, \ ordinate, \ ordinateRetta, \ sommaQuadrati, \ terne, 
          retta, quadrati}, 
		ascisse\  = \ First[Transpose[punti]]; 

        		ordinate\  = \ Last[Transpose[punti]]; 
		
        ordinateRetta\  = \ Map[\((m*\ # + q)\)&, \ ascisse]; 
		
        sommaQuadrati\  = \ Apply[Plus, \((ordinate - ordinateRetta)\)^2]; 

        		terne\  = \ Transpose[{ascisse, ordinate, ordinateRetta}]; 
		
        quadrati\  = \ Map[vertQuad, terne]; 
		
        retta\  = \ 
          Plot[m*x + q, \ {x, \(-1\), 8}, 
			
            DisplayFunction -> Identity]; 
		
        Show[
			{retta, 
				
            Graphics[{RGBColor[1, 1, 0], \ Map[Polygon, quadrati]}], 

            				Graphics[{RGBColor[1, 0, 0], Map[Line, quadrati]}], 

            				Graphics[

              							{RGBColor[0, 0, 1], PointSize[0.015], \ \ 
                Map[Point, punti]}], 
				
            Graphics[

              							{RGBColor[1, 0, 0], PointSize[0.02], \ \ 
                Point[{xbar, ybar}]}], 
				
            Graphics[{RGBColor[1, 1, 0], 
						\ 
                Polygon[{{0, \(-1\)}, {sommaQuadrati, \(-1\)}, {
                      sommaQuadrati, \(-2\)}, {0, \(-2\)}}]}], 	
				
            Graphics[{RGBColor[1, 0, 0], 
						\ 
                Line[{{0, \(-1\)}, {sommaQuadrati, \(-1\)}, {sommaQuadrati, 
                      \(-2\)}, {0, \(-2\)}, {0, \(-1\)}}]}]				
			}, 
          
			DisplayFunction -> $DisplayFunction, 
		
          AspectRatio -> Automatic, Axes -> Automatic, 
			
          PlotRange -> {{\(-1\), 8}, {\(-3\), 5}}, 
Frame -> True, 
          \ ImageSize -> {400, 400}]
	]
		\)\)

Esempio:

minimiQuadrati[0.3, 1,  punti];

Prima animazione: spostiamo la retta parallelamente a se stessa (m fissato):

animazione1 =  
      Table[minimiQuadrati[0.2, q, punti], {q, 0.6, 1.5, 0.05}];

Commento: la somma dei quadrati, fissato il coefficiente angolare m, è minima quando la retta passa per il baricentro dei punti dati.
Seconda animazione: la retta varia nel fascio di centro il baricentro dei punti dati.

animazione2 =  
      Table[minimiQuadrati[m, ybar  -  m*xbar, punti], {m, 0. , 0.4, 
          0.01}];