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