Go Down

Topic: Équation mal exécuter  (Read 269 times) previous topic - next topic

bengloo59

Mar 24, 2019, 07:59 pm Last Edit: Mar 24, 2019, 10:29 pm by bengloo59
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

bengloo59

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

kamill

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é.

bengloo59


lesept

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é...
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

bengloo59

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);}

bengloo59

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++?

lesept

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
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

bengloo59

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

Artouste

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:

bengloo59

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.

lesept

#11
Mar 24, 2019, 10:37 pm Last Edit: Mar 24, 2019, 10:38 pm by lesept
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 :
  • (ax+b) si x<t et 0 si x>t
  • plus
  • (cx+d) si x>t et 0 si x<t


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);
}
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Go Up