Inscription / Connexion Nouveau Sujet
Niveau logiciels
Partager :

scilab

Posté par
ecilamlac
04-07-10 à 13:51

Bonjour,

je suis un peu perdue dans scilab et ne sait guère comment m'y prendre. Existe t-il des tutoriels ?

Sinon voilà ma question:

J'ai une série :

1 3 8 4 12 5 7 9 2 10 6 11
je dois la répéter dans le même ordre pour arriver à deux minutes
je peux répéter plusieurs fois le même nombre dans la série
et je peux combiner les nombres qui se touchent dans un sens ou dans un autre.
(la longueur de la série est donc variable)
ex : ça peut faire : 1 1 3 1 3 8 4 8 3 8 4 8 3 1 3 8 3 3 1 1 3 1 3 1 3 8 4 12 5 5 7 9 7 5 12 5 12 4 12 5 7 5 5 7 9 2 9 etc etc en utilisant tous les nombres...

Je voudrais pouvoir générer avec ces contraintes de départ des séries de nombres de cette sorte. Est-ce possible avec scilab ?

Je vous remercie.

Posté par
Boltzmann_Solver
re : scilab 04-07-10 à 14:24

Bonsoir,

Il te faudra faire un bout de code, mais c'est pas infaisable.

Mais deux questions, les nombres de ta suite représentent des temps en seconde j'imagine ? Et si c'est la cas, la somme doit faire exactement 120 ou cela peut-il être dépassé ?

Posté par
ecilamlac
scilab 04-07-10 à 17:17

non, les nombres de la suite ne représentent pas des temps en seconde. Par contre, des fréquences leur sont associées. Elles peuvent être fixes. Je peux aussi jouer sur les multiples. Mais ça n'a pas d'importance pour la suite numérique.
Pour les données temporelles, il faudrait que je fasse de même une suite de valeurs que je pourrais ensuite attribuer aux "notes" mais de façon indépendante. La valeur de chaque note doit varier dans le temps et ne pas être la même à chaque présentation.
La somme peut donc être dépassée.
Les valeurs de temps peuvent aller d'une demi seconde à 4 seconde. La suite de départ peut être plus courte que 12 peu importe. Après je les attribue aux chiffres.
La ligne de code s'inscrit-elle dans la console silab après la flèche et de quelle manière ?

Posté par
Boltzmann_Solver
re : scilab 04-07-10 à 20:35

Je ne suis pas sur de comprendre ton problème à résoudre. Donc je te propose cet ersatz de code qui créer une liste d'élément suivant ta procédure en dehors du critère de temps que tu ne définis pas assez clairement.

Citation :

function A=gen_st()
  
A(1)= 1;
S = [1 3 8 4 12 5 7 9 2 10 6 11];
s_pos = 1;
x_pos = 1;
pr=0.30;
ps=0.60;

while s_pos<length(S),
  x_test = rand();
  if ~(x_test<pr & s_pos==1) then
    if x_test<pr then
      s_pos = s_pos-1;
    elseif x_test>=ps then
      s_pos = s_pos+1;
    end
      x_pos = x_pos+1;
      A(x_pos)=S(s_pos);
  end
end
endfunction


Si tu as des questions pour compléter le critère de temps, n'hésite pas.
BS

Posté par
ecilamlac
scilab 05-07-10 à 08:11

Bonjour et merci,

Je suis vraiment une béotienne ! Les lignes de codes que tu m'as données constitue l'environnement de travail c'est ça ?
Mais une fois copiées, je ne sais comment mettre en application...

Posté par
ecilamlac
scilab 05-07-10 à 09:51

merci pour ces lignes de code... quelqu'un vient m'aider chez moi ce soir pour les essayer, ça devrait être plus facile en direct...

Merci encore

Posté par
Boltzmann_Solver
re : scilab 05-07-10 à 10:57

Bonjour,

Après avoir chargé la fonction (à aprtir d'un fichier sce ou en copiant collant la fonction), il suffit de l'appeler en écrivant gen_st().

Posté par
Boltzmann_Solver
re : scilab 05-07-10 à 11:08

Si c'est que pour essayer ce premier jet, je ne pense pas que ça soit utile. Après, ça ne remplit pas toutes tes demandes car je n'ai pas le raccord entre la suite et le temps pour le faire. Donc, il pourra surement t'aider à compléter cette base^^. Sinon, comme tu la vois, cette procédure créer des séquence de longueurs aléatoires, donc, en faisant une étude probabiliste, tu peux ajuster la longueur moyenne avec les paramètres pr et ps. Mais je te conseille de rajouter une condition de taille max sur le while suivant tes besoins.

En tout cas, bonne chance (pour ton stage?).

Posté par
ecilamlac
scilab 05-07-10 à 21:43

bonsoir,

j'ai modifié un petit peu... cela peut-il fonctionner ainsi ?

function A=essai(n)
  A(1) = 1;
  S = [1 3 8 4 12 5 7 9 2 10 6 11];
  x = 1;
  
  while(t<12*n) //n nombre de fois pour répéter la suite
    r = rand();
    if(r < 0.33) then A(x)=S((x-1) modulo (length(S)) + 1);
      end
    elseif (r < 0.66) then A(x)=S(x modulo (length(S)) + 1);
      end
    else A(x)=S((x+1) modulo (length(S)) + 1);
    end
x=x+1 ;
t=t+1 ; // compteur temps
end
endfunction

avec n= au moins 6 je pense

Il y  a un deuxième calcul pour les durées : le même que celui là mais en changeant les nombres de la série ou  S = [0,5 1 1,5 2 2,5 3 3,5 4]; (peut-être faut il mettre des points à la place des virgules)
avec n= au moins 10

C'est après que j'attribue les durées aux nombres.

ouI, c'est pour un stage... de danse ! et je fais la "musique". c'est un peu compliqué à expliquer là le pourquoi. En pratique, je chante les nombres avec des hauteurs définies et les durées que j'ai appliquées et je fais ensuite un montage). ça c'est la deuxième partie. Dans la première partie, la série est énoncée telle qu'elle plusieurs fois sur un son de téléphone avec une voix qui parle. Les chiffres représentent des directions dans l'espace pour la danseuse. La présentation a lieu samedi mais je dois fournir les sons mercredi à la danseuse...

Merci.





Posté par
Boltzmann_Solver
re : scilab 05-07-10 à 22:24

Bonsoir ecilamlac,

Ton programme a plusieurs problèmes.
Tout d'abord, tu utilises une variable t non déclaré qui apparemment à le même rôle que x (donc inutile dans cette version du programme).
Ensuite, tu utilises les randomise mais sans mettre de protection. En effet, tu peux aller à droite/rester/gauche mais toi dans ton programme, si tu arrives au premier rang et que tu vas à gauche, tu vas sur la dernière note de gauche. Alors, si c'est voulu ok, sinon, il faut bloquer ce passage.
Après, ta façon de calculer la position dans S est fausse. En effet, tu établies la valeur de A(t) non pas avec la valeur de A(t-1) comme tu devrais faire mais avec la valeur de l'itération. Ce qui peut crée de la discontinuité dans ta série.
Enfin, tu crées de série de 12n éléments au risque de ne pas utiliser toutes les notes (tu préfères l'utilisation de toutes les notes ou la taille de la série).
Et pour terminer, il ne faut pas utiliser 0.33/0.33/0.33 car statistiquement, tu ne vas rester autour de ta note initiale.

Si tu me décris exactement ce que tu attends de ce programme, je veux bien te le faire (vu ta formation, j'imagine que la programmation doit te réjouir modérément).

Courage^^

PS : Il y a aussi une mauvaise utilisation de la structure if then elseif else.

Posté par
ecilamlac
scilab 05-07-10 à 23:30

bon en effet, t n'a pas d'utilité.
La protection vers la gauche à partir du premier rang n'est pas nécessaire, il est possible d'aller sur la dernière note à gauche.
En effet, il ne doit pas y avoir de discontinuité dans la série, enfin je ne sais pas si c'est ça que ça veut dire mais on ne peut pas sauter de nombre.
et il faut en effet aussi utiliser toutes les notes, c'est ce qui est à privilégier et non pas la taille de la série. La taille de la série n'a pas d'importance enfin si, elle doit être suffisamment longue... les répétitions et les allées et venues peuvent être nombreuses. ça serait bien si la série était répétée deux fois, c'est-à-dire chaque nombre énoncé au moins deux fois. Si c'est suffisant. (très grosso modo, avec toute mon approximation musicale : il faudrait disons une centaine de nombre)
ok pour 0.33 !

Je ne suis pas sûre d'être encore très claire...

petit prob supplémentaire, il semblerait que scilab ne soit pas bien installé... enfin je suppose...

en tout cas, je n'arrive pas à le faire fonctionner.

Je m'y recolle demain.

Merci.
Je patauge dans la programmation mais ça ne me déplaît pas. là, c'est un peu dans l'urgence mais je m'y colle de façon sérieuse en septembre !

Posté par
Boltzmann_Solver
re : scilab 05-07-10 à 23:35

Ton code ne marche pas. C'est normal. Il y a des erreurs de sémentiques en plus d'algo.
Ce soir, je ne pense pas continuer (j'ai mon travail sur le gaz), mais je te posterai un code fonctionnel pendant ma pause de midi.

Tu verras la musique algorithmique, c'est sympa (j'en ai fait un peu pour m'amuser^^)

Bonne soirée.

Posté par
Boltzmann_Solver
re : scilab 06-07-10 à 12:38

Bonjour,

Voila une autre proposition en espérant respéter toutes les règles que tu souhaites. Le code fonctionne mais suivant les paramètres d'entrée peut produite (volontairement) une erreur.

Citation :

// Fonction retournant deux nombres aléatoires

function [rd1,rd2]=rd_pb()
  rd1 = rand();
  rd2 = rand();
endfunction

// Fonction générant les notes et les temps de paramètres :
// nb_motif : nombre de motif(s) minimum pour chaque note.
// lg_min : longueur minimum de notes demandée.
// lg_secu : longueur maximum de notes autorisée.
// Optionnels
// prb_min/max : probabilité de faire un saut vers la gauche/probabilité de ne pas faire un saut vers la droite
// prf : profondeur de récursion
//
// Exemple : [A,B,C,d] = gen_st(2,200,501,0.33,0.66);

function [A,B,Chk_st,chk_ok]=gen_st(nb_motif,lg_min,lg_secu,prb_min,prb_max,prf)
///////////////////////
// Données de départ //
///////////////////////

// Séquence de notes
S = [1 3 8 4 12 5 7 9 2 10 6 11];
// Temps associé à ces notes
T = [0.5 1 1.5 2 2.5 3 3.5 4 4 2 3 8];

//////////////////////////////////
// Initialisation des variables //
//////////////////////////////////
if ~exists('prf') then
  prf=0;
else
  prf=prf+1;
end
Chk_st=zeros(length(S),1);
s_pos = 1;
x_pos = 1;
mod_ctrle = 10;
chk_ok=0;
min_lgt = lg_min;
max_lgt = lg_secu;
n_motif = nb_motif;
A(1)= S(x_pos);
B(1)= T(s_pos);
if ~exists('prb_min') | ~exists('prb_max') then
  [ps,pr] = rd_pb();
  if (abs(ps-pr) < 0.25) | (abs(ps-pr) > 0.70) then
    [ps,pr] = rd_pb();
  end
else
  pr = prb_min;
  ps = prb_max;
end

if (pr > ps) then
  tmp = pr;
  pr = ps;
  ps = tmp;
end

while ((chk_ok==0) & (length(A) < max_lgt))
  x_test = rand();
    // Détermination du sens du nième saut
    if ((x_test<pr) & (s_pos==1)) then
      s_pos = length(S);
    elseif x_test<pr then
      s_pos = s_pos-1;
    elseif ((x_test>=ps) & (s_pos == length(S))) then
      s_pos = 1;
    elseif ((x_test>=ps) & (s_pos ~= length(S))) then
      s_pos = s_pos+1;
    else
    end
      x_pos = x_pos+1;
      A(x_pos)=S(s_pos);
      B(x_pos)=T(s_pos);
      Chk_st(s_pos) = Chk_st(s_pos) + 1;
      if modulo(x_pos,mod_ctrle)==0 then
        chk_ok = 1;
// Contrôle du degré de récurrence ou la séquence s'arrête quand on atteint au moins n_motif à tout les éléments
        for chk_lst=1:length(S)
          if Chk_st(chk_lst)<=n_motif then
            chk_ok = 0;
          end
        end
      end
end


if((length(A) == max_lgt) | (length(A) < min_lgt)) then
  [A,B,Chk_st,chk_ok]= gen_st(nb_motif,lg_min,lg_secu,ps,pr,prf);
elseif prf == 20
   error("Mauvais jeu de paramètres entrainant une profondeur de récursivité trop élevée");
end
endfunction


Bonne chance pour ton stage.

Posté par
ecilamlac
scilab 06-07-10 à 14:40

merci, merci beaucoup



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !