You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
352 lines
8.6 KiB
352 lines
8.6 KiB
|
|
// -------------------- Etude de fonctions --------------------
|
|
|
|
var etudeX = new Array()
|
|
var etudeY = new Array()
|
|
var etudeD = new Array()
|
|
var limGauche = new Array()
|
|
var limDroite = new Array()
|
|
var listeIndefini = new Array()
|
|
var listeZeros = new Array()
|
|
var intervalEtudeGauche = -50
|
|
var intervalEtudeDroite = 50
|
|
var precisionEtude = 0.001
|
|
|
|
function etudier(fct){
|
|
if(check(fct)){
|
|
prepareEtude(fct)
|
|
pariteFct()
|
|
signeFct(fct)
|
|
asymptotes()
|
|
courbure()
|
|
ensembleDefinition()
|
|
}
|
|
}
|
|
|
|
// Préparation à l'étude de fonction
|
|
function prepareEtude(fct){
|
|
listeIndefini = new Array()
|
|
var f = function(x){
|
|
return eval(fct)
|
|
}
|
|
// Calcul de tous les points de la fonction
|
|
var i = 0
|
|
for(var x=intervalEtudeGauche; x<=intervalEtudeDroite; x+=precisionEtude){
|
|
etudeX[i] = x
|
|
etudeY[i] = Math.round(f(x)*10000)/10000
|
|
etudeD[i] = Math.round(1000000*(f(x+0.0001)-f(x-0.0001))/(2*0.0001))/1000000
|
|
i++
|
|
}
|
|
// Calcul des extrémités de la fonction
|
|
var x = -100000
|
|
limGauche[0] = f(x)
|
|
x = -10000
|
|
limGauche[1] = f(x)
|
|
x = 100000
|
|
limDroite[0] = f(x)
|
|
x = 10000
|
|
limDroite[1] = f(x)
|
|
}
|
|
|
|
// Recherche de l'ensemble de définition
|
|
function ensembleDefinition(){
|
|
var fctDefinie = false
|
|
var dejaDefinie = false
|
|
var EDF = ""
|
|
if(!isNaN(limGauche[0])){
|
|
fctDefinie = true
|
|
dejaDefinie = true
|
|
EDF += "]-∞;"
|
|
}
|
|
if(!isNaN(limGauche[1]) && !fctDefinie){
|
|
fctDefinie = true
|
|
dejaDefinie = true
|
|
EDF += "]-∞;"
|
|
}
|
|
for(var i=0; i<etudeX.length; i++){
|
|
if(fctDefinie && isNaN(etudeY[i])){
|
|
fctDefinie = false
|
|
EDF += (parseInt(etudeX[i]/precisionEtude)*precisionEtude)+"["
|
|
}
|
|
else if(!fctDefinie && !isNaN(etudeY[i])){
|
|
fctDefinie = true
|
|
if(dejaDefinie){
|
|
EDF += " u "
|
|
}
|
|
EDF += "["+(parseInt(etudeX[i]/precisionEtude)*precisionEtude)+";"
|
|
dejaDefinie = true
|
|
}
|
|
}
|
|
if(fctDefinie && !isNaN(limDroite[1])){
|
|
fctDefinie = false
|
|
EDF += "+∞["
|
|
}
|
|
if(fctDefinie && !isNaN(limDroite[0])){
|
|
fctDefinie = false
|
|
EDF += "+∞["
|
|
}
|
|
for(var i=0; i<listeIndefini.length; i++){
|
|
if(i==0){
|
|
EDF += " - {"
|
|
}
|
|
EDF += listeIndefini[i]
|
|
if(i==listeIndefini.length-1){
|
|
EDF += "}"
|
|
}
|
|
else
|
|
EDF += ";"
|
|
}
|
|
document.getElementById('etudeEDF').innerHTML = EDF
|
|
}
|
|
|
|
// Etude de la parité
|
|
function pariteFct(){
|
|
var posZero
|
|
var paire = true
|
|
var impaire = true
|
|
var positif, negatif
|
|
var precisionParite = 1000
|
|
for(var i=0;i<etudeX.length;i++){
|
|
if(Math.round(etudeX[i]*precisionParite)/precisionParite==0){
|
|
posZero = i
|
|
}
|
|
}
|
|
for(var i=1; i<etudeX.length/2; i++){
|
|
if(etudeY[posZero+i]>0){
|
|
positif = Math.floor(etudeY[posZero+i])
|
|
}
|
|
else{
|
|
positif = Math.ceil(etudeY[posZero+i])
|
|
}
|
|
if(etudeY[posZero-i]>0){
|
|
negatif = Math.floor(etudeY[posZero-i])
|
|
}
|
|
else{
|
|
negatif = Math.ceil(etudeY[posZero-i])
|
|
}
|
|
|
|
if(positif<25000 && positif>-25000){
|
|
if(positif != negatif){
|
|
paire = false
|
|
//alert(i+" ; "+posZero+" ; "+etudeX.length+" ; "+positif+" ; "+negatif)
|
|
}
|
|
if(positif != (-negatif)){
|
|
impaire = false
|
|
}
|
|
}
|
|
}
|
|
if(paire){
|
|
document.getElementById("etudeParite").innerHTML = "even"
|
|
}
|
|
else if(impaire){
|
|
document.getElementById("etudeParite").innerHTML = "uneven"
|
|
}
|
|
else{
|
|
document.getElementById("etudeParite").innerHTML = "n/a"
|
|
}
|
|
}
|
|
|
|
function zeroFct(){
|
|
listeZeros = new Array()
|
|
var listeZerosArr = new Array()
|
|
var precZeros = 5
|
|
for(var i=0; i<etudeX.length; i++){
|
|
if(Math.round(etudeY[i]*1000)/1000==0){
|
|
var nouveauZero = Math.round(etudeX[i]*precZeros)/precZeros
|
|
if(listeZerosArr[listeZerosArr.length-1]!=nouveauZero){
|
|
listeZeros.push(Math.round(etudeX[i]*10)/10)
|
|
listeZerosArr.push(nouveauZero)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function signeFct(fct){
|
|
var signe = new Array()
|
|
var signePlus = new Array()
|
|
var signeMoins = new Array()
|
|
var dernier = 0
|
|
if(limGauche[0]>0){
|
|
signe[0] = "+"
|
|
signePlus[0] = limGauche[1]
|
|
signeMoins[0] = limGauche[0]
|
|
}
|
|
else{
|
|
signe[0] = "-"
|
|
signePlus[0] = limGauche[1]
|
|
signeMoins[0] = limGauche[0]
|
|
}
|
|
for(var i=0; i<etudeY.length; i++){
|
|
if(signe[signe.length-1]=="+"){
|
|
if(etudeY[i]<0){
|
|
signe.push("-")
|
|
signePlus.push(etudeX[i])
|
|
signeMoins.push(etudeX[dernier])
|
|
}
|
|
else if(etudeY[i]>0){
|
|
dernier = i
|
|
}
|
|
}
|
|
if(signe[signe.length-1]=="-"){
|
|
if(etudeY[i]>0){
|
|
signe.push("+")
|
|
signePlus.push(etudeX[i])
|
|
signeMoins.push(etudeX[dernier])
|
|
//alert(signe+" ; "+signePlus+'\n'+etudeY[i+1]+" ; "+etudeY[i]+" ; "+etudeY[i-1]+" ; "+etudeY[i-2]+'\n'+etudeX[i+1]+" ; "+etudeX[i]+" ; "+etudeX[i-1]+" ; "+etudeX[i-2])
|
|
}
|
|
else if(etudeY[i]<0){
|
|
dernier = i
|
|
}
|
|
}
|
|
}
|
|
var valeurPlus, valeurMoins, millieu, precisionZero
|
|
listeZeros = new Array()
|
|
for(var i=1; i<signePlus.length; i++){
|
|
valeurPlus = signePlus[i]
|
|
valeurMoins = signeMoins[i]
|
|
for(var k=0;k<10000;k++){
|
|
millieu = (valeurPlus + valeurMoins)/2
|
|
x = valeurPlus
|
|
if(eval(fct)>0){
|
|
x = millieu
|
|
if(eval(fct)>0){
|
|
valeurPlus=millieu
|
|
}
|
|
else if(eval(fct)<0){
|
|
valeurMoins=millieu
|
|
}
|
|
else{
|
|
break
|
|
}
|
|
}
|
|
else if(eval(fct)<0){
|
|
x = millieu
|
|
if(eval(fct)<0){
|
|
valeurPlus=millieu
|
|
}
|
|
else if(eval(fct)>0){
|
|
valeurMoins=millieu
|
|
}
|
|
else{
|
|
break
|
|
}
|
|
}
|
|
else{
|
|
millieu = valeurPlus
|
|
break
|
|
}
|
|
x = valeurPlus
|
|
precisionZero = eval(fct)
|
|
x = valeurMoins
|
|
precisionZero -= eval(fct)
|
|
if(precisionZero>0.0001){
|
|
break
|
|
}
|
|
}
|
|
//alert(signePlus[i]+" et "+signeMoins[i]+" -> "+millieu)
|
|
listeZeros.push(Math.round(millieu*100)/100)
|
|
}
|
|
var texteZeros = ""
|
|
if(listeZeros==""){
|
|
zeroFct()
|
|
texteZeros = "~ "
|
|
}
|
|
var texte = "Signe : "
|
|
var aSupprimer = new Array()
|
|
for(var i=0; i<signe.length; i++){
|
|
texte += "<td>"+signe[i]+"</td>"
|
|
if(listeZeros[i]!=undefined){
|
|
x = listeZeros[i]
|
|
if(isFinite(eval(fct))){
|
|
texte += "<td class='border'>"+listeZeros[i]+"</td>"
|
|
}
|
|
else{
|
|
texte += "<td class='border infini'>"+listeZeros[i]+"</td>"
|
|
listeIndefini.push(listeZeros[i])
|
|
aSupprimer.push(i)
|
|
}
|
|
}
|
|
}
|
|
document.getElementById("etudeSigne").innerHTML = texte
|
|
for(var i=0; i<aSupprimer.length; i++){
|
|
listeZeros.splice((aSupprimer[i]-i), 1)
|
|
}
|
|
if(listeZeros==""){
|
|
texteZeros = "n/a"
|
|
}
|
|
document.getElementById("etudeZeros").innerHTML = texteZeros+listeZeros
|
|
}
|
|
|
|
function asymptotes(){
|
|
// Horizontales
|
|
if(Math.abs(limGauche[0])<1000){
|
|
var limRound = Math.round(limGauche[0]*100)/100
|
|
if(limGauche[0]<limRound){
|
|
document.getElementById("etudeAHG").innerHTML = "y = "+limRound +" <span class='texteSecondaire'>(curve is higher than a l'AH)</span>"
|
|
}
|
|
else if(limGauche[0]>limRound){
|
|
document.getElementById("etudeAHG").innerHTML = "y = "+limRound +" <span class='texteSecondaire'>(curve is lower than a l'AH)</span>"
|
|
}
|
|
else{
|
|
document.getElementById("etudeAHG").innerHTML = "y = "+limRound
|
|
}
|
|
}
|
|
else{
|
|
document.getElementById("etudeAHG").innerHTML = "n/a"
|
|
}
|
|
if(Math.abs(limDroite[0])<1000){
|
|
var limRound = Math.round(limDroite[0]*100)/100
|
|
if(limDroite[0]<limRound){
|
|
document.getElementById("etudeAHD").innerHTML = "y = "+limRound +" <span class='texteSecondaire'>(curve is lower than a l'AH)</span>"
|
|
}
|
|
else if(limDroite[0]>limRound){
|
|
document.getElementById("etudeAHD").innerHTML = "y = "+limRound +" <span class='texteSecondaire'>(curve is higher than a l'AH)</span>"
|
|
}
|
|
else{
|
|
document.getElementById("etudeAHD").innerHTML = "y = "+limRound
|
|
}
|
|
}
|
|
else{
|
|
document.getElementById("etudeAHD").innerHTML = "n/a"
|
|
}
|
|
// Verticales
|
|
var texteAV = ""
|
|
for(var i=0; i<listeIndefini.length; i++){
|
|
texteAV += "x = "+listeIndefini[i]
|
|
if(listeIndefini[i+1]!=undefined){
|
|
texteAV += " ; "
|
|
}
|
|
}
|
|
if(texteAV==""){
|
|
texteAV = "n/a <br/>"
|
|
}
|
|
document.getElementById("etudeAV").innerHTML = texteAV
|
|
}
|
|
|
|
function courbure(){
|
|
var texteMin = "";
|
|
var texteMax = "";
|
|
var texteI = "";
|
|
var nbrI = 0;
|
|
var i;
|
|
for(i=0; i<etudeD.length; i++){
|
|
if(etudeD[i]==0){
|
|
if(etudeD[i-1]<0 && etudeD[i+1]>0){
|
|
texteMin += "<br/>Min("+Math.round(etudeX[i]*10000)/10000+";"+etudeY[i]+")";
|
|
}
|
|
else if(etudeD[i-1]>0 && etudeD[i+1]<0){
|
|
texteMax += "<br/>Max("+Math.round(etudeX[i]*10000)/10000+";"+etudeY[i]+")";
|
|
}
|
|
else{
|
|
nbrI++;
|
|
texteI += '<br/>I<span style="vertical-align:sub;font-size:50%;">'+nbrI+"</span>("+Math.round(etudeX[i]*10000)/10000+";"+etudeY[i]+")";
|
|
}
|
|
}
|
|
}
|
|
if(texteMin==""){texteMin = "<br/>No minimum";}
|
|
if(texteMax==""){texteMax = "<br/>No maximum";}
|
|
if(texteI==""){texteI = "<br/>Aucun I";}
|
|
document.getElementById("etudeMin").innerHTML = texteMin;
|
|
document.getElementById("etudeMax").innerHTML = texteMax;
|
|
document.getElementById("etudeI").innerHTML = texteI;
|
|
} |