Réconcilier 3 fonctions en une

Discussion générale entre passionnés et amateurs de mathématiques sur des sujets mathématiques variés
yannzul
Messages: 7
Enregistré le: 05 Juin 2014, 16:54

Réconcilier 3 fonctions en une

par yannzul » 05 Juin 2014, 17:06

Bonjour,

J'ai trois fonctions sur trois intervalles bien précis. Existe-t-il une fonction qui puisse les regrouper en une ?

Voici mes fonctions, ainsi que leurs intervalles :

Code: Tout sélectionner
[0-20]
f(x) = 500 + 30x

[21-50]
f(x) = 500 + 20*30 + 20(x - 20)

[51-99]
f(x) = 500 + 20*30 + 30*20 + 5(x - 50)


Merci :we:



John Difool
Membre Naturel
Messages: 51
Enregistré le: 13 Mar 2013, 16:48

par John Difool » 05 Juin 2014, 17:21

Tu veux définir une fonction définie sur [0,99] et qui vaut la valeur de chaque fonction donnée sur l'intervalle correspondant ? Tu peux utiliser définie comme :


yannzul
Messages: 7
Enregistré le: 05 Juin 2014, 16:54

par yannzul » 05 Juin 2014, 17:24

Ce qui signifie que je ne peux échapper à la logique booléenne ? C'est dans le cadre d'un script, donc aucun soucis. J'aurais juste aimé savoir si c'était calculable directement ^^

Avatar de l’utilisateur
Ben314
Le Ben
Messages: 21531
Enregistré le: 11 Nov 2009, 22:53

par Ben314 » 05 Juin 2014, 18:56

Salut,
Ta fonction est affine par morceaux (i.e. son graphe est formé de segments de droites) et, si elle était continue, tu pourrait entièrement l'écrire à l'aide de valeurs absolues, mais
- ça n'a pas forcément un quelconque intérêt et ça rend la relecture de la formule plus compliqué qu'avec l'utilisation de booléens.
- Ta fonction n'est pas continue, et d'ailleurs, ça m'étonne un peu : tu est sûr que pour x entre 21 et 50, ça serait pas plutôt f(x)=500+20*30+20*(x-20) et, pour x entre 51 et 99, ça serait pas f(x)=500+20*30+30*20+5*(x-50) ?
ça me semblerait plus logique...
Qui n'entend qu'un son n'entend qu'une sonnerie. Signé : Sonfucius

yannzul
Messages: 7
Enregistré le: 05 Juin 2014, 16:54

par yannzul » 05 Juin 2014, 19:26

Effectivement, tu as raison, et j'ai édité ma question en ce sens ^^

Du coup avec les nouvelles données, n'est-ce toujours pas faisable ? (Je vais continuer à chercher de mon côté aussi, ça me turlupine cette fonction)

Je précise que je suis pas très à l'aise avec les notations, j'ai pas fais de bac général :s Donc même si j'ai un esprit logique, j'ai du mal à lire certaines formules ^^

Avatar de l’utilisateur
Ben314
Le Ben
Messages: 21531
Enregistré le: 11 Nov 2009, 22:53

par Ben314 » 05 Juin 2014, 22:08

Dans ce cas, oui, tu as une formule "globale", mais ton script risque de pas mal y perdre en lisibilité...

Donc tu part de f(x)=50+30x dans tout les cas.
Puis, si x dépasse 20, il faut retrancher 10*(x-20) à cette quantité et, si x dépasse 50 il faut en plus retrancher 15*(x-50).
Sauf que |x-20| (valeur absolue) vaut -x+20 pour x<20 et x-20 pour x>20 donc x-20+|x-20| vaut 0 pour x<20 et 2(x-20) pour x>20 ce qui signifie que "retrancher 10*(x-20) lorsque x>20" revient à retrancher 5(x-20+|x-20|)
De même, "retrancher 15*(x-50) lorsque x>50" revient à retrancher 7.5(x-50+|x-50|)

Conclusion :
f(x)=500+30x-5(x-20+|x-20|)-7.5(x-50+|x-50|)
et après simplifications, ça donne
f(x)=975+17.5x-5|x-20|-7.5|x-50|

(si je me suis pas gourré...)
Qui n'entend qu'un son n'entend qu'une sonnerie. Signé : Sonfucius

yannzul
Messages: 7
Enregistré le: 05 Juin 2014, 16:54

par yannzul » 06 Juin 2014, 08:21

Merci pour ta réponse.

Je n'ai pas le temps de la regarder maintenant, mais je l'analyserai plus tard dans la journée. Merci beaucoup en tout cas ^^

EDIT:

J'ai compris ^^ Très astucieux en tout cas ! Merci :)

Robic
Membre Irrationnel
Messages: 1084
Enregistré le: 03 Mai 2013, 12:00

par Robic » 06 Juin 2014, 09:12

Pour écrire une fonction affine par morceau en une seule formule, on peut utiliser la notion d'échelon unité et de rampe unité. Je n'ai pas trouvé de lien vers un cours clair à ce sujet, mais je sais que c'est utilisé dans le cadre des transformées en Z ou des transformées de Laplace. Il faudrait fouiller dans les cours d'école d'ingénieur.

C'est intéressant si on compte ensuite effectuer une transformée de cette fonction. Si c'est juste pour calculer des valeurs de f(x), autant garder la formule simple de départ avec la condition à déterminer.

yannzul
Messages: 7
Enregistré le: 05 Juin 2014, 16:54

par yannzul » 06 Juin 2014, 11:11

Merci Robic pour ces précisions, ça m'a aidé à généraliser.

Pour la postérité, voici deux fonctions (en Python, mais c'est très compréhensible ^^):
Code: Tout sélectionner
def sign(x):
    # return 0 if x = b
    '''
    return sign(x-a) * sign(b-x+1) * (x-a) + sign(x-b) * (b-a)


Il ne reste ensuite plus qu'à l'utiliser comme ceci:
Code: Tout sélectionner
y = 500 + value(x, 0, 20) * 30 + value(x, 20, 50) * 20 + value(x, 50 ,99) * 5


Bien sûr la fonction mathématique complète est, comme vous me l'avez précisé, bien plus complexe à écrire, et, comme ce n'est pas la seule que j'ai à construire, je ne vais pas utiliser l'approche purement mathématique, mais c'était quand même instructif ^^

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 06 Juin 2014, 11:50

hello,

avec un peu plus de généralité:
Code: Tout sélectionner
var rangeFunctions=[
  {
    min:0,
    max:20,
    calc:function(x){return 500+3*x}
  },
  {
    min:21,
    max:50,
    calc:function(x){return 500+20*30+20*(x-20)}
  }
]
var f=(function(funcs){
  return function(x){
    var res=undefined;
    funcs.some(function(f){
      if(f.min<=x && x<=f.max){
        res = f.calc(x);
        return true;
      }
    });
    return res;
  }
})(rangeFunctions);
console.log(f(1));//503
console.log(f(21));//1140
console.log(f(20.5));//undefined
la vie est une fête :)

yannzul
Messages: 7
Enregistré le: 05 Juin 2014, 16:54

par yannzul » 06 Juin 2014, 14:25

Intéressant. Voici à quoi je suis arrivé en généralisant la formule par soustraction de Ben314:
Code: Tout sélectionner
function f(x, ranges, coeffs) {
    var res = 0,
        a = coeffs[0];
    for (var i = 0; i < ranges.length; i++) {
        var r = ranges[i],
            c1 = coeffs[i],
            c2 = coeffs[i+1];
        res += (c1-c2) / 2 * (r - Math.abs(x-r));
        a -= (c1-c2) / 2;
    };
    return res + a*x;
}

Usage:
Code: Tout sélectionner
var ranges = [20, 50];
var coeffs = [30, 20, 5];
var y = 500 + f(x, ranges, coeffs);
500 + f(0, ranges, coeffs)
// 500
500 + f(20, ranges, coeffs)
// 1100


Il ne faut pas se gourer en définissant les écarts et coeffs cependant ^^

 

Retourner vers ⚜ Salon Mathématique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 11 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