Équation mal exécuter

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:

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

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

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

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

merci pour la précision

Essaye ceci :

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

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

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

En échangeant
    Serial.println(x, y);par

    Serial.print(x,5);
    Serial.print(",");
    Serial.println(y,5);

dans le code que je t'ai proposé, j'obtiens

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

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

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:

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

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:
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:

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

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 :grin:

Le titre de ton sujet, déjà me pique très fortement les yeux :sunglasses:

navré que mon orthographe sois aussi catastrophique :o , je fais comme je peux. :roll_eyes:

sinon je pense avoir trouvé ma solution j'ai reformulé l'équation différemment
j'obtiens ceci:

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.

  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

(t - x) / abs(2.0 * t - 2.0 * x)

En factorisant 2 au dénominateur, on a

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 :
(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 :

float equoitempdist(float x) {
    if (x<t) y = a * x + b;
    else y = c * x + d;
    return y;
}

Voire même

float equoitempdist(float x) {
    if (x<t) return (a * x + b);
    return (c * x + d);
}