Régression parabolique non triviale

Réponses à toutes vos questions après le Bac (Fac, Prépa, etc.)
sylvain231
Membre Relatif
Messages: 301
Enregistré le: 07 Avr 2020, 13:20

Re: régression parabolique non triviale

par sylvain231 » 22 Juin 2023, 14:08

on va y arriver ! on va y arriver !



Avatar de l’utilisateur
leon1789
Membre Transcendant
Messages: 5475
Enregistré le: 27 Nov 2007, 16:25

Re: régression parabolique non triviale

par leon1789 » 22 Juin 2023, 14:09

Yes, c'est parfait !

maintenant, trace la courbe avec la courbe paramétrée :
X (r) = a*r^2 + b*r
Y (r) = b*r^2 - a*r
avec r parcourant l'intervalle [-3, 3] .

Avatar de l’utilisateur
leon1789
Membre Transcendant
Messages: 5475
Enregistré le: 27 Nov 2007, 16:25

Re: régression parabolique non triviale

par leon1789 » 22 Juin 2023, 14:10

sylvain231 a écrit:a= 1.91461 b= 2.14439 c= 2.87474 t=0.728849
tu n'as pas dû voir mon message quand je disais que j'avais oublié de mettre le sommet en (0,0)

Ah oui, c'était déjà bon ! :)
sylvain231 a écrit:désolé je n'avais pas mis le sommet en (0,0) voici mes résultats :
a= 1.91461 b= 2.14439 c= 2.87474 t=0.728849

sylvain231
Membre Relatif
Messages: 301
Enregistré le: 07 Avr 2020, 13:20

Re: régression parabolique non triviale

par sylvain231 » 22 Juin 2023, 14:11

ça me dérange de prendre r car ça parcourt tous les réels et ils sont beaucoup trop nombreux, en plus je ne peux pas avoir de x et de y négatif dans une image, je préfère tracer en prenant tous les x de 0 à nombre de pixels horizontaux et les y de 0 à nombre de pixels verticaux

sylvain231
Membre Relatif
Messages: 301
Enregistré le: 07 Avr 2020, 13:20

Re: régression parabolique non triviale

par sylvain231 » 22 Juin 2023, 14:13

il vaudrait mieux reprendre un exemple avec le sommet en (200,200)

Avatar de l’utilisateur
leon1789
Membre Transcendant
Messages: 5475
Enregistré le: 27 Nov 2007, 16:25

Re: régression parabolique non triviale

par leon1789 » 22 Juin 2023, 14:14

sylvain231 a écrit:ça me dérange de prendre r car ça parcourt tous les réels et ils sont beaucoup trop nombreux, en plus je ne peux pas avoir de x et de y négatif dans une image, je préfère tracer en prenant tous les x de 0 à nombre de pixels horizontaux et les y de 0 à nombre de pixels verticaux

ah ok. (invente les pixels négatifs alors ! :) )

Dans ce cas, on reprend l'équation cartésienne de cette parabole "test" :
(b * X - a *Y )^2 / (a^2 + b^2) - (a*X + b*Y) = 0
avec 0 < X et Y < 25 ici.

tu vas obtenir un truc comme cela :
Image

Avatar de l’utilisateur
leon1789
Membre Transcendant
Messages: 5475
Enregistré le: 27 Nov 2007, 16:25

Re: régression parabolique non triviale

par leon1789 » 22 Juin 2023, 14:15

sylvain231 a écrit:il vaudrait mieux reprendre un exemple avec le sommet en (200,200)

oui, on va reprendre tes deux exemples : "serré" et "plat".

sylvain231
Membre Relatif
Messages: 301
Enregistré le: 07 Avr 2020, 13:20

Re: régression parabolique non triviale

par sylvain231 » 22 Juin 2023, 14:20

j'ai déjà testé avec ces exemples et ça ne marche pas voici mon code de dessin :
Code: Tout sélectionner
void Parabole::draw (Mat& img, cv::Vec3b color){
    // Itérer sur chaque pixel
    for(double y = 0; y < img.rows; y+=0.1) {
        for(double x = 0; x < img.cols; x += 0.1) {
            // Calculer X' et Y'
            double X_prime = x - sommet.x;
            double Y_prime = y - sommet.y;

            // Calculer la valeur de l'équation de la parabole
            double val;
                val = pow(b*X_prime-a*X_prime,2)/(pow(a,2)+pow(b,2))-(a*X_prime+b*Y_prime);

                //cout << "val" << val << endl;
            // Si val est proche de 0, colorer le pixel
            if(fabs(val) < 0.5) { // Vous pouvez ajuster la tolérance
                img.at<cv::Vec3b>(y, x) = color; // Par exemple, en blanc
            }
        }
    }
}

sylvain231
Membre Relatif
Messages: 301
Enregistré le: 07 Avr 2020, 13:20

Re: régression parabolique non triviale

par sylvain231 » 22 Juin 2023, 14:21

je précise que j'ai mis bleu comme couleur

sylvain231
Membre Relatif
Messages: 301
Enregistré le: 07 Avr 2020, 13:20

Re: régression parabolique non triviale

par sylvain231 » 22 Juin 2023, 14:24

tu veux mes a,b,c,t pour les deux exemples ?

Avatar de l’utilisateur
leon1789
Membre Transcendant
Messages: 5475
Enregistré le: 27 Nov 2007, 16:25

Re: régression parabolique non triviale

par leon1789 » 22 Juin 2023, 14:26

avec ton exemple plat : superieur/regression-parabolique-non-triviale-t278846-140.html#p1548996

oulala , c'est la cata !!!

Bon, je suis désolé, on va revenir aux calculs donnés par Ben (je ne comprends pas pourquoi ils fonctionnent mieux) .

Je reviens vers toi pour te redonner un bon code qui fait ses calculs, et ça va fonctionner ! :rouge:

Avatar de l’utilisateur
leon1789
Membre Transcendant
Messages: 5475
Enregistré le: 27 Nov 2007, 16:25

Re: régression parabolique non triviale

par leon1789 » 22 Juin 2023, 14:32

Code: Tout sélectionner
void Parabole::fit2(std::vector<cv::Point2d> points, cv::Point2d sommet) {
    this->sommet = sommet;
    int n = points.size();
    cout << "sommet = " << sommet << endl;
    points = translatePoint2ds(points, sommet);
    double bestTheta = 0;
    double minimum = std::numeric_limits<double>::infinity();
    for (double theta = 0; theta <= CV_PI; theta += CV_PI / 1000) {

        vector<Point2d> rotated = rotatePoint2ds(points, theta);
        double E1 = 0;
        for (int i = 0; i < n; i++) {
            E1 += pow(rotated[i].y, 2);
        }
        double E2 = 0;
        for (int i = 0; i < n; i++) {
            E2 += pow(rotated[i].x, 2) * rotated[i].y;
        }
        double E3 = 0;
        for (int i = 0; i < n; i++) {
            E3 += pow(rotated[i].x, 4);
        }
        double delta = E1 - (pow(E2, 2) / E3);
        if (delta < minimum) {
            minimum = delta;
            bestTheta = theta;
        }
    }
    this->theta_radians = bestTheta;
    this->theta = bestTheta * 180 / CV_PI;
    vector<Point2d> rotated = rotatePoint2ds(points, bestTheta);
    double E2 = 0;
    for (int i = 0; i < n; i++) {
        E2 += pow(rotated[i].x, 2) * rotated[i].y;
    }
    double E3 = 0;
    for (int i = 0; i < n; i++) {
        E3 += pow(rotated[i].x, 4);
    }
    this->a = E2 / E3;
    this->aa = sin(theta_radians) / (4 * a);
    this->b = cos(theta_radians) / (4 * a);
    cout << "aa" << aa << "b" << b << endl;
    cout << "a=" << this->a << endl;

}

Avatar de l’utilisateur
leon1789
Membre Transcendant
Messages: 5475
Enregistré le: 27 Nov 2007, 16:25

Re: régression parabolique non triviale

par leon1789 » 22 Juin 2023, 14:33

Voilà, j'ai repris ton code initial, en changeant simplement la ligne
double delta = E1 - (pow(E2, 2) / E3);

tout devrait fonctionner !


Mais cette mésaventure est inattendue. Il y a un truc mathématique que je n'ai pas compris. :cry:
Modifié en dernier par leon1789 le 22 Juin 2023, 14:34, modifié 1 fois.

sylvain231
Membre Relatif
Messages: 301
Enregistré le: 07 Avr 2020, 13:20

Re: régression parabolique non triviale

par sylvain231 » 22 Juin 2023, 14:33

je te redonne le code de départ pour que tu aie une base :
Code: Tout sélectionner
void Parabole::fit2(std::vector<cv::Point2d> points, cv::Point2d sommet) {
    this->sommet = sommet;
    int n = points.size();
    cout << "sommet = " << sommet << endl;
    points = translatePoint2ds(points, sommet);
    double bestTheta = 0;
    double minimum = std::numeric_limits<double>::infinity();
    for (double theta = 0; theta <= CV_PI; theta += CV_PI / 1000) {

        vector<Point2d> rotated = rotatePoint2ds(points, theta);
        double E1 = 0;
        for (int i = 0; i < n; i++) {
            E1 += pow(rotated[i].y, 2);
        }
        double E2 = 0;
        for (int i = 0; i < n; i++) {
            E2 += pow(rotated[i].x, 2) * rotated[i].y;
        }
        double E3 = 0;
        for (int i = 0; i < n; i++) {
            E3 += pow(rotated[i].x, 4);
        }
        double delta = E1 - (pow(E2,2) / E3);
        if (delta < minimum) {
            minimum = delta;
            bestTheta = theta;
        }
    }
    this->theta_radians = bestTheta;
    this->theta = bestTheta * 180 / CV_PI;
    vector<Point2d> rotated = rotatePoint2ds(points, bestTheta);
    double E2 = 0;
    for (int i = 0; i < n; i++) {
        E2 += pow(rotated[i].x, 2) * rotated[i].y;
    }
    double E3 = 0;
    for (int i = 0; i < n; i++) {
        E3 += pow(rotated[i].x, 4);
    }
    this->a = E2 / E3;
    this->aa = sin(theta_radians) / (4 * a);
    this->b = cos(theta_radians) / (4 * a);
    cout << "aa" << aa << "b" << b << endl;
    cout << "a=" << this->a << endl;

}

Avatar de l’utilisateur
leon1789
Membre Transcendant
Messages: 5475
Enregistré le: 27 Nov 2007, 16:25

Re: régression parabolique non triviale

par leon1789 » 22 Juin 2023, 14:35

oui, vois mon code au-dessus.

sylvain231
Membre Relatif
Messages: 301
Enregistré le: 07 Avr 2020, 13:20

Re: régression parabolique non triviale

par sylvain231 » 22 Juin 2023, 14:35

et non je l'avais déjà fait mais non ça ne fonctionne pas, le plus clair est sur l'exemple de la parabole serrée

sylvain231
Membre Relatif
Messages: 301
Enregistré le: 07 Avr 2020, 13:20

Re: régression parabolique non triviale

par sylvain231 » 22 Juin 2023, 14:36

ce code ne marche dans aucun des cas avec ou sans la modif

sylvain231
Membre Relatif
Messages: 301
Enregistré le: 07 Avr 2020, 13:20

Re: régression parabolique non triviale

par sylvain231 » 22 Juin 2023, 14:37

c'est pourquoi je te disais de faire un pas à pas et de comparer avec tes résultats

sylvain231
Membre Relatif
Messages: 301
Enregistré le: 07 Avr 2020, 13:20

Re: régression parabolique non triviale

par sylvain231 » 22 Juin 2023, 14:40

ça ne doit pas être grand chose comme ça marche pour toi

Avatar de l’utilisateur
leon1789
Membre Transcendant
Messages: 5475
Enregistré le: 27 Nov 2007, 16:25

Re: régression parabolique non triviale

par leon1789 » 22 Juin 2023, 14:41

oui, je suis d'accord.

Prends mon dernier code au-dessus.

On va retracer comme tout à l'heure, avec un exemple simple (désolé, on va y arriver, mais il faut le faire pas à pas)

avec les 3 points (10;1) , (18;10) , (2;10) et le sommet toujours en (0;0)

valeurs de bestTheta et a ?
t := 0.66601708
a := 0.2435889637
Modifié en dernier par leon1789 le 22 Juin 2023, 14:43, modifié 1 fois.

 

Retourner vers ✯✎ Supérieur

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 49 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite