Select Git revision
regressionLin.c
regressionLin.c 1.74 KiB
#include "regressionLin.h"
point findBestDroite(vector pts){
// dans le cas que l'on a vu en exercice on peut directement dire :
// car c'est la même fonction de base
double gA=0; // somme des xi ^2
double gB=0; // somme des xi
double gC=0; // sommes des xi*yi
double gD=0; // somme des yi
double gN=pts.length; // nombre de points
for(int i = 0; i < pts.length; i++){
gA += pts.content[i].x * pts.content[i].x;
gB += pts.content[i].x;
gC += pts.content[i].x * pts.content[i].y;
gD += pts.content[i].y;
}
double numerateur=gC * gN - gB * gD;
double denominateur=gA * gN - gB * gB; // pas possible si = 0
double a = numerateur / denominateur;
double b = ( gC - a * gA ) / gB;
point d;
d.x=a;
d.y=b;
return d;
}
point descenteGradient(double precision, point drt, vector pts){
point pt;
pt.x = drt.x;
pt.y = drt.y;
double gradientx = 0;
double gradienty = 0;
double oldptx = 0;
double oldpty = 0;
double testSortie=1;
double lambda = 0.0001;
while(testSortie > precision){
gradientx = 0;
gradienty = 0;
testSortie = 0;
//pt.x est a et pt.y est b
for(int i = 0; i < pts.length; i++){
gradientx += (pow(pts.content[i].x, 2) * pt.x) + (pt.y * pts.content[i].x) - (pts.content[i].x * pts.content[i].y);
gradienty += (pt.x * pts.content[i].x) + pt.y - pts.content[i].y;//pt.y*pts.length
}
gradientx = gradientx * 2;
gradienty = gradienty * 2;
oldptx = pt.x;
oldpty = pt.y;
pt.x = oldptx - (lambda * gradientx);
// printf("ptx : %f\n",pt.x);
pt.y = oldpty - (lambda * gradienty);
// printf("pty : %f\n",pt.y);
//Sortie
testSortie = sqrt(pow(pt.x - oldptx,2) + pow(pt.y - oldpty,2));
// printf("%f\n",testSortie);
}
return pt;
}