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.
356 lines
10 KiB
356 lines
10 KiB
6 years ago
|
|
||
|
// -------------------- 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 = sankoreLang[lang].ev;
|
||
|
}
|
||
|
else if(impaire){
|
||
|
document.getElementById("etudeParite").innerHTML = sankoreLang[lang].unev;
|
||
|
}
|
||
|
else{
|
||
|
document.getElementById("etudeParite").innerHTML = sankoreLang[lang].na;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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
|
||
|
}
|
||
|
}
|
||
|
listeZeros.push(Math.round(millieu*100)/100)
|
||
|
}
|
||
|
var texteZeros = ""
|
||
|
if(listeZeros==""){
|
||
|
zeroFct()
|
||
|
texteZeros = "~ "
|
||
|
}
|
||
|
var texte = sankoreLang[lang].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 = sankoreLang[lang].na;
|
||
|
}
|
||
|
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'>" + sankoreLang[lang].curve_higher + "</span>"
|
||
|
}
|
||
|
else if(limGauche[0]>limRound){
|
||
|
document.getElementById("etudeAHG").innerHTML = "y = "+limRound +" <span class='texteSecondaire'>" + sankoreLang[lang].curve_lower + "</span>"
|
||
|
}
|
||
|
else{
|
||
|
document.getElementById("etudeAHG").innerHTML = "y = "+limRound
|
||
|
}
|
||
|
}
|
||
|
else{
|
||
|
document.getElementById("etudeAHG").innerHTML = sankoreLang[lang].na;
|
||
|
}
|
||
|
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'>" + sankoreLang[lang].curve_lower + "</span>"
|
||
|
}
|
||
|
else if(limDroite[0]>limRound){
|
||
|
document.getElementById("etudeAHD").innerHTML = "y = "+limRound +" <span class='texteSecondaire'>" + sankoreLang[lang].curve_higher + "</span>"
|
||
|
}
|
||
|
else{
|
||
|
document.getElementById("etudeAHD").innerHTML = "y = "+limRound
|
||
|
}
|
||
|
}
|
||
|
else{
|
||
|
document.getElementById("etudeAHD").innerHTML = sankoreLang[lang].na;
|
||
|
}
|
||
|
// Verticales
|
||
|
var texteAV = ""
|
||
|
for(var i=0; i<listeIndefini.length; i++){
|
||
|
texteAV += "x = "+listeIndefini[i]
|
||
|
if(listeIndefini[i+1]!=undefined){
|
||
|
texteAV += " ; "
|
||
|
}
|
||
|
}
|
||
|
if(texteAV==""){
|
||
|
texteAV = sankoreLang[lang].na + " <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/>" + sankoreLang[lang].min + "("+Math.round(etudeX[i]*10000)/10000+";"+etudeY[i]+")";
|
||
|
}
|
||
|
else if(etudeD[i-1]>0 && etudeD[i+1]<0){
|
||
|
texteMax += "<br/>" + sankoreLang[lang].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/>" + sankoreLang[lang].no_min;
|
||
|
}
|
||
|
if(texteMax==""){
|
||
|
texteMax = "<br/>" + sankoreLang[lang].no_max;
|
||
|
}
|
||
|
if(texteI==""){
|
||
|
texteI = "<br/>Aucun I";
|
||
|
}
|
||
|
document.getElementById("etudeMin").innerHTML = texteMin;
|
||
|
document.getElementById("etudeMax").innerHTML = texteMax;
|
||
|
}
|