lncollect

Utilisation de Xcas

Modérateur : xcasadmin

alb
Messages : 1241
Inscription : ven. août 28, 2009 3:34 pm

lncollect

Message par alb » jeu. oct. 15, 2020 4:51 pm

autrefois simplifier(a/b*ln(k)) avec a,b,k entiers renvoyait toujours ln(k^a)/b avec k^a evalue
Y-t-il actuellement en combinant eventuellement plusieurs fonctions un moyen d'obtenir ce resultat ? (sans decomposer l'expression)
par exemple lncollect(4/5*ln(123)) renvoie ln(228886641)/5 mais lncollect(7/5*ln(123)) renvoie 7*ln(123)/5

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

Re: lncollect

Message par parisse » dim. oct. 18, 2020 5:34 pm

Il y a une limite sur la taille de l'exposant (<MAX_ALG_EXT_ORDER_SIZE), qu'on peut gerer depuis C++ mais pas depuis Xcas. La valeur est de 6. Je pourrais ajouter une commande pour gerer depuis Xcas, mais le probleme sera seulement repousse.

alb
Messages : 1241
Inscription : ven. août 28, 2009 3:34 pm

Re: lncollect

Message par alb » dim. oct. 18, 2020 7:10 pm

non ce n'est pas utile, l'interet serait anecdotique.
A l'epoque (peut etre il y a 6/7 ans, la taille maximale de l'exposant aurait change ?) j'avais ecrit un programme pour que mes eleves pussent verifier leur developpement d'une somme de ln
Voici le programme (excuse l'amateurisme ! )

Code : Tout sélectionner

/**************************************************************
********** Décomposer une combinaison linéaire de ln **********
****************** à coefficients rationnels ******************
**************************************************************/

// Aprés compilation taper DecomposerLn(expression)
// par exemple E:=8/5*ln(125/289)-2/3*ln(1024/81);DecomposerLn(E);

Ln_entier(N):={
  local L,s,k;
  L:=ifactors(N);
  s:=size(L);
  retourne somme(L[2k+1]*ln(L[2k]),k,0,s/2-1);
}
:;
Ln(N):={
  si type(N)==DOM_INT alors 
    retourne Ln_entier(N)
  sinon
    si type(N)==DOM_RAT alors 
      retourne Ln_entier(numer(N))-Ln_entier(denom(N)) 
    sinon 
      retourne ln(N)
    fsi;
  fsi;
}
:;
DecomposerLn(E):={ //simplifier une combinaison linéaire de ln à coeff rat
  local s,L,k;
  si type(E)==DOM_INT ou type(E)==DOM_RAT alors 
    retourne E 
  fsi
  L:=100+E;//pour que L soit une somme d'au moins deux termes
  L:=expand(lnexpand(L));
  L:=simplifier(op(L));
  s:=size(L);
  pour k de 0 jusque s-1 faire
    si L[k]!=100 alors
    si sommet(L[k])=='ln' alors 
      L[k]=<Ln(op(L[k])) //pour ln(A)
    sinon 
      si sommet(op(L[k]))=='ln' alors 
        L[k]=<-Ln(op(op(L[k]))) //pour -ln(A)
      sinon
        si sommet(op(L[k])[0])=='ln' alors 
          L[k]=<op(L[k])[1]*Ln(op(op(L[k])[0])) //pour ln(A)/B
        sinon 
          si sommet(op(op(L[k]))[0])=='ln' alors 
            L[k]=<-op(op(L[k]))[1]*Ln(op(op(op(L[k]))[0])) //pour -ln(A)/B
          fsi; 
        fsi 
      fsi 
    fsi
    fsi
  fpour;
  retourne tsimplify(sum(lnexpand(L[k]),k,0,s-1)-100);//remplace tsimplify(sum(L[k],k,0,s-1)-100);
}
:;
en tapant
E:=8/5*ln(125/289)-2/3*ln(1024/81);DecomposerLn(E);
on obtenait
(-16/5)*ln(17)-20/3*ln(2)-(-8/3)*ln(3)-(-24/5)*ln(5)

Aujourd'hui j'obtiens
2*ln(81)/3+8*ln(125)/5-8*ln(289)/5-2*ln(1024)/3
cad le resultat de lnexpand(E)

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

Re: lncollect

Message par parisse » lun. oct. 19, 2020 7:48 am

La taille n'a pas change, mais j'ai modifie le code de lncollect (malheureusement sans commenter pourquoi).
Je rajoute une commande max_alg_ext_order_size(), ca ne coute pas cher. Il devrait suffire de la mettre au minimum avant et de la retablir apres.

alb
Messages : 1241
Inscription : ven. août 28, 2009 3:34 pm

Re: lncollect

Message par alb » lun. oct. 19, 2020 11:45 am

comment utiliser concretement cette commande dans le programme ?

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

Re: lncollect

Message par parisse » lun. oct. 19, 2020 2:52 pm

Avec une variable de sauvegarde et un truc du genre:

Code : Tout sélectionner

in_le_programme(arguments):={
...
}:;

le_programme(arguments):={
local s,res;
s:=max_alg_ext_order_size();
max_alg_ext_order_size(1);
res:=in_le_programme(arguments);
max_alg_ext_order_size(s);
return res;
}:;

alb
Messages : 1241
Inscription : ven. août 28, 2009 3:34 pm

Re: lncollect

Message par alb » mar. oct. 20, 2020 3:18 pm


Répondre