Arduino Forum

International => Français => Topic started by: bengloo59 on Mar 24, 2019, 07:59 pm

Title: Équation mal exécuter
Post by: bengloo59 on Mar 24, 2019, 07:59 pm
bonjour j'ai une equoition qui mathématiquement me semble correcte (vérifier sur geogebra et exel), une élegante equoition qui a pour courbe de 0 à l'instant t la forme de AX+B et de T à l'infini Cx+D avec x en variable supérieur à 0.
voici l'animal:
Code: [Select]


float equoitempdist(float x){float y = (a*x+b)*(((t-x)/(abs(2*t-2*x)))+1/2)+(((x-t)/(abs(2*x-2*t)))+1/2)*(c*x+d);return(y);Serial.println(y);}


avec en initialisation
Code: [Select]
float  a = 0.061;
float  b = 0.05;
float  c = 0.0364;
float  d = 3.8013;

float  t ;

   t=(d-b)/(a-c);


vis a vis de mais calcule manuelle l'arduino me renvois des valeur toujours négative qui n'on rien à voir avec celle que j'attand positive.

merci d'avance de vautre  aide
Title: Re: Equoition mal exécuter
Post by: bengloo59 on Mar 24, 2019, 08:05 pm
petite remarque
le serial print n'afiche rien  je suis obligé de lire la doné en dehors de la sous fonction je présume que c'est normal
et t et le point de croisement entre les deux sous équation , pour faire la passation d'une fonction à l'autre
les résultat obtenu sont toujours négatif avec une norme trés inférieur a celle attendue
Title: Re: Equoition mal exécuter
Post by: kamill on Mar 24, 2019, 08:12 pm
petite remarque
le serial print n'afiche rien...
Bonjour,
C'est normal, la fonction se termine au return. Donc tout ce qui est après n'est pas exécuté.
Title: Re: Equoition mal exécuter
Post by: bengloo59 on Mar 24, 2019, 08:17 pm
merci pour la précision 
Title: Re: Equoition mal exécuter
Post by: lesept on Mar 24, 2019, 08:19 pm
Essaye ceci :
Code: [Select]
float  a = 0.061;
float  b = 0.05;
float  c = 0.0364;
float  d = 3.8013;
float  t;

void setup() {
  Serial.begin(115200);
}

float equoitempdist(float x) {
  float y1 = (a * x + b) * (((t - x) / (abs(2.0 * t - 2.0 * x))) + 1.0 / 2.0);
  float y2 = (((x - t) / (abs(2.0 * x - 2.0 * t))) + 1.0 / 2.0) * (c * x + d);
  float y = y1 + y2;
//  Serial.print(y1);
//  Serial.print("\t");
//  Serial.print(y2);
//  Serial.print("\t");
//  Serial.println(y);
  return (y);
}

void loop() {
  t = (d - b) / (a - c);
  for (int i = -50; i < 50; i++) { // Evolution logarithmique de x de 0.00001 à 100000
    float x = pow(10, i/10.0);
    float y = equoitempdist(x);
    Serial.println(x, y);
  }
}

tu peux voir les valeurs de x et y dans la console, mais tu dois aussi pouvoir tracer la courbe grâce au traceur (CTRL + SHIFT + L dans l'IDE ou "Outils / Traceur série"). J'ai pas testé...
Title: Re: Equoition mal exécuter
Post by: bengloo59 on Mar 24, 2019, 09:01 pm
la passation d'une fonction à l'autre à l'instant t et ok , mais les fonction agisse comme si on avais mis des moins sur les constante chose qu'il n'y a pas
Code: [Select]

float  a = 0.061;
float  b = 0.05;
float  c = 0.0364;
float  d = 3.8013;
int h= 0;
float  t ;

 
void setup() {
  Serial.begin(115200);
  // put your setup code here, to run once:
 t=(d-b)/(a-c);
}

void loop() {
  Serial.println(equoitempdist(h));
  h+=1;
  delay(100);
 

}
float equoitempdist(float x){float y = ((a*x+b)*(((t-x)/(abs(2*t-2*x)))+1/2))+((((x-t)/(abs(2*x-2*t)))+1/2)*(c*x+d));return(y);}
Title: Re: Equoition mal exécuter
Post by: bengloo59 on Mar 24, 2019, 09:12 pm
Code: [Select]
float equoitempdist(float x){float y = ((20)*(((t-x)/(abs(2*t-2*x)))+1/2))+((((x-t)/(abs(2*x-2*t)))+1/2)*(10));return(y);}

j'ai essayé avec sa,sa me renvois 5 j'usqu'a t puis -5
alors que sa devrais me renvoyé 20 puis 10

mathéamtiquemant ma fonction est
h(x)= g(x)*(((t-x)/(abs(t-x)*2))+1/2)+f(x)*(((x-t)/(abs(x-t)*2))+1/2)
formule qui fonctionne parfaitement sur la calculette , quelle est la diférance avec l'écriture en C++?
Title: Re: Equoition mal exécuter
Post by: lesept on Mar 24, 2019, 09:38 pm
En échangeant
Code: [Select]
    Serial.println(x, y);par
Code: [Select]
    Serial.print(x,5);
    Serial.print(",");
    Serial.println(y,5);
dans le code que je t'ai proposé, j'obtiens

Code: [Select]
0.00001,0.05000
0.00002,0.05000
0.00002,0.05000
0.00003,0.05000
0.00003,0.05000
0.00004,0.05000
0.00005,0.05000
0.00006,0.05000
0.00008,0.05000
0.00010,0.05001
0.00013,0.05001
0.00016,0.05001
0.00020,0.05001
0.00025,0.05002
0.00032,0.05002
0.00040,0.05002
0.00050,0.05003
0.00063,0.05004
0.00079,0.05005
0.00100,0.05006
0.00126,0.05008
0.00158,0.05010
0.00200,0.05012
0.00251,0.05015
0.00316,0.05019
0.00398,0.05024
0.00501,0.05031
0.00631,0.05038
0.00794,0.05048
0.01000,0.05061
0.01259,0.05077
0.01585,0.05097
0.01995,0.05122
0.02512,0.05153
0.03162,0.05193
0.03981,0.05243
0.05012,0.05306
0.06310,0.05385
0.07943,0.05485
0.10000,0.05610
0.12589,0.05768
0.15849,0.05967
0.19953,0.06217
0.25119,0.06532
0.31623,0.06929
0.39811,0.07428
0.50119,0.08057
0.63096,0.08849
0.79433,0.09845
1.00000,0.11100
1.25893,0.12679
1.58489,0.14668
1.99526,0.17171
2.51189,0.20323
3.16228,0.24290
3.98107,0.29285
5.01187,0.35572
6.30957,0.43488
7.94328,0.53454
10.00000,0.66000
12.58925,0.81794
15.84893,1.01679
19.95262,1.26711
25.11886,1.58225
31.62278,1.97899
39.81072,2.47845
50.11872,3.10724
63.09573,3.89884
79.43282,4.89540
100.00000,6.15000
125.89254,7.72944
158.48932,9.57031
199.52623,11.06406
251.18864,12.94457
316.22775,15.31199
398.10718,18.29240
501.18723,22.04452
630.95734,26.76815
794.32825,32.71485
1000.00000,40.20130
1258.92542,49.62618
1584.89319,61.49141
1995.26233,76.42885
2511.88647,95.23397
3162.27759,118.90821
3981.07178,148.71233
5011.87256,186.23347
6309.57324,233.46977
7943.28223,292.93680
10000.00000,367.80130
12589.25391,462.05017
15848.93164,580.70245
19952.62305,730.07678
25118.86523,918.12805
31622.77734,1154.87048
39810.71875,1452.91150
50118.72266,1828.12292
63095.73438,2300.48608
79432.82031,2895.15601
Title: Re: Equoition mal exécuter
Post by: bengloo59 on Mar 24, 2019, 10:10 pm
c'est bien beau tout cette affichage mais sa me resoud pas le probleme de transcription de l'equation  pour  x allant de 0 à 1000 je doit obtenir des y allant de 0 à 45 avec une fonction avec une pente raide de 0à 152(valeur de t) et une pente plus douce de 152 à 1000 voir plus à (cela en utilisant les fonction ax+b et cx+d avec les valeur précédement évoqué.

le traceur séris me revois au contraire une fonction croisante mais négative avec x de 0 à 152 et y allant de environ -2 à 0 puis décroissant à partire de 152
Title: Re: Equoition mal exécuter
Post by: Artouste on Mar 24, 2019, 10:23 pm
bonjour j'ai une equoition qui mathématiquement me semble correcte (vérifier sur geogebra et exel), une élegante equoition qui a pour courbe de 0 à l'instant t la forme de AX+B et de T à l'infini Cx+D avec x en variable supérieur à 0.
voici l'animal:
Code: [Select]


float equoitempdist(float x){float y = (a*x+b)*(((t-x)/(abs(2*t-2*x)))+1/2)+(((x-t)/(abs(2*x-2*t)))+1/2)*(c*x+d);return(y);Serial.println(y);}


avec en initialisation
Code: [Select]
float  a = 0.061;
float  b = 0.05;
float  c = 0.0364;
float  d = 3.8013;

float  t ;

   t=(d-b)/(a-c);


vis a vis de mais calcule manuelle l'arduino me renvois des valeur toujours négative qui n'on rien à voir avec celle que j'attand positive.

merci d'avance de vautre  aide
bonjour j'ai une equoition qui mathématiquement me semble correcte (vérifier sur geogebra et exel), une élegante equoition qui a pour courbe de 0 à l'instant t la forme de AX+B et de T à l'infini Cx+D avec x en variable supérieur à 0.
voici l'animal:
Code: [Select]


float equoitempdist(float x){float y = (a*x+b)*(((t-x)/(abs(2*t-2*x)))+1/2)+(((x-t)/(abs(2*x-2*t)))+1/2)*(c*x+d);return(y);Serial.println(y);}


avec en initialisation
Code: [Select]
float  a = 0.061;
float  b = 0.05;
float  c = 0.0364;
float  d = 3.8013;

float  t ;

   t=(d-b)/(a-c);


vis a vis de mais calcule manuelle l'arduino me renvois des valeur toujours négative qui n'on rien à voir avec celle que j'attand positive.

merci d'avance de vautre  aide
Bonsoir
Sans vouloir jouer la "francophonie" à outrance :smiley-mr-green:

Le titre de ton sujet, déjà me pique très fortement  les yeux :smiley-cool:
Title: Re: Equoition mal exécuter
Post by: bengloo59 on Mar 24, 2019, 10:27 pm
navré que mon orthographe sois aussi catastrophique  :o , je fais comme je peux. :smiley-roll:

sinon je pense avoir trouvé ma solution j'ai reformulé l'équation différemment
 j'obtiens ceci:
Code: [Select]
float equoitempdist(float x){float y = ((a*x+b)*(((t-x)/(abs(t-x)*2))+0.5))+((c*x+d)*(((x-t)/(abs(x-t)*2))+0.5));return(y);}

je vois pas trop la différence avec l'ancienne formule mais sa marche.
Title: Re: Equoition mal exécuter
Post by: lesept on Mar 24, 2019, 10:37 pm
Code: [Select]
 float y1 = (a * x + b) * (((t - x) / (abs(2.0 * t - 2.0 * x))) + 1.0 / 2.0);
  float y2 = (((x - t) / (abs(2.0 * x - 2.0 * t))) + 1.0 / 2.0) * (c * x + d);
  float y = y1 + y2;


Si on étudie cette équation, on voit que on a souvent un terme du genre
Code: [Select]
(t - x) / abs(2.0 * t - 2.0 * x)
En factorisant 2 au dénominateur, on a
Code: [Select]
1/2 * (t-x)/abs(t-x)

X/abs(X) vaut 1 si X est positif et -1 si X est négatif. Donc notre terme vaut 0.5 si t-x est positif, soit x inférieur à t, sinon il vaut -0.5

Dans y2, c'est pareil :
Code: [Select]
(x - t) / (abs(2.0 * x - 2.0 * t)vaut 1/2 si x-t est positif soit x supérieur à t, sinon -1/2

Donc y vaut :


Au final : y vaut ax+b si x<t et cx+d si x>t

Donc, pas la peine de se prendre la tête avec des calculs à la noix :
Code: [Select]
float equoitempdist(float x) {
    if (x<t) y = a * x + b;
    else y = c * x + d;
    return y;
}
Voire même
Code: [Select]
float equoitempdist(float x) {
    if (x<t) return (a * x + b);
    return (c * x + d);
}