Problème avec Xcas pour résolution équation formelle

Utilisation de Xcas

Modérateur : xcasadmin

Répondre
cyril
Messages : 7
Inscription : mar. avr. 01, 2014 12:30 pm

Problème avec Xcas pour résolution équation formelle

Message par cyril » mar. avr. 01, 2014 1:47 pm

Bonjour,
Je suis nouveau.
Voilà, je cherche à résoudre une équation assez compliquée du type F(a,b,c,d,e,f,g, u, ,x)>0 avec x l'inconnu et les autres des paramètres.
J'ai également des hypothèses simples (comme par exemple, 0<x<1, 0<a<1, c>u ...) ... J'ai également des hypothèses un peu plus compliquées telles que : ((a*d)/(a*d*(t+1)*x+c*o)+(o*r)/(m*u*x)+(v-w)/(c*m*u)+(a*d*r*(t+1))/(c*m*u))^2>4*a*d*r/(c*m*u*x))>0.
Voici donc le programme Xcas suivant :

assume(x<1 and x>0);
assume(a>0 and a<1);
assume(c>0);
assume (u>0);
assume (c>u);
assume(d>0);
assume (d=c-u);
assume(m>0 and m<1);
assume(r >0 and r<1);
assume(v>0);
assume (w>0);
assume(v>w);
assume (t>0);
assume (x>((1-c*o/(a*d))/(1+t)));
assume (((a*d)/(a*d*(t+1)*x+c*o)+(o*r)/(m*u*x)+(v-w)/(c*m*u)+(a*d*r*(t+1))/(c*m*u))^2>4*a*d*r/(c*m*u*x));
assume (((v-w)/(c*m*u)+(a*d*r*(t+1))/(c*m*u)+(o*r)/(m*u)+(a*d)/(a*d*(t+1)+c*o))^2>(4*a*d*r)/(c*m*u));

En code :

Code : Tout sélectionner

assume(x<1 and x>0);
assume(a>0 and a<1);
assume(c>0);
assume (u>0);
assume (c>u);
assume(d>0);
assume (d=c-u);
assume(m>0 and m<1);
assume(r >0 and r<1);
assume(v>0);
assume (w>0);
assume(v>w);
assume (t>0);
assume (x>((1-c*o/(a*d))/(1+t)));
assume (((a*d)/(a*d*(t+1)*x+c*o)+(o*r)/(m*u*x)+(v-w)/(c*m*u)+(a*d*r*(t+1))/(c*m*u))^2>4*a*d*r/(c*m*u*x));
assume (((v-w)/(c*m*u)+(a*d*r*(t+1))/(c*m*u)+(o*r)/(m*u)+(a*d)/(a*d*(t+1)+c*o))^2>(4*a*d*r)/(c*m*u));
Puis, j'ajoute l'expression à résoudre :
solve (-(((a*d)/(a*d*(t+1)*x+c*o)+(o*r)/(m*u*x)+(v-w)/(c*m*u)+(a*d*r*(t+1))/(c*m*u))^2-(4*a*d*r)/(c*m*u*x))^0.5-(a*d)/(a*d*(t+1)*x+c*o)+(o*r*(1/x-1))/(m*u)+(((v-w)/(c*m*u)+(a*d*r*(t+1))/(c*m*u)+(o*r)/(m*u)+(a*d)/(a*d*(t+1)+c*o))^2-(4*a*d*r)/(c*m*u))^0.5+(a*d)/(a*d*(t+1)+c*o),x)

En code :

Code : Tout sélectionner

solve (-(((a*d)/(a*d*(t+1)*x+c*o)+(o*r)/(m*u*x)+(v-w)/(c*m*u)+(a*d*r*(t+1))/(c*m*u))^2-(4*a*d*r)/(c*m*u*x))^0.5-(a*d)/(a*d*(t+1)*x+c*o)+(o*r*(1/x-1))/(m*u)+(((v-w)/(c*m*u)+(a*d*r*(t+1))/(c*m*u)+(o*r)/(m*u)+(a*d)/(a*d*(t+1)+c*o))^2-(4*a*d*r)/(c*m*u))^0.5+(a*d)/(a*d*(t+1)+c*o),x)
Une fois tapé le programme, plusieurs problèmes se posent :
1. La syntaxe des hypothèses suivantes sur les paramètres est a priori mauvaise :
assume (((a*d)/(a*d*(t+1)*x+c*o)+(o*r)/(m*u*x)+(v-w)/(c*m*u)+(a*d*r*(t+1))/(c*m*u))^2>4*a*d*r/(c*m*u*x));
assume (((v-w)/(c*m*u)+(a*d*r*(t+1))/(c*m*u)+(o*r)/(m*u)+(a*d)/(a*d*(t+1)+c*o))^2>(4*a*d*r)/(c*m*u));
2. Si j'enlève ces hypothèses, le calcul débute puis une erreur apparait : "Non implementé (par ex pour des polynômes modulaires ou approches de dim>1) Erreur: Type Argument Incorrect". Comme vous le voyez, x est à plusieurs endroits et est également présent dénominateur (et quelquefois au carré).

Avez vous une idée sur la manière de régler ces différents problèmes?
Merci par avance
Pièces jointes
message_erreur.jpg
Visualisation du message d'erreur
message_erreur.jpg (142.68 Kio) Consulté 14967 fois

frederic han
Messages : 1137
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Re: Problème résolution équation relativement difficile

Message par frederic han » mer. avr. 02, 2014 9:30 am

attention, vous avez mis des 0.5, ce qui n'est pas la meme chose que 1/2 (mode approche contre mode exact).
Si vous esperez une solution formelle il ne faut pas introduire de flottants.

La forme avec les racines est un peu brutale.
prennons votre equation (avec les 0.5 transformes en 1/2)

Code : Tout sélectionner

f:=-(((v-w)/(c*m*u)+(a*d*r*(t+1))/(c*m*u)+(o*r)/(x*m*u)+(a*d)/(a*d*x*(t+1)+c*o))^2-(4*a*d*r)/(c*x*m*u))^(1/2)+(((v-w)/(c*m*u)+(a*d*r*(t+1))/(c*m*u)+(o*r)/(m*u)+(a*d)/(a*d*(t+1)+c*o))^2-(4*a*d*r)/(c*m*u))^(1/2)+((1/x-1)*o*r)/(m*u)-(a*d)/(a*d*x*(t+1)+c*o)+(a*d)/(a*d*(t+1)+c*o);
on elimine la racine carree sur les x avec cette nouvelle equation:

Code : Tout sélectionner

g:=part(f,1)^2-(part(f,2)+part(f,3)+part(f,4)+part(f,5))^2;
On simplifie (un peu mais pas trop car c'est lourd, donc on prefere ratnormal) puis on prend le numerateur de cette nouvelle equation.

Code : Tout sélectionner

rg:=ratnormal(g);
nrg:=numer(rg);
alors xcas arrive a le factoriser:

Code : Tout sélectionner

frg:=factor(nrg);
il y a un facteur x-1:

Code : Tout sélectionner

part(fr,2);
mais aussi un facteur non trivial de degre 1:

Code : Tout sélectionner

degree(part(frg,3),x);
On obtient une solution non triviale avec:

Code : Tout sélectionner

s:=solve(part(frg,3),x);

cyril
Messages : 7
Inscription : mar. avr. 01, 2014 12:30 pm

Re: Problème résolution équation relativement difficile

Message par cyril » mer. avr. 02, 2014 10:14 am

Merci pour vos réponses.
Quelques points en suspens :
1. Xcas affiche une erreur pour la formulation suivante :
frederic han a écrit : il y a un facteur x-1:

Code : Tout sélectionner

part(fr,2);
, ne serait-ce pas le code suivant :

Code : Tout sélectionner

part(frg,2); 
? Pour la suite, j'ai considéré le code

Code : Tout sélectionner

part(frg,2); 
2. Si on souhaite trouver les solutions de l'inéquation F>0, il suffit simplement d'insérer à la fin le code suivant :

Code : Tout sélectionner

s:=solve(part(frg,3)>0,x);
à la place de

Code : Tout sélectionner

s:=solve(part(frg,3),x);
Merci par avance,
Dernière modification par cyril le mer. avr. 02, 2014 12:51 pm, modifié 3 fois.

frederic han
Messages : 1137
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Re: Problème avec Xcas pour résolution équation formelle

Message par frederic han » mer. avr. 02, 2014 12:34 pm

oui c'est bien avec frg.

Vous avez une inequation du type: A*x+B>0 avec:

Code : Tout sélectionner

A:=(coeff(part(frg,3),x,1));
B:=(coeff(part(frg,3),x,0));
la verification suivante donne bien 0:

Code : Tout sélectionner

ratnormal(A*x+B-part(frg,3))
donc l'intervalle de solution est clair a la main si l'on connait le signe de A. je ne sais pas si vos hypotheses permettent de le determiner, mais la forme factorisee de A est plus lisible:

Code : Tout sélectionner

factor(A);
ceci dit vous allez devoir observer cette reponse pour ne pas etre trop brutal.

cyril
Messages : 7
Inscription : mar. avr. 01, 2014 12:30 pm

Re: Problème résolution équation relativement difficile

Message par cyril » mer. avr. 02, 2014 12:50 pm

Ok, merci je vais voir plus en détails cela.
Cependant, pour revenir à votre premier post, quelques intérrogations subsistent.
1. Je n'arrive pas a comprendre pourquoi les codes 1 et 2 donnent la même expression (code 1 :

Code : Tout sélectionner

f:=-(((v-w)/(c*m*u)+(a*d*r*(t+1))/(c*m*u)+(o*r)/(x*m*u)+(a*d)/(a*d*x*(t+1)+c*o))^2-(4*a*d*r)/(c*x*m*u))^(1/2)+(((v-w)/(c*m*u)+(a*d*r*(t+1))/(c*m*u)+(o*r)/(m*u)+(a*d)/(a*d*(t+1)+c*o))^2-(4*a*d*r)/(c*m*u))^(1/2)+((1/x-1)*o*r)/(m*u)-(a*d)/(a*d*x*(t+1)+c*o)+(a*d)/(a*d*(t+1)+c*o) ;

et code 2 :

Code : Tout sélectionner

g:=part(f,1)^2-(part(f,2)+part(f,3)+part(f,4)+part(f,5))^2;
).
En résumé, j'ai du mal a vous suivre sur la démarche (je ne suis pas très a l'aise avec ce type de programmation, je ne connais habituellement que les logiciels de stat et Maxima mais version ludique). Après m'être renseigné sur le fonction part, je n'arrive pas à voir dans quelles mesure les deux expressions sont identiques.
2. Ensuite, lorsque j'exécute

Code : Tout sélectionner

 rg:=ratnormal(g);
,, la réponse du logiciel est "DONE", je n'ai donc pas l'expression simplifiée, est-ce normal (l'expression ne se termine pas par :;)?
3. Pourquoi prend on le numérateur de l'expression donnée par

Code : Tout sélectionner

 rg:=ratnormal(g);
?
4. Concernant

Code : Tout sélectionner

degree(part(frg,3),x);
, pourquoi prend t on la partie 3 de l'expression frg ?
5.Enfin, une fois exécuté le code

Code : Tout sélectionner

s:=solve(part(frg,3),x);
, aucune solution s'affiche. Seule "DONE" apparait à l'écran en bleu (je n'ai pas terminé l'expression par :;). Dois-je aller récupérer les résultats à un endroit particulier ?


Merci par avance,

frederic han
Messages : 1137
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Re: Problème avec Xcas pour résolution équation formelle

Message par frederic han » mer. avr. 02, 2014 1:25 pm

votre f est une somme de 5 termes:

Code : Tout sélectionner

part(f,0);
part(f);
En les observant on voit que la premier a du x sous la racine et pas les autres, donc au lieu de chercher les racines d'une expression de type u+v j'ai plutot cherche les racines de (u+v)*(u-v) =u^2-v^2
ou u est le premier terme de f et v la somme des 4 derniers. (ie g n'est pas f mais f multiplie par son conjugue).

Maintenant que j'ai g, j'effectue des simplifications rationnelles avec ratnormal(g) pour eliminer les facteurs communs au numerateur et denominateur.
pensez à la difference entre:
(x+1)/(x^2+2*x+1) et ratnormal((x+1)/(x^2+2*x+1));
(pour votre question 2: Done veut dire que le calcul est fait mais qu'il est trop gros pour etre affiche. en tout cas on l'a range dans rg)

Au depart on voulait juste les racines de g (ou de rg), ce sont donc les memes que celles de son numerateur, c'est pour cela que je me suis limite au numerateur, mais pour le signe vous devez aussi observer le denominateur avec:

Code : Tout sélectionner

factor(denom(rg));
pour la question 3:
observez l'expression frg, c'est un produit de 7 termes:

Code : Tout sélectionner

part(frg,0);
part(frg);
le premier est 2, le second (x-1) le troisieme est aussi de degre 1 en x et les autres sont de degre 0 en x comme le montre la suite des degres en x de ces termes:

Code : Tout sélectionner

seq(degree(part(frg,k),x),k=1..7);
donc pour le signe vous devrez tenir compte du signe des autres facteurs.

je me suis donc interesse au seul facteur non trivial en x qui etait le 3ieme avec part(frg,3)

parisse
Messages : 5739
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Problème avec Xcas pour résolution équation formelle

Message par parisse » mer. avr. 02, 2014 1:57 pm

je n'ai pas regarde le fonds, je reponds juste sur le fait que Xcas renvoie Done sans qu'on ait tape :;, il s'agit d'une protection pour eviter de crasher lorsque l'expression est trop grosse. Vous pouvez la sauvegarder dans un fichier texte (commande write) ou l'etudier avec rg[0] (operateur), rg[1], rg[2], etc. les arguments (notation raccourci equivalente a part)

cyril
Messages : 7
Inscription : mar. avr. 01, 2014 12:30 pm

Re: Problème avec Xcas pour résolution équation formelle

Message par cyril » mer. avr. 02, 2014 4:06 pm

Merci,
parisse a écrit :je n'ai pas regarde le fonds, je reponds juste sur le fait que Xcas renvoie Done sans qu'on ait tape :;, il s'agit d'une protection pour eviter de crasher lorsque l'expression est trop grosse. Vous pouvez la sauvegarder dans un fichier texte (commande write) ou l'etudier avec rg[0] (operateur), rg[1], rg[2], etc. les arguments (notation raccourci equivalente a part)

Dans ce cas,je dois donc après avoir spécifier la commande suivante visant à résoudre l'équation (en fonction de x):

Code : Tout sélectionner

s:=solve(part(frg,3),x);
la ligne suivante :

Code : Tout sélectionner

write("Solution de l'équation ",s); 
Si oui, cela signifie donc (cf image ci dessous) que la solution du problème serait 1?
Pièces jointes
affichage.jpg
affichage.jpg (203.3 Kio) Consulté 14906 fois

frederic han
Messages : 1137
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Re: Problème avec Xcas pour résolution équation formelle

Message par frederic han » mer. avr. 02, 2014 4:57 pm

Non 1 est la valeur de retour de la fonction write, ca veut probablement juste dire qu'il a reussi a ecrire la reponse dans le fichier.
s une liste de la solution annulant le facteur non evident.
1 est bien racine de g mais elle est dans le second facteur, je n'en ai pas tenu compte car elle est evidente.
Je n'avais pas remarque que s etait invisible pour vous car j'avais teste sous qcas.

vous pouvez voir votre solution car factor(s[0]) est assez petit pour etre affiche, mais c'est plus lisible de dire que c'est:

-B/A et de regarder factor(A) et factor(B)
a+

Frederic

cyril
Messages : 7
Inscription : mar. avr. 01, 2014 12:30 pm

Re: Problème avec Xcas pour résolution équation formelle

Message par cyril » jeu. avr. 03, 2014 9:45 am

Pouvez-vous svp vérifier le programme de résolution de l"équation ci dessous :

Code : Tout sélectionner

// Programme résolution équation
// on déclare les variables
Programme(x,a,c,u,d,m,r,v,w,t,o):={
// on déclare les variables locales 
    local  f,g,rg,nrg,frg,s;
//Les hypothèses suivantes :
supposons(x<1 and x>0);
supposons(a>0 and a<1);
supposons(c>0);
supposons (u>0);
supposons (c>u);
supposons(d>0);
supposons (d=c-u);
supposons(m>0 and m<1);
supposons(r >0 and r<1);
supposons(v>0);
supposons (w>0);
supposons(v>w);
supposons (t>0);
supposons (x>((1-c*o/(a*d))/(1+t)));
// les deux hypothèses ci-dessous posent actuellement problème a Xcas d'où une non prise en compte : 
// supposons (((a*d)/(a*d*(t+1)*x+c*o)+(o*r)/(m*u*x)+(v-w)/(c*m*u)+(a*d*r*(t+1))/(c*m*u))^2>4*a*d*r/(c*m*u*x));
// supposons (((v-w)/(c*m*u)+(a*d*r*(t+1))/(c*m*u)+(o*r)/(m*u)+(a*d)/(a*d*(t+1)+c*o))^2>(4*a*d*r)/(c*m*u));

//La Fonction f à résoudre est ci-dessous : 
f:=-(((v-w)/(c*m*u)+(a*d*r*(t+1))/(c*m*u)+(o*r)/(x*m*u)+(a*d)/(a*d*x*(t+1)+c*o))^2-(4*a*d*r)/(c*x*m*u))^(1/2)+(((v-w)/(c*m*u)+(a*d*r*(t+1))/(c*m*u)+(o*r)/(m*u)+(a*d)/(a*d*(t+1)+c*o))^2-(4*a*d*r)/(c*m*u))^(1/2)+((1/x-1)*o*r)/(m*u)-(a*d)/(a*d*x*(t+1)+c*o)+(a*d)/(a*d*(t+1)+c*o);
g:=part(f,1)^2-(part(f,2)+part(f,3)+part(f,4)+part(f,5))^2;
//Simplification
rg:=ratnormal(g);
//Comme on souhaite =0, on ne prend que le numérateur d'où 
nrg:=numer(rg);
// On factorise le numerateur
frg:=factor(nrg);
//On regarde si ses différentes parties contiennent du x 
part(frg,2);
// On voit donc que la partie 2 est fonction de x, solution triviale : x=1
degree(part(frg,3),x);
//Et donc également un facteur comportant x de degré 1

//On cherche donc la solution =0 de ce dernier facteur, les autres facteurs ne dépendant pas de x sauf la partie 2 (solution triviale 1)
s:=solve(part(frg,3),x);
write("Solutions",s);
// Le fichier solution contiendra toutes les listes de solution annulant la partie 3.  Toutes les solutions de l'équation sont donc celles listées dans s + 1 (cf partie 2)
return s;
}
:;

Une fois les calculs terminés,
// Interprète Programme
// Succès lors de la compilation Programme
et Done apparaissent.
Cependant, cela ne crée pas le fichier "Solutions" (cf commande write). En remplaçant par la commande suivante :

Code : Tout sélectionner

write("C:/Users/Cyril/Documents/Documentation Xcas/Calculs_Xcas/Solutions",s);
, aucune modification se produit.

parisse
Messages : 5739
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Problème avec Xcas pour résolution équation formelle

Message par parisse » jeu. avr. 03, 2014 10:48 am

Solutions est probablement cree dans le repertoire d'install de Xcas. Si vous voulez le creer ailleurs, il faut utiliser un chemin aux normes cygwin, /cygdrive/c/Users etc. et la presence d'espaces risque de poser des problemes.

frederic han
Messages : 1137
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Re: Problème avec Xcas pour résolution équation formelle

Message par frederic han » jeu. avr. 03, 2014 11:50 am

Je suis inquiet sur la facon dont vous aller appeler ce programme:

Code : Tout sélectionner

Programme(x,a,c,u,d,m,r,v,w,t,o)
par exemple si vous l'appelez avec d'autre lettres, l'ordre des facteurs ne sera peut etre pas le meme.
D'autre part, si vous l'appelez avec des valeurs ca risque aussi de changer.

D'autre part, dans un programme les calculs intermediares ne sont pas affichez, si vous voulez les voir il faut mettre un print ou les retourner. Cf:
// On voit donc que la partie 2 est fonction de x, solution triviale : x=1
degree(part(frg,3),x);
s est une liste (ie: votre solution entre des [ ])
si vous voulez vraiment votre solution, retournez s[0]

vous pouvez retirer tous vos assume ils ne servent a rien.

cyril
Messages : 7
Inscription : mar. avr. 01, 2014 12:30 pm

Re: Problème avec Xcas pour résolution équation formelle

Message par cyril » jeu. avr. 03, 2014 3:18 pm

Ok, merci. Je vais faire manuellement un à un, ce sera plus simple. J'ai trouvé le fichier relatif à write.
[ quote="frederic han"] vous pouvez retirer tous vos assume ils ne servent a rien.[/quote]
=> assume ne peut donc pas jouer le rôle de contrainte ?

Après, je suis en train de regarder un peu plus en profondeur le problème dans le cadre d'une inéquation, le dénominateur est toujours positif (tous les variables/paramètres sont par hypothèse strictement positifs). Le problème pour une résolution formelle réside alors dans l'interprétation du numérateur et plus particulièrement du signe de la partie 3 (A*x+B ou A et B semblent être des expression très compliquées même simplifiées). Quant aux autres parties, elle sont positives à l'exception de la partie 2 (x-1) qui est négative (car par hypothèse 0<x<1) => donc, si l'on souhaite que l'expression soit positive, la partie 3 devra donc être négative.

cyril
Messages : 7
Inscription : mar. avr. 01, 2014 12:30 pm

Re: Problème avec Xcas pour résolution équation formelle

Message par cyril » ven. avr. 04, 2014 8:56 am

frederic han a écrit :votre f est une somme de 5 termes:

Code : Tout sélectionner

part(f,0);
part(f);
En les observant on voit que la premier a du x sous la racine et pas les autres, donc au lieu de chercher les racines d'une expression de type u+v j'ai plutot cherche les racines de (u+v)*(u-v) =u^2-v^2
ou u est le premier terme de f et v la somme des 4 derniers. (ie g n'est pas f mais f multiplie par son conjugue)
=> Par conséquent, si l'on veut étudier le signe de la dérivée de f, on ne peut s'appuyer sur le signe de la dérivée de g (g' est relaticement plus simple à étudier)?
P.S Etant donné que x est défini sur [0,1] et que f(x=1)=0, l'étude de la dérivée de f pourrait nous en dire davantage sur le signe de f.

Répondre