Eviter des "if" répétitifs

VeillardVeillard Membre
21:33 modifié dans API AppKit #1
Bonjour à  tous

Existe-t-il une méthode permettant d'éviter une série de if / else if répétitifs comme ceci :
if (ppO2 &lt;= 0.62)<br />		sncClock = 0.14 * time;<br />	else if (ppO2 &gt; 0.62 &amp;&amp; ppO2 &lt;= 0.64)<br />		sncClock = 0.15 * time;<br />	else if (ppO2 &gt; 0.64 &amp;&amp; ppO2 &lt;= 0.66)<br />		sncClock = 0.16 * time;<br />	else if (ppO2 &gt; 0.66 &amp;&amp; ppO2 &lt;= 0.68)<br />		sncClock = 0.17 * time;<br />	else if (ppO2 &gt; 0.68 &amp;&amp; ppO2 &lt;= 0.72)<br />		sncClock = 0.18 * time;<br />	else if (ppO2 &gt; 0.72 &amp;&amp; ppO2 &lt;= 0.74)<br />		sncClock = 0.19 * time;<br />	else if (ppO2 &gt; 0.74 &amp;&amp; ppO2 &lt;= 0.76)<br />		sncClock = 0.20 * time;<br />	else if (ppO2 &gt; 0.76 &amp;&amp; ppO2 &lt;= 0.78)<br />		sncClock = 0.21 * time;<br />	else if (ppO2 &gt; 0.78 &amp;&amp; ppO2 &lt;= 0.80)<br />		sncClock = 0.22 * time;<br />	else if (ppO2 &gt; 0.80 &amp;&amp; ppO2 &lt;= 0.82)<br />		sncClock = 0.23 * time;<br />	else if (ppO2 &gt; 0.82 &amp;&amp; ppO2 &lt;= 0.84)<br />		sncClock = 0.24 * time;<br />	else if (ppO2 &gt; 0.84 &amp;&amp; ppO2 &lt;= 0.86)<br />		sncClock = 0.25 * time;<br />etc...<br />


Je trouve ça un peu lourd.

Réponses

  • ClicCoolClicCool Membre
    21:33 modifié #2
    Tu peux peut-être mutiplier ton ppO2 par 100 et en faire un Entier, ça te permettrait alors d'écrire

    switch (ppO2Int) {

    case 63:
    case 64:
    ..../....
    break;

    case 65:
    case 66:
    ..../....


    etc ? ???
  • mars 2005 modifié #3
    Faire une petite régression (linéaire dans ce cas, à  première vue) qui te donnerait une fonction qui renvoie le multiplicateur en fonction pp02. Puis à‰ventuellement tu arrondis le nombre que tu obtiens, si tu dois vraiment avoir ces "paliers" (0,14; 0,15...)
  • VeillardVeillard Membre
    21:33 modifié #4
    J'ai tracé ma courbe, ça à  l'air plus complexe...



    [Fichier joint supprimé par l'administrateur]
  • mars 2005 modifié #5
    Essaie exponentielle, ou éventuellement polynomiale avec un degré élevé (du moment que la courbe "correspond" dans l'intervalle des ppO2 possible, c'est bon).

    Sinon autre possibilité, tu décomposes ta fonction en plusieurs 'sous fonctions", par exemple une partie horizontale dans un premier temps (pp02<0.62), puis du linéaire, puis...
  • VeillardVeillard Membre
    21:33 modifié #6
    Merci Renaud, ça marche avec Polynomial et un degré élevé...



    [Fichier joint supprimé par l'administrateur]
  • VeillardVeillard Membre
    21:33 modifié #7
    ... double
  • 21:33 modifié #8
    Je crois que le post auquel tu réponds a été supprimé par son auteur ;)
  • ClicCoolClicCool Membre
    21:33 modifié #9
    dans 1112033814:

    Je crois que le post auquel tu réponds a été supprimé par son auteur ;)


    C'est vrai que ça aurait été domage de signer une bétise ici qui aurait gâché ta  brillante intervention ;)
  • ChachaChacha Membre
    21:33 modifié #10
    Salut,
    j'interviens un peu comme un chacha sur la soupe, mais un détail me chiffonne.
    Apparemment, Favouille, tu veux faire de l'interpolation, et un polynôme de degré élevé te convient. Parce que oui, c'est vrai, un polynôme de degré assez élevé peux passer par tous les points de contrôle; par contre, plus le degré augmente, et plus le polynôme fait n'importe quoi entre les points (grandes variations). Il faudrait donc que tu vérifies si ton polynôme est bon, en le traçant avec une subdivision plus fine que celle de tes points de contrôle.

    Vu la tête de la courbe, j'aurais pensé, comme Renaud, à  une exponentielle, mais un polynôme devrait suffire avec une "minimisation des moindres carrés". La "minimisation des moindres carrés" est une méthode qui te donnerait les coefficients d'un polynôme qui passerait "à  peu près" par les points, mais pas exactement. D'un côté, il y a donc une erreur, mais elle est bien minimisée sur un certain critère. L'avantage, c'est que la courbe obtenue est bien lisse.

    +
    Chacha
  • VeillardVeillard Membre
    21:33 modifié #11
    Ouais, j'ai essayé de voir  ??? Finalement, j'ai conservé mes "if" ça me permet d'avoir des résultats justes surtout dans ce domaine...

    Merci à  tous
  • Eddy58Eddy58 Membre
    21:33 modifié #12
    Et tout mettre dans une boucle for, ça devrait pouvoir se faire non, vu que les tests sont linéaires apparemment. :)
    [tt]
    b=0.14;
    c=0.0;
    for (a=0.62;a<1.0;a=a+0.02)
    {
    if (ppO2>a && pp02<=a+0.02)
    {
    sncClock=(b+c)*time;
    a=1.0;
    }
    c=c+0.01;
    }
    [/tt]
  • 21:33 modifié #13
    Si c'est linéaire, il y a plus simple: une régression linéaire. Ou déterminer les coefficients à  partir de deux points. Puis on arrondit à  0,01 près.

    Seulement ici, il n'y a qu'une partie de la  courbe qui est linéaire.
Connectez-vous ou Inscrivez-vous pour répondre.