Calcul d'une distance sur une grille (langage R)

Tout ce qui concerne notamment les outils de calcul numérique, de calcul formel ou de géométrie.
[participation réservée aux membres inscrits]
Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
misslolotte

Calcul d'une distance sur une grille (langage R)

Message non lu par misslolotte »

Bonjour,
cela fait 4 mois que j'apprends à me servir du langage R et j'ai un projet a présenter pour mes exams. je doit créer un fonction qui calcule des ditances entre des points.


Soit une grille G de Z*Z de taille (2,2) (puis (3,3)…).
Chaque point de la grille est déterminé par ses coordonnées entières X,Y, et prend une valeur binaire +1 ou –1 (notée x).
La grille est représentée par une matrice taille (2,2) (puis (3,3)…), dont les coefficients ont pour valeur +1 ou –1.
On définit sur cette grille une distance entre deux points A et B de coordonnées respectives (x1, y1) et (x2,y2) par : d(A,B) = abs(x1-x2) + abs(y1 – y2)
La matrice des distances pour une grille G de taille (n,n) (ayant donc n2 points) est une matrice D de taille (n2, n2) dont l’élément de position i,j correspond à la distance entre les deux points
numérotés i et j.
On souhaite :
1. Calculer cette matrice de distances
2. Calculer pour une grille donnée (choisie au hasard) la fonction U(G) qui est la somme des valeurs xixj pour tous les couples de points (i,j) vérifiant d(A,B)=1
Réaliser les deux étapes précédentes pour des grilles choisies au hasard et de différentes
tailles (n=2,3,4,5…)

Pour la premiere question j'ai réussi a créer une fonction qui calcule la distance entre deux points:

Code : Tout sélectionner

d=function(a,b){ 
a=c(x1,y1) 
b=c(x2,y2) 
di=abs(x1-x2)+abs(y1-y2); 
print(di) 
} 
x1=0 
y1=3 
x2=0 
y2=1 

> d(a,b) 
[1] 2 
Maintenant, si j'ai une matrice (2,2) j'ai donc 4 points :
a=0,0
b=1,0
c=1,1
d=0,1
J'assaie de crée une fonction qui calcule la distance entre n'importe quel points, c'est a dire, si j'ecrit : d(c,b) la fonction calcule la distance entre le point c et le point b et affiche donc 1.
J'ai pensé qu'il fallait créer une boucle, mais je n'y arrive pas :

Code : Tout sélectionner

d=function(a,b){ 
a=c(x1,y1) 
b=c(x2,y2) 
c=c(x3,y3) 
d=c(x4,y4) 
di=abs(x[i]-x[j])+abs(y[i]-y[j]); 
for(i in 1:4) 
for(j in 1:4) 
print(di); 
} 
x1=0 
y1=0 
x2=1 
y2=0 
x3=1 
y3=1 
x4=1 
y4=0 
Si quelqu'un peut m'aider pour répondre à la premiere question... merci.

[edit guiguiche : balises 'code' pour améliorer la lisibilité]
Arnaud
Modérateur honoraire
Modérateur honoraire
Messages : 7095
Inscription : lundi 28 août 2006, 13:18
Localisation : Allemagne

Message non lu par Arnaud »

Je ne connais pas du tout le langage R, même jamais entendu parlé.
Tu compiles avec quoi ?
Arnaud
Un peu d'info - Pyromaths - Pas d'aide en MP (non plus)
misslolotte

Message non lu par misslolotte »

Le langage R est un logiciel de programmation utilisé pour l'analyse statistique.
Ca ressemble un peu au langage C, mais simplifié, moins rigoureux.
On a pas besoin de la compiler (il me semble) ; en tout cas lorsque je m'en sers je n'ai rien de particulier a faire. Voila, a bientot.
gigiair
Utilisateur chevronné
Utilisateur chevronné
Messages : 2676
Inscription : samedi 08 juillet 2006, 20:56
Localisation : Saint Bonnet Elvert

Message non lu par gigiair »

Arnaud a écrit :Je ne connais pas du tout le langage R, même jamais entendu parlé.
Tu compiles avec quoi ?
R est un must pour tous les traitements statistiques. C'est un produit phare du logiciel libre. Ça fonctionne sur toutes les plates-formes.
tout est centralisé sur CRAN http://cran.r-project.org/

Je pense qu'en cherchant un peu, il y a de la doc en français.
La présentation de R est là http://www.r-project.org/

Il y a un tutoriel qui permet de démarrer rapidement.
JJR.
LaTeXien migrateur.
misslolotte

Message non lu par misslolotte »

Bonjour, personne ne peut m'aider a créer ma fonction alors, ou me dire ou sont mes erreurs?...
Arnaud
Modérateur honoraire
Modérateur honoraire
Messages : 7095
Inscription : lundi 28 août 2006, 13:18
Localisation : Allemagne

Message non lu par Arnaud »

Je ne connais pas la syntaxe de ce langage, mais par habitude d'autres langages, j'ai envie de dire que ton "di" devrait être dans la boucle, et non pas juste avant.

Comme dit, indication sans garantie.
Arnaud
Un peu d'info - Pyromaths - Pas d'aide en MP (non plus)
misslolotte

Message non lu par misslolotte »

OK,merci pour votre aide, je vais essayer.
sissoko

Message non lu par sissoko »

Bonjour,

Ayant fait une thèse sur le logiciel R, je peux te prodiguer ces conseils :
- Prends tes jambes à ton cou
- Vas dans un cyber café afin de te munir du logiciel R-commander 4.6.20.3265.22 beta 4 (configuration recommandée : windows 94 or higher, pentium 1,5 à 433mhz, 38mo de ram, connexion 43k, directx 4.2, clavier azerty)
- Sors du cyber café afin de rejoindre ton domcile
- Retourne au cyber café
- tape cette commande:
.x <- seq(10.128, 29.872, length=100)
plot(.x, dnorm(.x, mean=20, sd=3), xlab="x", ylab="Density", main=expression(paste("Normal Distribution: ", mu, " = 20, ", sigma, " = 3")), type="l")
abline(h=0, col="gray")
remove(.x)
NormalSamples <- as.data.frame(matrix(rnorm(1000*100, mean=20, sd=3), ncol=100))
rownames(NormalSamples) <- paste("sample", 1:1000, sep="")
colnames(NormalSamples) <- paste("obs", 1:100, sep="")
NormalSamples$mean <- rowMeans(NormalSamples[,1:100])
-Je ne veux pas te macher le travail, j'attend de toi que tu m'explique ce programme ligne par ligne afin que je te donne d'autres conseils dans un avenir proche.

Cordialement.
Sissoko.
misslolotte

Message non lu par misslolotte »

Bonjour,
alors j'ai de la chance, je vais pouvoir sauter quelques étapes car j'ai deja le logiciel R-commander 4.6.20.3265.22 beta 4 (configuration recommandée : windows 94 or higher, pentium 1,5 à 433mhz, 38mo de ram, connexion 43k, directx 4.2, clavier azerty).
Par contre je ne comprends pas pourquoi je dois analyser ce programme...
Y'a t-il un rapport avec ma fonction de distance?
En attendant votre réponse je vais quand meme regarder ce programme.
A bientot!
sissoko

Message non lu par sissoko »

Me revoici jeune apprentie, je sais que tu attends mes précieux conseils.

Tu ne fais pas de statistiques ? la 1ere partie est une fonction génératrice qui permet de calculer la métrique d'un point a un autre suivant un couple de loi gamma de fisher et géométrique

Concernant la 2eme partie, il s'agit d'une fonction exponentielle logarithmique qui permet de tracer la droite représentant la distance de façon spontanée grâce au théorème 5.23 émis par Pythagore

Enfin la 3eme partie qui à mes yeux est la plus importante concerne la tracé concave suivant une loi du baron de munchesen.

Aussi, je reviens tout juste de lituanie ou j'ai pu participer à une conférence animée par des personnes averties qui tout comme nous utilisaient R-commander.
Ceci dit la-bas j'ai pu apprendre qu'il existe d'autres logiciels plus compétents dans le domaine de l'etude de la statistique.
Ce dernier s'intitulant Java R-C++, 1.4 beta 6 étant la version la plus fiable sur laquelle il te suffira de taper ton énoncé pour avoir automatiquement la solution.

En outre, je pense que tous le mérite me revient mais étant d'une nature généreuse je te permet de profiter de mes lumières et de la gloire qu'elles t'apporteront.

Cordialement.

Sissoko.
misslolotte

Message non lu par misslolotte »

Bonjour,
j'ai essayé de faire ce que vous m'avez demandé:

x est vecteur compris entre entre 10.128 et 29.872 et de longueur 100.

Code : Tout sélectionner

plot(.x, dnorm(.x, mean=20, sd=3), xlab="x", ylab="Density", main=expression(paste("Normal Distribution: ", mu, " = 20, ", sigma, " = 3")), type="l")
trace la courbe qui a pour abscisse les valeurs du vecteur x, pour ordonnée la fonction de densité du vecteur x suivant une loi normale avec une moyenne de 20 et un ecart type de 3.

Le titre du graphe est donné par :

Code : Tout sélectionner

main=expression(paste("Normal Distribution: ", mu, " = 20, ", sigma, " = 3"))

Code : Tout sélectionner

abline(h=0, col="gray") 
trace une droite horizontale pour Y=0 de couleur gris

Code : Tout sélectionner

NormalSamples <- as.data.frame(matrix(rnorm(1000*100, mean=20, sd=3), ncol=100))
création d'un data frame. Ce data frame est une matrice de taille 1000*100 et suit une loi normale de moyenne 20 et d'ecart-type 3. le nombre de colonne est 100.

Code : Tout sélectionner

rownames(NormalSamples) <- paste("sample", 1:1000, sep="")
donne le nom des lignes de la matrice. Dans ce cas le nom des lignes est sample et va de 1 à 1000

Code : Tout sélectionner

colnames(NormalSamples) <- paste("obs", 1:100, sep="")
donne le nom des colonnes qui est obs et vat de 1 à 100.

La dernière ligne : je ne sais pas et de toute manière, il y a une erreur de syntaxe.

Code : Tout sélectionner

Erreur : erreur de syntaxe dans "NormalSamples[tex]mean")
Je voulais vous dire aussi que la matrice ne s'est pas affichée, donc je ne suis vraiment pas sur de mes explications. De plus je ne maîtrise pas bien le vocabulaire, donc j'ai fait comme j'ai pu.