Oleksy_Adam napisał(a)
Wzór który zastosowałeś jest niezbyt prawidłowy. Regresja liniowa polega na tym, że prowadzisz prostą pomiędzy rozproszonymi punktami. Jak wiadomo prosta ma tylko współczynniki A i B. Kiedyś napisałem w pascalu procedurkę do obliczania regresji liniowej. Jeżeli będziesz miał kłopoty z przetłumaczeniem na C to pomogę.
PROCEDURE RegLin(DBx, DBy :ARRAY OF Double; VAR A, B :Double);
VAR SigX, SigY :Double;
SigXY :Double;
SigSqrX :Double;
n, i :Word;
BEGIN
n := High(DBx)+1;
SigX := 0; SigY := 0;
SigXY := 0;
SigSqrX := 0;
FOR i := 0 TO n-1 DO
BEGIN
SigX := SigX + DBx[i];
SigY := SigY + DBy[i];
SigXY := SigXY + (DBx[i]*DBy[i]);
SigSqrX := SigSqrX + Sqr(DBx[i]);
END;
A := (n*SigXY - SigX*SigY) / (n*SigSqrX - Sqr(Sigx));
B := 1/n * (SigY - A*SigX);
END;
W linijce SigSqrX := SigSqrX + Sqr(DBx[i]);
powinna być potęga...
poniżej funkcja w Qt - może się komuś przyda....
QPair<float,float> interpolacja(const QPolygonF polygon)
{
QPair<float,float> wsp;
int n=polygon.size();
float SigX = 0., SigY = 0.;
float SigXY = 0.;
float SigSqrX = 0.;
float A,B;
for(int i=0;i<n;i++)
{
SigX = SigX + polygon[i].x();
SigY = SigY + polygon[i].y();
SigXY = SigXY + (polygon[i].x()*polygon[i].y());
SigSqrX = SigSqrX + pow(polygon[i].x(),2);
A = ((n*SigXY) - (SigX*SigY)) / ((n*SigSqrX) - sqrt(SigX));
B = 1./n * (SigY - (A*SigX));
}
wsp.first=A;
wsp.second=B;
return wsp;
}
<i>//q: nie no, nie przeginajmny. Co to ma wspolnego z QT? to że pair<>/polygon używa? eh.. std::pair, sturct{x,y}, QT tutaj masz jeden promil max</i>