Page 1 of 1

FSG

Unread postPosted: 25 Jan 2016, 16:40
by alphaméthyste
Salut les camarades

ici un truc sympa en remerciement pour toutes les fois que vous m'avez aidé

ici une fonction sympa sur la t-nspire CX CAS que je nomme sev(M)=N

cette fonction consiste à partir d'une matrice non nulle quelconque
$mathjax$M\in \mathcal {M}_{np}(\mathbb {C})$mathjax$
de construire une matrice N de même rang que M mais telle que tout vecteur colonne de N est aussi un vecteur colonne de M

pour ce faire ici j'utilise la forme sesquilinéaire à gauche (d'où le titre FSG)

par exemple

M est une matrice de rang 4 selon

$mathjax$M=\begin {pmatrix} 1 & 2 & 0 & -i & -i & i & 1-7i &2i \\ i &2i & -i & 0 & i & 1 & -4+3i & 1-i \\ -1 & -2 & -2i & i& 3i& 0& -1+7i& -3i \\ 2 &4 &1 &-1 &-2 &-i &-3+4i &2-i \\ -2i & -4i & 1 & 2 & 1 & 2i & 4-10i& -1+2i \end {pmatrix}$mathjax$


et on obtiens
$mathjax$N=\begin {pmatrix} 1 & 0 & -i & i \\ i & -i & 0 & 1 \\ -1 & -2i & i& 0 \\ 2 &1 &-1 &-i \\ -2i & 1 & 2 & 2i \end {pmatrix}$mathjax$


la fonction sev(M)=N (voir post precedent)

elle fonctionne avec six autres fonctions dont je fais aussi le listing (tout fonctionne à présent)

les fonctions nul(x) , unit(x) , norme (x) , colineaire(x,y) , compose(x,y) , supp (i,j,x)

Listing sev(M)=N


attention ici -ma machine fonctionne comme ça mais il est possible que sur d'autres machines se soit différent- pour toute matrice M à valeurs complexes alors M^T désigne la matrice transconjuguée de M (la matrice adjointe)

Code: Select all
Define sev(mat)=
Func
Local ligne0,ligne1,ligne2,var,vec,vec0,vec1,vec2,i,j,k,l,n,p,v,w,x,x0,z
ligne0:=1
ligne1:=2
ligne2:=3
z:=mat
x:=nul(z)
if x=0 then
goto ligne0
endif
p:=coldim(z)
if p=1 then
goto ligne0
endif
i:=1
j:=1 
while i [latex]\leq[/latex] p
vec1:=(z^T[ i ])^T
vec2:=(z^T[ j ])^T
if i=j then
x:=nul(vec1)
if x=0 then
z:=supp(0,i,z)
p:=coldim(z)
i:=1
j:=1
goto ligne1
endif
endif
if i [latex]\neq[/latex] j then
x:=colineaire(vec1,vec2)
if x=0 then z:=supp(0,j,z)
p:=coldim(z)
i:=1
j:=1
goto ligne1
endif
endif
var:=j
if var=p then
i:=i+1
j:=i
else
j:=j+1
endif
lbl ligne1
endwhile
p:=coldim(z)
n:=rowdim(z)
if p [latex]\leq[/latex]   2 then
goto ligne0
endif
k:=2
vec1:=(z^T[ 1 ])^T
w:=vec1
vec2:=(z^T[ 2 ])^T
vec0:=compose(vec1,vec2)
x0:=nul(vec0)
if x0=1 then
vec:=unit(vec0)
else
vec:=vec0
endif
w:=augment(w,vec)
goto ligne2
lbl ligne2
l:=k+1
for i,1,k
j:=i-1
if i=1 then
vec:=(z^T[ l ])^T
v:=vec
else
vec1:=(w^T[ j ])^T
vec2:=(v^T[ j ])^T
vec0:=compose(vec1,vec2)
x0:=nul(vec0)
if x0=1 then
vec:=unit(vec0)
else
vec:=vec0
endif
v:=augment(v,vec)
endif
endfor
vec1:=(w^T[ k ])^T
vec2:=(v^T[ k ])^T
vec0:=compose(vec1,vec2)
x0:=nul(vec0)
if x0=1 then
vec:=unit(vec0)
else
vec:=vec0
endif
x:=nul(vec)
if x=0 and p=l then
z:=supp(0,l,z)
goto ligne0
endif
var:=p
if x=0 and var > l then
z:=supp(0,l,z)
p:=coldim(z)
goto ligne2
endif
if x=1 and p=l then
goto ligne0
endif
if x=1 and p>l then
w:=augment(w,vec)
k:=k+1
goto ligne2
endif
lbl ligne0
return z
endfunc


---------------------------------

Code: Select all
Define supp(i,j,x)=
Func
Local z,n,p,k,l,ligne
n:=rowdim(x)
p:=coldim(x)
z:={ }
for k,1,n
if k=i
cycle
ligne:={ }
for l,1,p
if l [latex]\neq[/latex] j
ligne:=augment(ligne,{ x[ k,l ] } )
endfor
z:= when ( z={ }, { ligne } , colaugment( z , { ligne } ) )
endfor
return z
endfunc


-------------------------------------------

Code: Select all
Define nul(x)=
Func
Local eps,y,z,z0,rez,imz
eps:=[latex]10^{-10}[/latex]
y:=x^T.x
z0:=trace(y)
rez:=abs(real(z0))
imz:=abs(imag(z0))
if rez [latex]\leq[/latex] eps and imz [latex]\leq[/latex] eps then
z:=0
else
z:=1
endif
return z
endfunc


-----------------------------------------

Code: Select all
Define colineaire(v,w)=
Func
Local vv,ww,vw,wv,var,eps,x,rez,imz,
eps:=[latex]10^{-10}[/latex]
var:=v^T.v
vv:=var[ 1,1 ]
var:=wT.w
ww:=var[ 1,1 ]
var:=v^T.w
vw:=var[ 1,1 ]
var:=w^T.v
wv:=var[ 1,1 ]
var:=vw.wv.-vv.ww
rez:=abs(real(var))
imz:=abs(imag(var))
if rez [latex]\leq[/latex] eps and imz [latex]\leq[/latex] eps then
x:=0
else
x=1
endif
return x
endfunc


----------------------------------

Code: Select all
Define norme(vec)=
Func
Local nor,var
nor:=vec^T.vec
var:=nor[ 1,1 ]
nor:= [latex]\sqrt {var}[/latex]
return nor
endfunc


--------------------------------

Code: Select all
Define unit(x)=
Func
Local var,z
var:=norme(x)
z:=[latex]\frac {1}{var}[/latex].x
return z
endfunc


______________________

Code: Select all
Define compose(x,y)=
Func
Local z,var1,var2
var1:=x^T.x
var2:=x^T.y
z:=var1[ 1,1 ].y-var2[ 1,1 ].x
return z
endfunc

Re: FSG

Unread postPosted: 25 Jan 2016, 17:49
by Bisam
Bravo !
Néanmoins, en utilisant les fonctions de la bibliothèque "linalg" (en fait, uniquement la fonction "rank"... qui elle-même peut se recréer en une dizaine de lignes avec la fonction "rref"), cela peut se faire en moins de 10 lignes...
Je n'écris pas tout faute de temps, mais voici l'algorithme :
Code: Select all
On initialise N à une matrice vide
Tant qu'il y a des colonnes dans la matrice M:
  On prend la colonne suivante C dans M
  On teste si en ajoutant la colonne C à N, cela change son rang
  Si cela change son rang, on ajoute C à N
Fin Tant que
Renvoyer N

Re: FSG

Unread postPosted: 25 Jan 2016, 18:16
by alphaméthyste
lollll merci Bisam

je suis mort de rire !

à la limite pourquoi je me decarcasse :D

Re: FSG

Unread postPosted: 25 Jan 2016, 19:05
by Bisam
Ceci étant dit, tes programmes sont bien faits et les algorithmes bien pensés. Mais la plupart du temps tu utilises bien plus de variables que nécessaire.
Par exemple, ta fonction "norme" peut se réécrire en 1 ligne :
Code: Select all
√((vec^T.vec)[1,1])→norme(vec)
.

Il y a juste 2 ou 3 choses que je ne m'explique pas :
- pourquoi les fonctions "nul" et "colineaire" renvoient 0 ou 1 au lieu de renvoyer plus simplement "True" ou "False" ?
- pourquoi avoir créé les fonctions "unit" et "norme" alors qu'il existe des fonctions "unitV" et "norm" qui font la même chose ?
- pourquoi ne pas réutiliser la fonction "norme" dans le fonctions "unit" et "nul" ?

La fonction "nul" pourrait par exemple se réécrire :
Code: Select all
norm(vec)<10^(-10)→nul(vec)

Re: FSG

Unread postPosted: 26 Jan 2016, 05:58
by alphaméthyste
encore merci Bisam

...(je ne sais pas trop quoi te répondre aux questions que tu m'a posé ...j'ai un peu pas mal plus une mentalitée de shadock* que de Gibi)

bon sinon à part ça la prochaine fois** j'écrirai le code comme il faut

à présent je sais comment on fait pour afficher les symboles suivants ->

Code: Select all
≠  ≤  ≥  ►
(il m'aura fallu du temps pour piger le truc lolll )

*pour citer le wiki : "Les Shadoks ont pour opposés les Gibis, personnages intellectuellement supérieurs, qui par pitié, aident les Shadoks qui ne représentent pour eux aucune menace réelle.
Les Shadoks sont excessivement méchants et idiots. Ils construisent des machines improbables qui ne fonctionnent pas, le plus souvent sous l'impulsion du Professeur Shadoko.
Les Gibis, contrairement aux Shadoks, sont très gentils et intelligents. Ils sont les inventeurs de nombre de machines utilisant les dernières technologies, quand les Shadoks se contentent de « rassembler des trucs et des machins » "

**je posterai un truc sympa sur algebre de Boole dans
$mathjax$\mathbb {Z}$mathjax$
puis dans
$mathjax$\mathbb {R}$mathjax$


avec un truc lisible écrit en code

Re: FSG

Unread postPosted: 26 Jan 2016, 12:35
by Bisam
Si tu es Shadok, je comprends mieux, effectivement :p

Re: FSG

Unread postPosted: 27 Jan 2016, 11:38
by Bisam
Aujourd'hui, j'ai un peu plus de temps. Je peux donc t'écrire le programme entier que j'avais suggéré plus haut.
Code: Select all
Define sev(mat)=
Func
Local n, p, rep, r, i, c, tmp, newr
n := rowdim(mat)
p := coldim(mat)
rep := newmat(n, 1)
r := 0
For i, 1, p
  c := submat(mat, 1, i, n, i)
  tmp := augment(rep, c)
  newr := linalg\rank(tmp)
  If newr > r Then
    rep := tmp
    r := newr
  EndIf
EndFor
If coldim(rep) > 1
  rep := submat(rep, 1, 2)
Return rep
EndFunc


PS : Au fait, alphaméthyste (sur TIPlanet) = fluorhydrique (sur les-mathematiques.net) ?
PPS : Avec cette méthode, le calcul de l'exemple donné dans le 1er post prend moins d'une seconde...

Re: FSG

Unread postPosted: 28 Jan 2016, 20:00
by alphaméthyste
Merci Bisam

eh oui 20 lignes avec la fonction rank ...

PS : ainsi donc tu m'a reconnu ...mais bon je ne suis pas l'acide fluorhydrique, j'ai pris ce pseudo parce que j'adore cet acide, je le trouve fascinant mais je ne suis pas lui