006
18.10.2003, 20:19 Uhr
(un)wissender
Niveauwart
|
So, habe was fertig gemacht, funktioniert mit meinen gestellten Werten ganz toll. (Sicherlich noch ausbaufähig, aber mir fehlt die Motivation, alles zu testen und ggf. zu korrigieren)
C++: |
#include <iostream> #include <cmath> using namespace std;
template<typename T> class Point { private: T x; T y; public: Point() : x(0), y(0) {} Point(T &x_, T &y_) : x(x_), y(y_) {} const T& getX() const { return x; } const T& getY() const { return y; } Point<T> & setValues(T &x_, T &y_) { x = x_; y = y_; return *this; } Point<T> & operator+=(const Point<T> &point) { x += point.x; y += point.y; return *this; } Point<T> & operator/=(const T &div) { x /= div; y /= div; return *this; } };
template<class T> void linearRegression(double &a, double &b, T *x_coords, T *y_coords, int coords_length) { int half_coords_length = coords_length / 2; Point<T>workerPoint; //Die erste Hälfte der Punkte sammeln und durch ihre //Anzahl teilen (x- und y-Koordinate), //um einen mittleren x- bzw. Y-Wert zu bekommen. Point<T> first_avg_point; for(unsigned int i = 0; i < half_coords_length; ++i) first_avg_point += workerPoint.setValues(*x_coords++, *y_coords++); first_avg_point /= half_coords_length; //Die zweite Hälfte der Punkte sammeln und durch ihre //Anzahl teilen (x- und y-Koordinate), //um einen mittleren x- bzw. Y-Wert zu bekommen. Point<T> second_avg_point; for(unsigned int i = half_coords_length; i < coords_length; ++i) second_avg_point += workerPoint.setValues(*x_coords++, *y_coords++); second_avg_point /= coords_length - half_coords_length; T deltaY = abs(first_avg_point.getY() - second_avg_point.getY()); T deltaX = abs(first_avg_point.getX() - second_avg_point.getX()); a = deltaY / deltaX; //Steigung berechnet; //y = mx + b ungestellen in b = -(mx) + y; b = -(a * second_avg_point.getX()) + second_avg_point.getY(); //b berechnen; }
int main() { double m; double b; double x_coors[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; double y_coors[] = {3.0, 2.0, 1.0, 6.0, 5.0, 4.0}; linearRegression(m, b, x_coors, y_coors, sizeof(x_coors) / sizeof(double)); cout << "Ermittelte Steigung: " << m << "\nY-Abstand bei x=0: " << b; return 0; }
|
-- Wer früher stirbt ist länger tot. |