Page 1 of 1

Variable : liste et matrice

Unread postPosted: 31 Oct 2013, 17:15
by Skipper64
Bonjour à tous, je viens d'avoir ma TI Nspire CX CAS, et je gratte par ci par là des infos à propos de la programmation mais je débute donc je bloque régulièrement en tentant de faire des programmes.
J'ai crée un programme qui déplace les torseurs d'un point a un autre. Or j'ai été obligé de rentrer la résultante et le moment séparément car je ne sais pas comment récupérer des coefficients à l'intérieur d'une matrice. De meme, à la fin le torseur déplacé s'affiche en deux fois ; d'abord la résultante et après le moment. J'aimerais l'afficher sous forme de matrice mais pour ce faire il faudrait récupérer les termes d'une variable liste, afin de les avoir eux mêmes comme variables et ensuite les afficher dans la matrice.
Par exemple on a : a:={x,y,z} et je voudrais afficher une matrice colonne [x,y,z] donc il faudrait que je réussisse à définir les variables x,y,z comme étant respectivement le premier, deuxième, et troisième terme de a.

Pour résumer mes interrogations sont :
- Comment extraire les coeffs d'une matrice a afin de les utiliser indépendamment comme variables ?
-Comment extraire les termes d'une liste pour les utiliser indépendamment comme variable ?
-Si il y a un moyen de dire que les termes d'une liste a={x,y,z} correspondent aux coefficients de la première colonne d'une matrice b tel que la première

Voici mon programme :

Code: Select all
Define LibPub pfd()=
Prgm
:Request "Ta initial : {Ra}=",a
:Request "Ta initial : {Ma}=",b
:Request "vecteur oa",c
:d:=b+crossP(c,a)
:disp "Τo (deplace) ="
:disp a,d
:EndPrgm


J'ai encore une dernière question, est-il possible que le programme une fois crée soit accessible depuis scratchpad via la library ? Histoire de s'en servir sans ouvrir le classeur et perdre plus de temps que de le calculer à la main ^^
Merci d'avance a tous !

Re: Variable : liste et matrice

Unread postPosted: 31 Oct 2013, 17:21
by Bisam
  • Pour utiliser les termes d'une matrice a, tu écris a[i,j].
  • Pour utiliser les termes d'une liste l, tu écris l[i]
  • Pour transformer une liste a en matrice ligne, tu écris {a}.
  • Pour transformer une liste a en matrice ligne, tu écris {a}T où T désigne le petit "T" disponible dans le catalogue et figurant la transposition. Tu peux aussi utiliser la fonction "lis>mat" (dans le catalogue également) en écrivant : list>mat(a,1)
  • Pour transformer une matrice en liste, tu utilises la fonction "mat>list" du catalogue en écrivant : mat>list(m)
  • Pour concaténer deux matrices, ou deux listes, tu utilises la fonction "augment".
    Avec deux matrices m1 et m2, tu peux les concaténer horizontalement en tapant augment(m1,m2) ou bien verticalement en tapant augment(m1;m2) (avec un ; à la place de la , ).

Enfin, il suffit de rafraîchir les bibliothèques en appuyant sur [Doc] puis 6 pour pouvoir utiliser un programme défini en "Libpub", à condition que le programme soit validé (Ctrl+b) et que le classeur dans lequel est ce programme soit enregistré (Ctrl+s).
Il apparaîtra alors directement dans le catalogue à l'onglet 6.

Re: Variable : liste et matrice

Unread postPosted: 01 Nov 2013, 01:06
by Skipper64
Merci Beaucoup grâce a ces informations j'ai pu améliorer mon programme ; voici le code
(pour ceux intéréssés : les arguments à rentrer sont
- a (torseur initial, sous forme matrice 3x2)
-c (vecteur du point d'arrivé au point initial, sous forme matrice 3x1)
Code: Select all
Define LibPub pfd3(a,c)=
Prgm
:Disp "torseur Ta=",a
:Disp "vecteur (oa)",c
:r:=[[a[1,1]][a[2,1]][a[3,1]]]
:m:=[[a[1,2]][a[2,2]][a[3,2]]]
:d:=m+crossP(c,r)
:augment(r,d)→b
:disp "Τo (deplace)="
:disp b
:EndPrgm


•Cependant, j'ai préféré ici mettre le torseur a et le vecteur c en argument car c'est trop long pour les saisir après un request ([[1,4][2,5][3,6]] par exemple) et on pourrait facilement commettre une erreur en recopiant. Connaissez vous un moyen pour utiliser le modèle matrice après une E/S du genre Request ?

•Par ailleurs, pour la suite, il faudrait que la calculette résolve une équation du genre :
∑(bi,i,1,n)=0 où chaque bi est une matrice 3x2 qui peut contenir des inconnues et 0 la matrice nulle (3x2)
j'ai essayé avec solve()

Le calcul est : solve([[ax,bx][0,0][0,0]]+[[2,3][0,0][0,0]]=[[0,0][0,0][0,0]],ax,bx) normalement Ax=-2 et Bx=-3

mais le message suivant s'affiche " Erreur de dimension : Un index de liste ou de matrice n’est pas valide. Par exemple, si l1={1, 2, 3, 4}, alors l1[5] n’existe pas, car l1 ne contient que quatre éléments."
Dès lors, est il possible de résoudre une équation de ce type ?

•Enfin même si j'enregistre, le programme n'est visible dans la librairie que depuis le classeur dans lequel je l'ai crée (à 6-library/activité courante), elle n'apparait pas dans les autres classeurs ni dans scratchpad. Pourtant j'ai suivi tout tes conseils.

Je suis enchanté de la rapidité et de la pertinence des réponses ! Merci encore !

Re: Variable : liste et matrice

Unread postPosted: 01 Nov 2013, 01:27
by Bisam
Tu peux considérablement simplifier ton programme en sachant que l'on peut récupérer la ligne i d'une matrice a par a[i].
Ainsi, tu peux écrire :
Code: Select all
Define LibPub pfd3(a,c)=
Prgm
:Disp "torseur Ta=",a
:Disp "vecteur (oa)",c
:a:=aT
:r=a[1]T
:disp "Τo (deplace)=",augment(r,a[2]T+crossp(c,r))
:EndPrgm

et puisque tu as fait le choix judicieux de mettre a et c en arguments, va jusqu'au bout et transforme ton programme en fonction... afin par exemple de pouvoir composer 2 déplacements :
Code: Select all
Define LibPub pfd3(a,c)=
Func
:local r
:a:=aT
:r=a[1]T
:return augment(r,a[2]T+crossp(c,r))
:EndFunc


Tu ne pourras pas utiliser le modèle Matrice ailleurs que dans l'écran de calcul, ou dans l'éditeur mathématique. En particulier, c'est impossible dans un programme.

Pour ce qui est de ta résolution de système, ce que tu as écrit devrait marcher... tu as dû faire une faute de frappe. Mais écris-nous ce qui a créé ton erreur précisément.

Enfin, oui, c'est normal, ton programme apparaît dans les bibliothèques en développant le nom du classeur... mais si tu appuies sur [Enter] sur le nom de ton programme, tu peux l'utiliser dans n'importe quel autre classeur ou même dans le scratchpad.

Re: Variable : liste et matrice

Unread postPosted: 01 Nov 2013, 18:05
by Skipper64
Ca fonctionne merci ! désormais j'arrive à utiliser la fonction n'importe où c'est très pratique !

  • Pour le solve(), il ne marche décidément pas ... Pour :
    Code: Select all
    solve([[0,0][0,0][−500,0]]+[[0,0][0,−0.6*za][za,0]]+[[0,0.52*zb][0,0.3*zb][zb,0]]+[[0,−0.52*zc][0,0.3*zc][zc,0]]=[[0,0][0,0][0,0]],{za,zb,zc})

    ça dit
    TI-Nspire wrote:"Erreur de dimension :
    Un index de liste ou de matrice n’est pas valide. Par exemple, si l1={1, 2, 3, 4}, alors l1[5] n’existe pas, car l1 ne contient que quatre éléments."

  • Ensuite, j'ai voulu étendre le programme pour qu'il calcule plusieurs torseurs déplacés, puis qu'il applique le Principe fondamental de la dynamique et qu'il résolve l'équation ∑(bi,i,1,n)=0 où chaque bi est une matrice 3x2 (tous les torseurs déplacés)
    Le problème c'est que premièrement ça me dit "erreur de dimension" dans l'application calcul donc ça me dira la même chose dans le programme.
    Et deuxièmement je voulais profiter des arguments et donc du modèle matrice pour entrer tous les couples Torseurs initiaux/vecteurs déplacement associés directement dans les arguments. Pb : leur nombre étant indéterminé, j'ai voulu les mettre dans une liste l puis les récupérer avec ai:=l[i] et ci:=l[i+1] en utilisant un For i,1,2n-1,2. Voici le début du code:
    -n est le nombre de torseurs à déplacer, donc le nombre de couples torseur/vecteur déplacement.
    -l est la liste du type {a1,c1,a2,c2,...an,cn}
    Code: Select all
    Define LibPub pfd5(n,l)=
    Prgm
    :For i,1,2n-1,2
    :  a:=l[i]
    :  c:=l[i+1]
    :    r:=(aT[1])T
    :    Disp "⇒ Torseur Τo",i,"=",augment(r,(aT[2])T+crossP(c,r))
    :EndFor

    Mais pour tester, j'écris
    Code: Select all
    pfd5(1,{[[0,0][0,0][-5000,0]],[[-0.2][1.5][-2]]}
    et le message apparait "Liste ou matrice invalide."

    Suis-je obligé de rentrer les matrices après, avec un for i,2n-1 suivi d'un "Request ,ai" ou il y a un moyen d'entrer un nombre indéterminé de matrices comme argument ?

Merci pour tout :)

Re: Variable : liste et matrice

Unread postPosted: 01 Nov 2013, 18:40
by Levak
Déplacé dans "Programmation TI-Basic".
Pourquoi avais-tu pensé que c'était du Lua ?

Re: Variable : liste et matrice

Unread postPosted: 01 Nov 2013, 19:28
by Skipper64
J'ai cru que puisque mon OS était 3.02 c'était du Lua ^^
Mais j'y connais rien c'est pour ça ^^

Re: Variable : liste et matrice

Unread postPosted: 01 Nov 2013, 19:44
by Levak
Skipper64 wrote:J'ai cru que puisque mon OS était 3.02 c'était du Lua ^^
Mais j'y connais rien c'est pour ça ^^

L'OS 3.0 a introduit le Lua, mais celui-ci n'est pas programmable directement sur la calculatrice.
Regarde vite fait ce que peut faire le Lua comparé au TI-Basic et tu comprendras la différence.

Re: Variable : liste et matrice

Unread postPosted: 02 Nov 2013, 10:09
by Bisam
Tu ne peux pas faire une liste de matrices... la calculatrice ne voudra pas.
Pour elle, une matrice est déjà une liste de listes... mais au-delà, ça ne lui plaît pas !
Donc, tu ne pourras pas t'en sortir ainsi.

Quant à la résolution du système matriciel, cela ne marche que lorsque ce sont des listes, des matrices lignes ou des matrices colonnes apparemment.
Donc, il va falloir utiliser un détour.
Par exemple, cela fonctionne si tu écris :
Code: Select all
solve(mat>list([[0,0][0,0][−500,0]]+[[0,0][0,−0.6*za][za,0]]+[[0,0.52*zb][0,0.3*zb][zb,0]]+[[0,−0.52*zc][0,0.3*zc][zc,0]])=mat>list([[0,0][0,0][0,0]]),{za,zb,zc})

On a simplement transformé les matrices en listes...

Re: Variable : liste et matrice

Unread postPosted: 05 Nov 2013, 19:18
by Skipper64
Merci beaucoup pour tous ces conseils et informations ! :D
Si la calculatrice n'accepte pas une liste de matrice alors tant pis je vais créer le programme avec des "request" pour les autres torseurs. Ou alors rajouter au programme une ligne pour stocker la matrice, ensuite lancer le programme autant de fois que nécessaire et entrer à la main solve(a+b+..=0,{a,b,..})
J'informerais de l'avancement prochainement à bientôt !