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 :

Introduire un retard dans une fonction: f(t - tau)


Sujet :

R

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Introduire un retard dans une fonction: f(t - tau)
    Bonsoir à tous,

    Quelqu'un aurait-il une idée de comment demander à R " f(t - tau) " sachant qu'il connaît f?
    (Dans mon cas c'est pour appeler f(t- tau) dans un système d'équations différentielles couplées df/dt= , dg/dt= , dh/dt= )

    Merci d'avance! :)

  2. #2
    Membre éprouvé

    Homme Profil pro
    Cyber Security & AI
    Inscrit en
    Février 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Cyber Security & AI

    Informations forums :
    Inscription : Février 2009
    Messages : 506
    Points : 1 189
    Points
    1 189
    Billets dans le blog
    2
    Par défaut
    Bonsoir Marion,

    Tu sembles avoir des difficultés à trouver de l'aide sur le forum.

    Si tu arrives à résoudre f, t-tau est juste une translation de la fonction par rapport à l'origine.

    De plus d(t - tau)/dt = 1 alors d(f°g)/dt = f'°g*g' avec g' = 1 et g = t - tau donc df(t-tau)/dt = df/dt

    Cordialement.

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Merci beaucoup pour ta réponse, dev_ggy!
    Malheureusement le problème est un peu plus compliqué que cela... mes équations sont en fait:

    df/dt=b*(f-g)(t) + A(t)
    dg/dt= b*(f-g)(t-tau1) - c*(g-h)(t)
    dh/dt= c*(g-h)(t-tau2) - D(t)

    où A(t), D(t), b, et c sont des paramètres connus. Le changement de variable est donc plus compliqué à mettre en place, et c'est pourquoi l'existence d'une fonction permettant un delay me semblait être la plus facile.
    Il y a peut-être une façon relativement simple de le faire qui m'a échappée

  4. #4
    Membre éprouvé

    Homme Profil pro
    Cyber Security & AI
    Inscrit en
    Février 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Cyber Security & AI

    Informations forums :
    Inscription : Février 2009
    Messages : 506
    Points : 1 189
    Points
    1 189
    Billets dans le blog
    2
    Par défaut
    Bonjour Marion,

    Quel package de R utilises-tu et par quelle méthode (élément fini, analyse spectrale ... )?

    Cordialement

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    J'utilise pour l'instant le package PBSddesolve. Je débute tout juste et il m'a semblé d'après ce que j'ai pu lire que c'était le seul package capable de résoudre un système d'équations différentielles avec retard.

    Voici le code que j'ai pour l'instant, mais qui bien sur ne fonctionne pas comme je le voudrais (la fonction lag n'est sans doute pas appropriée..), ce sera surement plus simple comme cela :)
    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
     
    require(PBSddesolve)
    local(env=.PBSddeEnv, expr={
    parms<-c(f1=1, f2=0.5, taui=5, tauj=10, v0=2, mu0=0.5)
     
    myGrad<- function(t, y, parms){
    	with(as.list(c(parms)),{
     
    	if(t<taui)
    	  lag1<-0
    	else
    	  lag1<-pastvalue(t-taui)
     
    	if(t<tauj)
    	   lag2<-0
    	else
    	   lag2<-pastvalue(t-tauj)
     
       y1 <- v0 - f1*(y[1]-y[2])
       y2 <- f1*(lag1[1]- lag1[2])- f2*(y[2]-y[3])
       y3 <- f2*(lag2[2]-lag2[3]) - mu0
     
    return(c(y1, y2, y3))
    })
    }
     
    yinit<-c(0.3,1,2)
     
    yout<-dde(yinit,times=seq(0, 150, by=0.02), func=myGrad, parms=parms)
    plot(yout$time, yout$y1, type="l", col="red", xlab="t", ylab="stocks y",ylim=c(min(yout$y1, yout$y2, yout$y3), max(yout$y1, yout$y2, yout$y3)))
    lines(yout$time, yout$y2, type="l", col="blue")
    lines(yout$time, yout$y3, type="l", col="green")
    legend("topleft", legend=c("y1", "y2", "y3"), lwd=2, lty=1, xjust=1, yjust=1, col=c("red", "blue", "green"))
    })
    Merci encore!

  6. #6
    Membre éprouvé

    Homme Profil pro
    Cyber Security & AI
    Inscrit en
    Février 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Cyber Security & AI

    Informations forums :
    Inscription : Février 2009
    Messages : 506
    Points : 1 189
    Points
    1 189
    Billets dans le blog
    2
    Par défaut
    Tu as des erreurs de programmation dans ton code, entre autre tu as des problèmes de parenthèse à plusieurs endroits.

    Voilà ce que je te propose, mais je ne suis pas sûr que cela convienne parfaitement. À toi d'améliorer les idées que je développe ci-dessous.

    Code R : 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
    require(PBSddesolve)
     
    parms<-c(f1=1, f2=0.5, taui=5, tauj=10, v0=2, mu0=0.5)
     
    myGrad<- function(t, y, parms){
          parms <- as.list(parms)
          if(t<parms$taui)
            lag1<-0
          else
            lag1<-pastvalue(t-parms$taui)
     
          if(t<parms$tauj)
            lag2<-0
          else
            lag2<-pastvalue(t-parms$tauj)
     
          y1 <- parms$v0 - parms$f1*(y[1]-y[2])
          y2 <- parms$f1*(lag1- lag1)- parms$f2*(y[2]-y[3])
          y3 <- parms$f2*(lag2-lag2) - parms$mu0
     
          return(c(y1, y2, y3))
      }
    yinit<-c(0.3,1,2)
     
    yout<-dde(yinit,times=seq(0, 150, by=0.02), func=myGrad, parms=parms)
    plot(yout$time, yout$y1, type="l", col="red", xlab="t", ylab="stocks y",ylim=c(min(yout$y1, yout$y2, yout$y3), max(yout$y1, yout$y2, yout$y3)))
    lines(yout$time, yout$y2, type="l", col="blue")
    lines(yout$time, yout$y3, type="l", col="green")
    legend("topleft", legend=c("y1", "y2", "y3"), lwd=2, lty=1, xjust=1, yjust=1, col=c("red", "blue", "green"))

    Au plaisir de te lire.

  7. #7
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup pour cette proposition! Mais lorsque dans les expressions tu écris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          y2 <- parms$f1*(lag1- lag1)- parms$f2*(y[2]-y[3])
          y3 <- parms$f2*(lag2-lag2) - parms$mu0
    ne considère-t-il pas simplement que le premier terme fait zéro? Comment lui fais tu comprendre à quelle fonction cela s'applique?
    Il se passe aussi une chose étrange lorsque je l'essaie sur un cas simple comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          y1 <- t
          y2 <- parms$f1*(lag1) - parms$f2*(y[2]-y[3])
          y3 <- 2
    Alors que y1 et y2 ne sont pas concernées par le delay, elles présentent une discontinuité de leur dérivée en taui (angle à t=taui sur le graphe)... quelque chose doit m'échapper sur le fonctionnment de lag..

    De plus, j'ai l'impression que lag1[1] revoie toujours à la fonction concernée par la dérivée dans l'expression (ainsi si je mets y2 <- parms$f1*(lag1[1]- lag1[2]), lag1[1] sera en réalité y2(t-taui) et lag1[2] je ne sais pas..)

    Vraiment désolée pour toutes ces questions, et merci encore pour ton aide!!

Discussions similaires

  1. Recuperation de formulaire dans une fonction
    Par arsgunner dans le forum ASP
    Réponses: 5
    Dernier message: 23/06/2004, 15h04
  2. Transmission d'un objet crée dans une fonction
    Par EvilAngel dans le forum ASP
    Réponses: 2
    Dernier message: 10/05/2004, 20h19
  3. Utilisez MinimizeName() dans une fonction
    Par James_ dans le forum C++Builder
    Réponses: 7
    Dernier message: 07/05/2004, 18h05
  4. [Postgresql]Connecter à une autre base dans une fonction
    Par alex2205 dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/05/2003, 11h30
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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