Je suis en train de réaliser un programme en basic de résolution d'équations/inéquations, et j'ai besoin d'aide.
Suivant l'argument, mon programme détecte si c'est un polynôme du second degré ou du premier degré avec la fonction polydegree(f) ; le problème justement est que lorsque la fonction n'est pas un polynôme, (une fraction, par exemple 1/x) ça revoit une erreur; le but justement est de pouvoir gérer les non-polynômes.
Lien du programme : archives_voir.php?id=22698
Code du programme : Edit : code de l'ancienne version
Show/Hide spoilerAfficher/Masquer le spoiler
- Code: Tout sélectionner
Define solv(equ,var)=
Prgm
Local l,r,ch,d,op,sg,a,la,ra
Disp equ
equ2:=equ
l:=left(equ)
r:=right(equ)
ch:=part(equ,0)
Disp "⇔",l,"-(",r,")",ch,"0"
a:=inString(string(equ),"")
If a≠0 Then
la:=inString(string(l),"")
If la>0 Then
l:=expr(right(string(l),dim(string(l))-2*inString(string(l),"")))
EndIf
ra:=inString(string(r),"")
If ra>0 Then
r:=expr(right(string(r),dim(string(r))-2*inString(string(r),"")))
EndIf
If string(l)="1" Then
l:=0
EndIf
If string(r)="1" Then
r:=0
EndIf
Disp "⇔",l,"-(",r,")",ch,"0"
EndIf
Try
equ:=comDenom(factor(l-r))
If getDenom(l-r)≠1 Then
equ:=getNum(equ)
Disp "⇔",equ,ch,"0"
EndIf
Disp "⇔",expand(equ),ch,"0"
d:=polyDegree(equ,var)
If d=2 Then
Local coef,a,b,c,delta,x0,x1,x2
coef:=polyCoeffs(equ,var)
a:=coef[1]
b:=coef[2]
c:=coef[3]
delta:=b^(2)-4*a*c
Disp "C'est une "&when(ch≠"=","in","")&"équation du second degré
dont le discriminant vaut :"
Disp "∆=b^2-4*a*c
=",b,"^2-4*",a,"*",c,"
=",b^(2),"-",4*a*c,"
=",delta
If a>0 Then
sg:="+"
op:="-"
Else
sg:="-"
op:="+"
EndIf
If delta>0 Then
Disp "L'équation possède deux racines réelles"
x1:=((−b-√(delta))/(2*a))
x2:=((−b+√(delta))/(2*a))
Disp "x1=(−b-√(∆))/2a
=(",−b,"-√(",delta,"))/2a
=",−b-√(delta),"/",2*a,"
=",x1
Disp "x2=(−b+√(∆))/2a
(",−b,"+√(",delta,"))/2a
=",−b+√(delta),"/",2*a,"
=",x2
If ch="=" Then
Disp "",expand(equ),ch,"0"
Disp "⇒ S={",x1,",",x2,"}"
EndIf
If ch≠"=" Then
Disp "L'expression est du même signe que a=",a," à l'extérieur des racines"
Disp var,"|| -∞....."&sg&".....",min(x1,x2),"....."&op&".....",max(x1,x2),"....."&sg&".....+∞"
EndIf
ElseIf delta=0 Then
Disp "L'équation possède une seule racine réelle"
x0:=((−b)/(2*a))
Disp "x0=−b/2a
=",−b,"/",2*a,"
=",x0
If ch="=" Then
Disp "",expand(equ),ch,"0"
Disp "⇒ S={",x0,"}"
EndIf
If ch≠"=" Then
Disp "L'expression est toujours du signe de a=",a," mais s'annule en",x0
Disp var,"|| -∞.........."&sg&"..........+∞"
EndIf
ElseIf delta<0 Then
Disp "L'équation n'a aucune racine réelle"
If ch≠"=" Then
Disp "L'expression est toujours du signe de a=",a
Disp var,"|| -∞.........."&sg&"..........+∞"
EndIf
EndIf
If ch≠"=" Then
Disp "Grâce au tableau de signes, on peut conclure que :",solve(expr(string(equ)&ch&"0"),var)
EndIf
ElseIf d≠2 Then
Disp "⇔",solve(expr(string(equ)&ch&"0"),var)
EndIf
Else
Disp "⇔",factor(equ)
Disp "Etude du numérateur :",getNum(factor(equ)),ch,"0"
equ:=getNum(equ)
d:=polyDegree(equ,var)
If d=2 Then
Local coef,a,b,c,delta,x0,x1,x2
coef:=polyCoeffs(equ,var)
a:=coef[1]
b:=coef[2]
c:=coef[3]
delta:=b^(2)-4*a*c
Disp "C'est une "&when(ch≠"=","in","")&"équation du second degré
dont le discriminant vaut :"
Disp "∆=b^2-4*a*c
=",b,"^2-4*",a,"*",c,"
=",b^(2),"-",4*a*c,"
=",delta
If a>0 Then
sg:="+"
op:="-"
Else
sg:="-"
op:="+"
EndIf
If delta>0 Then
Disp "L'équation possède deux racines réelles"
x1:=((−b-√(delta))/(2*a))
x2:=((−b+√(delta))/(2*a))
Disp "x1=(−b-√(∆))/2a
=(",−b,"-√(",delta,"))/2a
=",−b-√(delta),"/",2*a,"
=",x1
Disp "x2=(−b+√(∆))/2a
=(",−b,"+√(",delta,"))/2a
=",−b+√(delta),"/",2*a,"
=",x2
If ch="=" Then
Disp "",expand(equ),ch,"0"
Disp "⇒ S={",x1,",",x2,"}"
EndIf
If ch≠"=" Then
Disp "L'expression est du même signe que a=",a," à l'extérieur des racines"
Disp var,"|| -∞....."&sg&".....",min(x1,x2),"....."&op&".....",max(x1,x2),"....."&sg&".....+∞"
EndIf
ElseIf delta=0 Then
Disp "L'équation possède une seule racine réelle"
x0:=((−b)/(2*a))
Disp "x0=−b/2a
=",−b,"/",2*a,"
=",x0
If ch="=" Then
Disp "",expand(equ),ch,"0"
Disp "⇒ S={",x0,"}"
EndIf
If ch≠"=" Then
Disp "L'expression est toujours du signe de a=",a," mais s'annule en",x0
Disp var,"|| -∞.........."&sg&"..........+∞"
EndIf
ElseIf delta<0 Then
Disp "L'équation n'a aucune racine réelle"
If ch≠"=" Then
Disp "L'expression est toujours du signe de a=",a
Disp var,"|| -∞.........."&sg&"..........+∞"
EndIf
EndIf
If ch≠"=" Then
Disp "Grâce au tableau de signes, on peut conclure que :",solve(expr(string(equ)&ch&"0"),var)
EndIf
ElseIf d≠2 Then
Disp "⇔",solve(expr(string(equ)&ch&"0"),var)
EndIf
Disp equ2
Disp "Etude du dénominateur:",getDenom(factor(left(equ2)-right(equ2))),ch,"0"
equ:=expand(getDenom(factor(left(equ2)-right(equ2))))
Disp "equ=",equ
d:=polyDegree(equ)
DelVar coef,a,b,c,delta,x0,x1,x2
If d=2 Then
Local coeffs,a,b,c,delta,x0,x1,x2
coeffs:=polyCoeffs(expand(getDenom(equ)),var)
a:=coeffs[1]
b:=coeffs[2]
c:=coeffs[3]
delta:=b^(2)-4*a*c
Disp "C'est une "&when(ch≠"=","in","")&"équation du second degré
dont le discriminant vaut :"
Disp "∆=b^2-4*a*c
=",b,"^2-4*",a,"*",c,"
=",b^(2),"-",4*a*c,"
=",delta
If a>0 Then
sg:="+"
op:="-"
Else
sg:="-"
op:="+"
EndIf
If delta>0 Then
Disp "L'équation possède deux racines réelles"
x1:=((−b-√(delta))/(2*a))
x2:=((−b+√(delta))/(2*a))
Disp "x1=(−b-√(∆))/2a
=(",−b,"-√(",delta,"))/2a
=",−b-√(delta),"/",2*a,"
=",x1
Disp "x2=(−b+√(∆))/2a
=(",−b,"+√(",delta,"))/2a
=",−b+√(delta),"/",2*a,"
=",x2
If ch="=" Then
Disp "",expand(equ),ch,"0"
Disp "⇒ S={",x1,",",x2,"}"
EndIf
If ch≠"=" Then
Disp "L'expression est du même signe que a=",a," à l'extérieur des racines"
Disp var,"|| -∞....."&sg&".....",min(x1,x2),"....."&op&".....",max(x1,x2),"....."&sg&".....+∞"
EndIf
ElseIf delta=0 Then
Disp "L'équation possède une seule racine réelle"
x0:=((−b)/(2*a))
Disp "x0=−b/2a
=",−b,"/",2*a,"
=",x0
If ch="=" Then
Disp "",expand(equ),ch,"0"
Disp "⇒ S={",x0,"}"
EndIf
If ch≠"=" Then
Disp "L'expression est toujours du signe de a=",a," mais s'annule en",x0
Disp var,"|| -∞.........."&sg&"..........+∞"
EndIf
ElseIf delta<0 Then
Disp "L'équation n'a aucune racine réelle"
If ch≠"=" Then
Disp "L'expression est toujours du signe de a=",a
Disp var,"|| -∞.........."&sg&"..........+∞"
EndIf
EndIf
If ch≠"=" Then
Disp "Grâce au tableau de signes, on peut conclure que :",solve(expr(string(equ)&ch&"0"),var)
EndIf
ElseIf d≠2 Then
Disp "⇔",solve(expr(string(equ)&ch&"0"),var)
EndIf
Disp "Ce programme ne gère pas encore ce genre d'équation, désolé :'("
EndTry
EndPrgm
Merci d'avance de votre aide et de votre patience .