Page 1 of 2

simplifier expression

Unread postPosted: 14 Dec 2015, 17:39
by kadtexas
Bonjour

Par exemple l'équation d'un plan est ax+by+cz+d=0
Une fois que le programme a déterminé les coefficients a,b,c et d on arrive à:
disp 2x-4y+6z-8=0
Y'a t il moyen de simplifier cette égalité par 2 pour arriver à:x-2y+3z-4=0 ?

Merci pour vos commentaires

Re: simplifier expression

Unread postPosted: 14 Dec 2015, 17:52
by Hamza.S
je ne connais pas une fonction qui permet de faire ça mais avec la fonction factor( tu peux mettre en facteur

Re: simplifier expression

Unread postPosted: 14 Dec 2015, 18:06
by kadtexas
Oui la fonction factor() factorise par 2 mais ne simplifie pas!

Re: simplifier expression

Unread postPosted: 14 Dec 2015, 18:08
by Hamza.S
la simplification se fait facilement une fois que tu as le facteur commun

Re: simplifier expression

Unread postPosted: 14 Dec 2015, 18:23
by Bisam
Tu peux tenter : 2x-4y+6z-8=0 and true
La calculette va essayer de déterminer la valeur de vérité de l'expression en tenant de résoudre. En faisant cela, il arrive souvent qu'elle simplifie l'expression avant de la renvoyer. C'est le cas ici.

Sinon, il est tout-à-fait faisable en Basic de récupérer les coefficients de l'expression, de calculer leur pgcd et de diviser le tout par le pgcd... mais est-ce vraiment nécessaire ?

Re: simplifier expression

Unread postPosted: 14 Dec 2015, 20:31
by Hamza.S
voilà pourquoi j'ai pas voulu développer ma pensée j'étais sûr que Bisam aurait un astuce

Re: simplifier expression

Unread postPosted: 15 Dec 2015, 22:44
by Bisam
Pour la méthode de simplification en récupérant la liste des coefficients, on peut faire ainsi :
Code: Select all
Define simplify(eq) = Func
  {x, y, z} → var
  dim(var) → n
  {} → coeffs
  left(eq) - right(eq) → eq
  For i, 1, n
    derivative(eq, var[i]) → coeffs[i]
    eq - coeffs[i] * var[i] → eq
  EndFor
  eq → coeffs[n+1]
  eq → pgcd
  For i, 1, n
    gcd(pgcd, coeffs[i]) → pgcd
  EndFor
  If left(string(pgcd), 3) = "gcd"
    1 → pgcd
  Return dotp(coeffs / pgcd, augment(var, {1})) = 0
EndFunc

Cette fonction ne marchera que si l'équation est linéaire et si les variables x, y, z sont inutilisées dans le classeur.

PS : Elle marche même s'il n'y a qu'une ou deux variables parmi x, y, z, bien sûr... Et je l'ai écrite de sorte qu'il n'y ait qu'une ligne à modifier si jamais vous voulez d'autres variables ou encore les préciser plutôt comme paramètres.

Re: simplifier expression

Unread postPosted: 16 Dec 2015, 12:15
by kadtexas
Bonjour Bisam et merci pour l'algorithme que je n'ai pas encore essayé.
Mais ton idée: 2x-4y+6z-8=0 and true march très bien, je l'ai essayée et même ça simplifie une expression avec dénominateur comme 1/3*x-5/6*y+7z-1/4=0.
Est ce que ta fonction "simplify(eq)" apporterai quelquechose en plus ?

Re: simplifier expression

Unread postPosted: 16 Dec 2015, 14:05
by Bisam
Je ne pense pas... et elle réussit même moins bien s'il y a des inconnues dans l'expression (genre
$mathjax$2ax+2y+2z=0$mathjax$
), mais elle peut être réutilisée pour d'autres situations.
C'est plutôt un guide à l'usage du programmeur.

Re: simplifier expression

Unread postPosted: 16 Dec 2015, 17:45
by kadtexas
Par simple curiosité, comment la calculette arrive à simplifier en utilisant:2x-4y+6z-8=0 and true
L'opérateur and évalue true qui est par définition "vrai' puis évalue 2x-4y+6z-8=0
alors je pense que:que la calculette factorise, donc 2(x-2y+3z-4)=0, produit de facteurs nul donc 2 different de 0 et
x-2y+3z-4=0, plus d'inconnues que d'équations, forcément il y a des solutions donc 2x-4y+6z-8=0 est vraie.
vrai and vrai = vrai.
Ce ne sont que des suppositions de ma part!