Inscription / Connexion Nouveau Sujet
Niveau Licence Maths 1e ann
Partager :

Scilab, écriture d'une double incrémentation

Posté par
marca
11-09-12 à 20:08

Bonjour,

Je me demande comment je peux incrémenter un temps de contrôle et un nombre de contrôle dans mon cas.

Le problème sur lequel je travaille est de trouver le nombre minimum de contrôle nécessaire pour que mes 10 activités d'un projet lambda ne dépasse pas une limite de risque fixée. Pour cela je calcule la somme de mes activités sans contrôle (1 contrôle ramène la somme à 0 et ensuite l'intensité des activités réaugmente après ce contrôle), si celle-ci est en dessous de la limite le problème est résolu. Sinon j'incrémente 1 premier contrôle et calcule toutes les solutions de ma somme d'activités pour les différentes positions de mon contrôle. Si dans ces solutions une au moins est inférieure à ma limite de risque c'est bon sinon j'incrémente de 1 mon compteur de contrôle.

J'aimerais donc écrire deux boucles imbriquées de la forme:
do n<-n+1
do t<-t+1
Y=sum....
Y<L
if F else do t<-t+1
Loop until t=10
Loop until n<9

Avec n mon nombre de contrôle et t la position ou le temps du ou des contrôles.

Je souhaite uniquement savoir comment écrire l'incrémentation "n<-n+1" et "t<-t+1".

Merci pour votre aide

Posté par
Galilée
re : Scilab, écriture d'une double incrémentation 11-09-12 à 20:27

salut marca,

Tu tappes "help for" dans la console scilab...

Et sinon ça fait

for n=1:100 do

for t=1:100 do

blabla

end;
end;

Posté par
marca
re : Scilab, écriture d'une double incrémentation 11-09-12 à 20:55

Merci de ta réponse mais là où je ne sais pas comment faire c'est comment lui dire de faire +1 contrôle ou +1 au niveau de la position de mon contrôle.

Par exemple pour 1 contrôle à la position 5 j'aurais: de 1 à 5 Y=sum des activités, le contrôle intervient à la position 5 donc mon Y est repart de 0, et de 5 à 10 Y=sum des activités.
Si pour 1 contrôle à la position 5 (1_5) je suis toujours au dessus de la limite, je dois lui dire "faire t<-t+1" pour calculer Y pour 1_6. Et ca jusqu'à 1_10 si toujours pas de solution. Et si toujours pas de solution non plus on ajoute là 1 contrôle, 2_1, puis 2_2....2_10, 3_1... Comment dire de rajouter +1 à la position du contrôle dans un premier temps et +1 dans le nombre de contrôle dans un deuxième temps?

Posté par
Galilée
re : Scilab, écriture d'une double incrémentation 11-09-12 à 21:06

Bon je comprends pas le "fond" du problème, mais si tu veux juste incrémenter ta variable "contrôle", tu peux faire un tout bête "n=n+1"

Posté par
Galilée
re : Scilab, écriture d'une double incrémentation 11-09-12 à 21:11

Ou sinon une idée de programme :

for n=1:10 do

Y=blabla

if Y > L then break;

end;

Ce que fait cette boucle : n=1 -> calcul Y -> si Y>L on arrête la boucle
                                           -> sinon on continue (en d'autres termes n=n+1

Voilà, je ne sais pas trop si ça répond à ta question

Posté par
marca
re : Scilab, écriture d'une double incrémentation 11-09-12 à 21:22

Ok je pense effectivement que ca ressemblera grandement à l'exemple de programme que tu m'as montré. Mais dans le cas où je dois continuer le calcul et rajouter un contrôle. Où (début ou fin de la boucle) et comment je place mon n<-n+1?

Logiquement je penserai l'écrire à la fin du type:
if Y<L ==F
else t=t+1
Loop until t=10
else n=n+1
Loop until n=9

?

Posté par
marca
re : Scilab, écriture d'une double incrémentation 12-09-12 à 19:53

Est ce la bonne écriture? Ou bien je dois écrire mon t recoit t+1 au début de la boucle?

Posté par
Galilée
re : Scilab, écriture d'une double incrémentation 12-09-12 à 21:45

Salut,

Je ne connais pas la fonction "loop until" de scilab, c'est pour ça que je proposais la boucle "for" qui incrémente toute seule et teste la condition "t=10" à chaque fois.

Après je pense que si tu utilises "t" dans ton "if" alors il faut incrémenter au début.

Car avec ton programme, par exemple lorsque t=9, tu vas rentrer dans ta fonction "if", et puis après tu fais t=t+1=10 et tu sors de la boucle. tu n'auras donc pas testé la condition pour t=10.

Posté par
marca
re : Scilab, écriture d'une double incrémentation 12-09-12 à 22:12

Bonjour,

Je n'ai pas compris pourquoi mon t+1=10 me fait sortir de ma boucle et pourquoi celle-ci ne calculerai pas cette vauleur t=10. Mais ce n'est pas grave.

Pour l'instant ma boucle ressemble à:
for n=1, t=1 //je calcule pour 1 contrôle (n=1) à la position 1 (t=1)
Y=blablabla
if Y<L then break
else .... //c'est ici que je ne sais pas comment lui dire de faire t<-t+1 pour passer à la position 2
Loop until t=10 //pour faire toutes les positions de contrôle
....... //ici si même problème comment lui dire de faire n<-n+1 pour passer à 2 contrôle si aucune des solutions           avec 1 contrôle ne permet d'avoir Y<L
Loop until n=9 //pour tester les solutions jusqu'au nombre max de contrôle

Le if else n'est peut être pas approprié? Peut etre faire juste, Y<L et en fonction de la réponse F ou T lui dire de passer à la position +1??

Posté par
Galilée
re : Scilab, écriture d'une double incrémentation 12-09-12 à 22:38

Ok je résume le problème.
Tu souhaites faire 1 contrôle (n=1), à la position (t=1). si le test est négatif, tu souhaites passer à la position 2, refaire un contrôle (donc n=1 toujours), et incrémenter t jusqu'à t=10. Si la condition n'est toujours pas vérifiée, on passe à 2 contrôle (n=2), on teste la position t=1, jusqu'à t=10. etc...
C'est ça ?

Dans ce cas :
Solution que je propose :

n=1;

while n=9 do

t=1;
    while t<=10 do

         Y=blabla;
         if Y<L then break
         else  t=t+1; end;

     end;

n=n+1;

end;

Que fais ce programme ?

Il initialise n=1. On entre dans la boucle.

puis t=1
On test Y<L pour n=1.
Tant que la condition n'est pas réalisée, on incrémente t, jusqu'à t=10.

Ensuite si lorsque t=10, la condition n'est pas réalisée, on fait n=n+1 (donc 2). Puis rebelote, on teste pour t=1...10.


Si j'ai bien compris le problème, ça devrait marcher.
A noter que mon "while" correspond à ton "loop until".

Posté par
Galilée
re : Scilab, écriture d'une double incrémentation 12-09-12 à 22:40

ERRATA : lire "while n<=9" do à la place de "while n=9 do"

Posté par
marca
re : Scilab, écriture d'une double incrémentation 12-09-12 à 22:43

Oui vous avez bien compris le problème c'est très bien résumé. La boucle m'a l'air cohérente et comme ca on arrive vraiment à faire la double incrémentation.

Je vais tester ca avec mes données. Je reviens vous dire si cela a marché! Merci beaucoup en tout cas pour cet éclaircissement

Posté par
Galilée
re : Scilab, écriture d'une double incrémentation 12-09-12 à 22:43

Citation :
for n=1, t=1

Là, ça ne marchera pas... Pour initialiser ta boucle, il faut la valeur de départ et la valeur d'arrêt.


Si tu veux utiliser une boucle "for" c'est encore plus simple :

for n=1:9

for t=1:10

Y=blabla

if Y<L then break

end;

end;

Pour n=1, le programme balaie toutes les valeurs de t, et ne sors que si la condition est vérifiée. Si la condition n'est jamais vérifiée, il passe à n=2, et balaie à nouveau toutes les valeurs de t.

Posté par
Galilée
re : Scilab, écriture d'une double incrémentation 12-09-12 à 22:45

Ok, dis moi si ça marche.
Et essaie plutôt ma deuxième proposition, elle m'a l'air mieux...



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

Inscription gratuite

Fiches en rapport

parmi 1742 fiches de maths

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 !