Sia data una lista di punti, ricavati da un sistema ingresso/uscita. Imposto un dato ingresso, leggo una data uscita e salvo tale punto. Ricavo una curva nel piano.
Mi chiedo se tali punti sono caratterizzabili mediante un polinomio di terzo grado, ovvero dati n punti se posso scrivere il seguente sistema:
Dove a,b,c,d sono le incognite ed i punti sono noti.
Si può facilmente riscrivere l'equazione in forma matriciale:
Chiamando in modo intuitivo le tre matrici ricaviamo che:
Quindi, supponendo n > 4 e rango della matrice dei punti piena (supposizioni facilmente verificate), si conclude con:
Riporto un brevissimo esempio di utilizzo della classe da me creata per il calcolo della regressione cubica con zero-crossing (ovvero imponendo il passaggio per l'origine, ovvero con d = 0).
//Load and print list of points
std::list<Point> points;
Point::load("samples.txt", points);
print(points, 5);
//Cubic regression
Matrix M;
M = CubicRegression(points, true);
std::cout << "Cubic regression, M:\n";
print(M);
std::cout<<"\n";
L'ouput dell'esempio sarà il seguente:
[ 0.10000 ; 0.32690 ]
[ 0.20000 ; 0.70400 ]
[ 0.30000 ; 1.13830 ]
[ 0.40000 ; 1.63680 ]
[ 0.50000 ; 2.20620 ]
[ 0.60000 ; 2.85360 ]
[ 0.70000 ; 3.58570 ]
[ 0.80000 ; 4.40960 ]
[ 0.90000 ; 5.33200 ]
Cubic regression, M:
1.150
2.170
3.040
0.000