IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Création de matrice et fonction optimize()


Sujet :

R

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Mécanique
    Inscrit en
    Janvier 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2021
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Création de matrice et fonction optimize()
    Bonjour à tous,

    Je suis nouveau sur le forum et débutant en R !
    J'ai réalisé un petit programme de calcul qui fonctionne mais dont je pense qu'il serait possible d'optimiser la rapidité.

    Le principe est de générer "n" valeurs, selon la loi normale, pour une série de données qui correspondent à des dimensions sur des pièces "mécaniques".
    Le programme calcule ensuite un jeu de fonctionnement pour ces pièces "générées" afin d'obtenir une représentation "statistique" du jeu de fonctionnement que l'on aurait en combinant ces pièces.
    Ci-dessous, le code que j'ai écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #Déclaration des variables sous forme de vecteurs de longueur n, générées aléatoirement avec la loi normale
     
    n<-10000 #nombre de valeurs simulées
    CH2.GN<-c(rnorm(n, 6.0294, 0.005812))
    CH4.GX<-c(rnorm(n, 63.1148, 0.005316))
    CH4.x<-c(rnorm(n, -0.0068, 0.006393))
    CH4.y<-c(rnorm(n, 0.0133, 0.005964))
    P1.GN<-c(rnorm(n, 8.2032, 0.002065))
    P2.GG<-c(rnorm(n, 48.6313, 0.010953))
    P2.GN<-c(rnorm(n, 48.6536, 0.011224))
    P2.x<-c(rnorm(n, 0.0022, 0.004436))
    P2.y<-c(rnorm(n, 0.0199, 0.006347))
    P3.GG<-c(rnorm(n, 43.0018, 0.004604))
    P4.GG<-c(rnorm(n, 43.0479, 0.004694))
     
     
    # Fonction qui decrit l'excentration en fonction de l'angle d en radian
    A<-(CH2.GN + P1.GN)/2
    B<-(P2.GG + (P3.GG+P4.GG)/2 )/4
    fjeu=function(d){
      j<-sqrt(((A*cos(d)+sqrt(P2.x^2+P2.y^2)*cos(atan2(P2.y,P2.x)-asin(A*sin(d)/B)))-CH4.x)^2+((A*sin(d)+sqrt(P2.x^2+P2.y^2)*sin(atan2(P2.y,P2.x)-asin(A*sin(d)/B)))-CH4.y)^2)-A
      return(j)
    }
     
    #Recherche de l'angle qui maximise la fonction excentration
     
    # Création d'un vecteur a des angles de 0 à 360° (en radians)
    angles <- seq(0, 2*pi, by = (2*pi)/360)
     
    # Création d'une matrice avec 361 colonnes, n lignes, avec un angle par colonne
    matjeu <- t(matrix(rep(angles), nr=length(angles), nc=n))
     
    # Calcul de l'excentration pour chaque angle de la matrice matjeu
    exc_max<-apply(apply(matjeu, 2, fjeu), 1, max)
     
     
    # Calcul de Jeux
    JR3<-(CH4.GX-P1.GN-CH2.GN-P2.GN)/2
    JR3avExc = JR3-exc_max
     
    # Représentation graphique
     
    TI=0.01 # Tolérance inf
    hist(JR3avExc, col="lightblue",border="lightblue", xlim=c(0,0.15), main="Jeu JR3-EMP1", probability = TRUE, breaks=ceiling(sqrt(n)))
    #lines(density(JR3avExc), col="orange") courbe de densité de l'histogramme
    abline(v=TI,col="darkorange")
    xbj=mean(JR3avExc)
    sj=sd(JR3avExc)
    # Tracé loi Normale
    xloin=seq(from=xbj-3.5*sj , to=xbj+3.5*sj, length.out=100)
    yloin=dnorm(xloin, mean=xbj, sd=sj)
    lines(xloin, yloin, col="darkred", lty=3)
    Premier point :
    Dans le programme, j'ai créé une matrice nommée "matjeu". Cette matrice a la forme suivante :
    Nom : Matrice.jpg
Affichages : 288
Taille : 29,1 Ko
    Pour la créer, j'ai défini un vecteur de 0 à 360° (en radians dans le programme).
    J'ai créé une matrice en utilisant ce vecteur pour remplir les "n" colonnes de la matrice.
    J'ai transposé cette matrice pour obtenir la matrice souhaitée.
    Je me demandais s'il y avait un moyen plus simple pour créer cette matrice directement ? En effet, en fonction de la valeur de "n" (généralement 10000), l'opération de transposition peut prendre un certain temps.

    Deuxième point :
    Dans le programme, j’utilise une fonction « fjeu » que j’applique à la matrice pour calculer une excentration angulaire entre 0 et 360°, pour « n » valeurs simulées. Ensuite, pour chaque ligne simulée, je cherche la valeur d’excentration maximale et je la stocke dans un vecteur de "n" valeurs.
    Je me demandais s’il n’y avait pas une possibilité de trouver directement la valeur max de la fonction « fjeu », pour chaque ligne simulée, sans passer par le calcul aux 360 positions angulaires ? Via une fonction « optimize » par exemple ? J’ai essayé de la faire mais je n’ai pas réussi...

    J’espère avoir été assez clair dans mes questions et je vous remercie d’avance pour vos réponses !

  2. #2
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    703
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 703
    Points : 1 311
    Points
    1 311
    Par défaut Création de matrice
    Bonjour,

    Pour le premier point vous pouvez créer la matrice en lignes à l'aide de l'option byrow=TRUE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    n <- 5
    angles <- seq(0, 2*pi, by=(2*pi)/5)
    matjeu <- matrix(rep(angles), nrow=n, ncol=length(angles), byrow=TRUE)
    matjeu
    #>      [,1]     [,2]     [,3]     [,4]     [,5]     [,6]
    #> [1,]    0 1.256637 2.513274 3.769911 5.026548 6.283185
    #> [2,]    0 1.256637 2.513274 3.769911 5.026548 6.283185
    #> [3,]    0 1.256637 2.513274 3.769911 5.026548 6.283185
    #> [4,]    0 1.256637 2.513274 3.769911 5.026548 6.283185
    #> [5,]    0 1.256637 2.513274 3.769911 5.026548 6.283185
     
    # Created on 2021-01-18 by the reprex package (v0.3.0)
    Cordialement,

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Mécanique
    Inscrit en
    Janvier 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2021
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci pour votre réponse !

    Pour le second point, la fonction "optimize" fonctionne si on l'utilise sur une seule ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    fjeu=function(d){
      j<-sqrt(((A[1]*cos(d)+sqrt(P2.x[1]^2+P2.y[1]^2)*cos(atan2(P2.y[1],P2.x[1])-asin(A[1]*sin(d)/B[1])))-CH4.x[1])^2+((A[1]*sin(d)+sqrt(P2.x[1]^2+P2.y[1]^2)*sin(atan2(P2.y[1],P2.x[1])-asin(A[1]*sin(d)/B[1])))-CH4.y[1])^2)-A[1]
      return(j)
    }
     
    #Recherche de l'angle qui maximise la fonction excentration
    opt.exc = optimize(fjeu, interval=c(0, 2*pi), maximum=TRUE)
     
    #valeur d'excentration max pour la ligne [1]
    exc = opt.exc$maximum
    Je voulais essayer de faire une sorte de boucle pour l'utiliser sur les n lignes mais je n'y parviens pas.

    Je pensais à quelque chose de ce type là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #Recherche de l'angle qui maximise la fonction excentration
      opt.exc = c(
        for (i in 1:n) {
          optimize(fjeu[i], interval=c(0, 2*pi), maximum=TRUE)
        })

  4. #4
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    703
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 703
    Points : 1 311
    Points
    1 311
    Par défaut Optimisation
    Bonjour,

    Votre appel de la fonction optimize() n'utilise pas la matrice matjeu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    # Déclaration des variables sous forme de vecteurs de longueur n, générées aléatoirement avec la loi normale
    n<-10000 #nombre de valeurs simulées
    CH2.GN<-c(rnorm(n, 6.0294, 0.005812))
    CH4.GX<-c(rnorm(n, 63.1148, 0.005316))
    CH4.x<-c(rnorm(n, -0.0068, 0.006393))
    CH4.y<-c(rnorm(n, 0.0133, 0.005964))
    P1.GN<-c(rnorm(n, 8.2032, 0.002065))
    P2.GG<-c(rnorm(n, 48.6313, 0.010953))
    P2.GN<-c(rnorm(n, 48.6536, 0.011224))
    P2.x<-c(rnorm(n, 0.0022, 0.004436))
    P2.y<-c(rnorm(n, 0.0199, 0.006347))
    P3.GG<-c(rnorm(n, 43.0018, 0.004604))
    P4.GG<-c(rnorm(n, 43.0479, 0.004694))
     
    # Fonction qui décrit l'excentration en fonction de l'angle d en radian
    A<-(CH2.GN + P1.GN)/2
    B<-(P2.GG + (P3.GG+P4.GG)/2 )/4
    # Fonction du message 15/01/2021, 11h11
    # fjeu=function(d){
    #  j<-sqrt(((A*cos(d)+sqrt(P2.x^2+P2.y^2)*cos(atan2(P2.y,P2.x)-asin(A*sin(d)/B)))-CH4.x)^2+((A*sin(d)+sqrt(P2.x^2+P2.y^2)*sin(atan2(P2.y,P2.x)-asin(A*sin(d)/B)))-CH4.y)^2)-A
    #  return(j)
    # }
    # Fonction du message 19/01/2021, 11h30
    fjeu=function(d){
      j<-sqrt(((A[1]*cos(d)+sqrt(P2.x[1]^2+P2.y[1]^2)*cos(atan2(P2.y[1],P2.x[1])-asin(A[1]*sin(d)/B[1])))-CH4.x[1])^2+((A[1]*sin(d)+sqrt(P2.x[1]^2+P2.y[1]^2)*sin(atan2(P2.y[1],P2.x[1])-asin(A[1]*sin(d)/B[1])))-CH4.y[1])^2)-A[1]
      return(j)
    }
     
    # Recherche de l'angle qui maximise la fonction excentration
    opt.exc = optimize(fjeu, interval=c(0, 2*pi), maximum=TRUE)
     
    # Valeur d'excentration max pour la ligne [1]
    exc = opt.exc$maximum
    exc
    #> [1] 4.183414
     
    # Created on 2021-01-19 by the reprex package (v0.3.0.9001)
    Par ailleurs votre nouvelle fonction fjeu() produit un seul résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    # Déclaration des variables sous forme de vecteurs de longueur n, générées aléatoirement avec la loi normale
    n<-10000 #nombre de valeurs simulées
    CH2.GN<-c(rnorm(n, 6.0294, 0.005812))
    CH4.GX<-c(rnorm(n, 63.1148, 0.005316))
    CH4.x<-c(rnorm(n, -0.0068, 0.006393))
    CH4.y<-c(rnorm(n, 0.0133, 0.005964))
    P1.GN<-c(rnorm(n, 8.2032, 0.002065))
    P2.GG<-c(rnorm(n, 48.6313, 0.010953))
    P2.GN<-c(rnorm(n, 48.6536, 0.011224))
    P2.x<-c(rnorm(n, 0.0022, 0.004436))
    P2.y<-c(rnorm(n, 0.0199, 0.006347))
    P3.GG<-c(rnorm(n, 43.0018, 0.004604))
    P4.GG<-c(rnorm(n, 43.0479, 0.004694))
     
    # Fonction qui decrit l'excentration en fonction de l'angle d en radian
    A<-(CH2.GN + P1.GN)/2
    B<-(P2.GG + (P3.GG+P4.GG)/2 )/4
    # Fonction du message 15/01/2021, 11h11
    fjeu1=function(d){
     j<-sqrt(((A*cos(d)+sqrt(P2.x^2+P2.y^2)*cos(atan2(P2.y,P2.x)-asin(A*sin(d)/B)))-CH4.x)^2+((A*sin(d)+sqrt(P2.x^2+P2.y^2)*sin(atan2(P2.y,P2.x)-asin(A*sin(d)/B)))-CH4.y)^2)-A
     return(j)
    }
    # Fonction du message 19/01/2021, 11h30
    fjeu2=function(d){
     j<-sqrt(((A[1]*cos(d)+sqrt(P2.x[1]^2+P2.y[1]^2)*cos(atan2(P2.y[1],P2.x[1])-asin(A[1]*sin(d)/B[1])))-CH4.x[1])^2+((A[1]*sin(d)+sqrt(P2.x[1]^2+P2.y[1]^2)*sin(atan2(P2.y[1],P2.x[1])-asin(A[1]*sin(d)/B[1])))-CH4.y[1])^2)-A[1]
     return(j)
     }
     
    # Recherche de l'angle qui maximise la fonction excentration
     
    # Création d'un vecteur a des angles de 0 à 360° (en radians)
    angles <- seq(0, 2*pi, by = (2*pi)/360)
     
    # Création d'une matrice avec 361 colonnes, n lignes, avec un angle par colonne
    matjeu <- t(matrix(rep(angles), nr=length(angles), nc=n))
     
    # Calcul de l'excentration pour chaque angle de la matrice matjeu
    exc_max1<-apply(apply(matjeu, 2, fjeu1), 1, max)
    summary(exc_max1)
    #>     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
    #> 0.001042 0.010730 0.015544 0.016140 0.020936 0.049099
     
    exc_max2<-apply(apply(matjeu, 2, fjeu2), 1, max)
    summary(exc_max2)
    #>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    #> 0.03087 0.03087 0.03087 0.03087 0.03087 0.03087
     
    # Created on 2021-01-19 by the reprex package (v0.3.0.9001)
    Je vous conseille de tester votre programme pas à pas sur une matrice plus petite (par exemple n=5 et angles <- seq(0, 2*pi, by=(2*pi)/5)).

    Cordialement,

Discussions similaires

  1. Création d'une matrice en fonction d'une autre
    Par brf1982 dans le forum MATLAB
    Réponses: 1
    Dernier message: 03/11/2009, 08h39
  2. Création de matrice
    Par bg56 dans le forum MATLAB
    Réponses: 3
    Dernier message: 19/11/2007, 11h16
  3. [Débutant] Matrice de fonctions et minima
    Par blackdragon dans le forum MATLAB
    Réponses: 2
    Dernier message: 19/11/2007, 09h53
  4. Réponses: 2
    Dernier message: 13/03/2007, 15h35
  5. Création en C# de Fonctions Excell
    Par Smogling dans le forum C#
    Réponses: 1
    Dernier message: 09/01/2007, 14h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo