Partage
  • Partager sur Facebook
  • Partager sur Twitter

struct et vector

    19 août 2023 à 16:56:15

    Bonjour,

    Je suis débutant en programmation C++ et j'essaie de coder un programme de régression linéaire simple qui renvoi les paramètres de la fonction affine y=ax+b.

    Mon soucis est que je n'arrive pas à "utiliser" le vector contenant les coordonnées x et y de mes points p représentant mon nuage de points dans mes fonctions fit et mse. Merci d'avance pour votre aide.

    Salutations Fred

    #include <iostream>
    #include <iomanip>
    #include <cmath>
    #include <vector>
    
    using namespace std;
    
    struct Point {
        double x;
        double y;
    };
    
    const vector<Point> points({
        { 1.2, 1.9 },
        { 1.7, 2.5 },
    });
    
    struct line {
        double a;
        double b;
    };
    
    void fit(const Point& p, line& d);
    void line_value(const line& d, double x);
    void affiche_line(line& d);
    double mse(const line& d, const Point& p);
    
    int main() {
        
        line l;
    
        fit(p, l);
        cout << endl;
        double x(2.0);
        line_value(l, x);
        cout << endl;
        affiche_line(l);
        cout << endl;
        cout << mse(l, p) << endl;
        
    
        return 0;
    }
    
    void fit(const Point& p, line& d) {
        double sum_x(0.0);
        double sum_y(0.0);
        
        cout << setw(10) << "x_i"
             << setw(10) << "y_i"
             << setw(10) << "sum x"
             << setw(10) << "sum y"
             << setw(10) << "x^2"
             << setw(10) << "xy"
             << endl;
    
        for(size_t i(0); i < points.size(); ++i) {
            sum_x += p.x;
            sum_y += p.y;
            
            d.a += (p.x * p.y - 1.0 / points.size() * sum_x * sum_y) /
                   (p.x * p.x - 1.0 / points.size() * sum_x * sum_x);
            
            d.b += 1.0 / points.size() * (p.y - d.a * p.x);
            
            cout << setw(10) << p.x << setw(10) << p.y
                 << setw(10) << sum_x << setw(10) << sum_y
                 << setw(10) << p.x * p.x << setw(10) << p.x * p.y
                 << endl;
        }
    }
    
    void line_value(const line& d, double x) {
        cout << "x= " << x << endl;
        cout << "y= " << d.a * x + d.b << endl;
    }
    
    void affiche_line(line& d) {
        cout << "Paramètre a= " << d.a << endl;
        cout << "Paramètre b= " << d.b << endl;
    }
    
    double mse(const line& d, const Point& p) {
        double MSE(0.0);
        
        for(size_t i(0); i < points.size(); ++i){
            MSE += 1.0 / points.size() * pow(p.y - (d.a * p.x + d.b), 2.0);
        }
        return MSE;
    }
    

    -
    Edité par FrederickMasson 19 août 2023 à 16:57:24

    • Partager sur Facebook
    • Partager sur Twitter
      19 août 2023 à 18:04:09

      Sans regarder le détail de tes fonctions et de ton algo, elles attendent un Point et ton vecteur comporte plusieurs Point. Donc peut-être faire une boucle pour les envoyer à tour de rôle.

      int main()
      {
          for(auto const &p:points)
          {
              line l;
              fit(p, l);
              cout << endl;
              double x(2.0);
              line_value(l, x);
              cout << endl;
              affiche_line(l);
              cout << endl;
              cout << mse(l, p) << endl;
          }
      
          return 0;
      }

      PS : Ton vecteur tu pouvais le créer dans la fonction main, il n'est pas utile en global.

      Aussi, préfère l'initialisation de variable avec les accolades {} au lieu des parenthèses ().

      -
      Edité par rouIoude 19 août 2023 à 18:51:47

      • Partager sur Facebook
      • Partager sur Twitter
      ...

      struct et vector

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown