VSEPR : REPRÉSENTATION DE MOLÉCULES SIMPLES AVEC MAPLE 6.

Tableau des données (le nom en deuxième, le nom des variables a de l'importance)
rC : rayon covalent (c'est-à-dire la moitié de la longueur d'une liaison de covalence entre deux atomes identiques)
rV : rayon de Van der Waals (c'est-à-dire la moitié de la distance minimale d'approche entre deux atomes identiques appartenant à deux molécules différentes)
Les atomes sont modélisés par des boules de rayon rV. La distance entre atomes (1) et (2) est rC(1)+rC(2).

C'est un modèle grossier mais suffisant pour modéliser une molécule.

(valeurs de rC et rV en nm choisies provenant de http://www.webelements.com/)
restart:
with(plots):
with(plottools):
d:=[[couleur,nom,rC,rV],[[0.75,0.75,0.75],"H",0.037,0.120],[[0.2,0.2,0.2],"C",0.077,0.170],[[0,0.1,1],"N",0.075,0.155],[[1,0,0],"O",0.073,0.152],[[0,1,1],"F",0.071,0.147],[[0,.5,0],"Cl",0.099,0.175],[[.3,0,.5],"P",0.106,0.180],[[.8,.8,0],"S",0.102,0.180],[[0.6,0.3,0.3],"Br",0.114,0.185],[[0.75,0,0.75],"I",0.133,0.198],[[0.5,0.5,0.5],"Xe",0.130,0.216],[[0.85,0.35,0.35],"A",0.1,0.18],[[0.75,0.75,0.25],"X",0.065,0.13],[[1,1,1],"E",0,0]]:

Mise en mémoire des données.
Ne pas exécuter deux fois cette ligne !
for i from 2 to nops(d) do
for j from 1 to nops(d[1]) do
assign(d[1,j](d[i,2])=d[i,j])
od
od:

Permet de transformer une formule chimique en liste d'atomes ex : CH4 -> ["C","H","H","H","H"]
majuscules:=convert("ABCDEFGHIJKLMNOPQRSTUVWXYZ",list):
nombres:=convert("0123456",list):
coupechaine:=proc(a)
local b,c,d,i,j;
b:=[];
c:=convert(a,string);
for i from 1 to length(c) do
if member(c[i],majuscules) then
b:=[op(b),c[i]]
else
if member(c[i],nombres,'d') then
if d-1>=1 then
for j from 1 to d-2 do
b:=[op(b),b[nops(b)]]
od
else
b:=[op(1..nops(b)-1,b)]
fi
else
b[nops(b)]:=cat(b[nops(b)],c[i])
fi
fi
od;
b

> end:
les molécules les plus courantes sont ici définies à partir de leur notation habituelle.
H2O:=OH2E2:
NH3:=NH3E:
H2S:=SH2E2:
PH3:=PH3E:
HCN:=CNH:
SO2:=SO2E:
O3:=O3E:
`NO3-`:=NO3:
`NO2-`:=NO2E:
`CO32-`:=CO3:
`SO42-`:=SO4:
`S2O32-`:=S2O3:
`OH-`:=OHE3:
`H3O+`:=OH3:
`NH4+`:=NH4:
`I3-`:=I3E3:
#...compléter si besoin

localisation des plus proches voisins (VSEPR)

pour 2 : l et m de part et d'autre (linéairement)
l := r->[r,0,0]:
m:= r->[-r,0,0]:
pour 3 : n1, n2, n3 dans un plan (voisins répartis avec des angles de 120°)

n1:= r->[0,r,0]:
n2:= r->[0,-r/2,sqrt(3)/2*r]:
n3:= r->[0,-r/2,-sqrt(3)/2*r]:
pour 4 : i, j, k, l forment un tétraèdre régulier
k:=r->[-1/3*r,sqrt(8/9)*r,0]:
j:=r->[-1/3*r,-sqrt(2/9)*r,sqrt(2/3)*r]:
i:=r->[-1/3*r,-sqrt(2/9)*r,-sqrt(2/3)*r]:
pour 5 : l, m, n1, n2, n3 forment une bipyramide à base triangulaire.
pour 6 : l, m, n1, o1, p1, q1 forment un octaèdre régulier.
o1:= r->[0,0,r]:
p1:= r->[0,-r,0]:
q1:= r->[0,0,-r]:
liste des voisins à choisir en fonction de leur nombre
liste:=[[],[l],[l,m],[n1,n2,n3],[l,k,j,i],[l,m,n1,n2,n3],[l,m,n1,p1,o1,q1]]:

représentation compacte d'une molécule.
molec:= proc(a)
local b,li,y;
b:= coupechaine(a);
li:=liste[nops(b)];
ensemble des atomes périphériques d'abord
y:=
{seq(
sphere(
li[i0](rC(nom(b[1]))+rC(nom(b[i0+1]))),
rV(nom(b[i0+1])),
color=couleur(nom(b[i0+1]))
),
i0=1..nops(b)-1)
};
display({sphere([0,0,0],rV(nom(b[1])),color=couleur(nom(b[1])))}union y,scaling=constrained, title= cat("Ribière (PTSI Limoges) : ", convert(a,string)),style=PATCHNOGRID,light=[90,-90,1,1,1],ambientlight=[1/2,1/2,1/2],orientation=[45,-70])
end:

représentation éclatée
eclat:= proc(a)
local b,li,y,z;
b:= coupechaine(a);
li:=liste[nops(b)];
y:=
{seq(
sphere(
li[i0](rC(nom(b[1]))+rC(nom(b[i0+1]))),
rV(nom(b[i0+1]))/5,
color=couleur(nom(b[i0+1]))
),
i0=1..nops(b)-1)
};
les doublets non liants ne sont pas visualisés.
z:={seq(
line(
[0,0,0],
li[i0](rC(nom(b[1]))+rC(nom(b[i0+1])))*signum(rC(nom(b[i0+1]))),
thickness=10,
color=grey
),
i0=1..nops(b)-1)
};
si l'on veut visualiser les doublets non liants, remplacer la formule précédente par la suivante (sans #)
# z:={seq(
# line(
# [0,0,0],
# li[i0]((rC(nom(b[1]))+rC(nom(b[i0+1])))),
# thickness=10,
# color=grey
# ),
# i0=1..nops(b)-1)
# };
display({sphere([0,0,0],rV(nom(b[1]))/5,color=couleur(nom(b[1])))}union y union z,scaling=constrained, title= cat("Ribière (PTSI Limoges) : ", convert(a,string)),style=PATCHNOGRID,light=[90,-90,1,1,1],ambientlight=[1/2,1/2,1/2],orientation=[45,-70])
end:

Exemple d'utilisations du programme.
Modèle compact.
molec(CH4);

> molec(`NO3-`);

> molec(AX6);

> molec(CH2O);
Modèle éclaté.

> eclat(SO2);

> eclat(PH3);

> eclat(H2O);