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

Scilab Discussion :

Erreur : Invalid index


Sujet :

Scilab

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Agente de projets
    Inscrit en
    Juillet 2022
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Agente de projets

    Informations forums :
    Inscription : Juillet 2022
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Erreur : Invalid index
    Bonjour,

    je suis débutante dans Scilab. J'ai deux fonctions qui sont liées pour calculer automatiquement le débit d'un cours d'eau en fonction du lit de référence et de la mesure de hauteur libre à partir d'un pont. La première fonction est la suivante :

    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
    53
    54
    55
    56
    57
    58
    function debit = debitflowprobe(lit,vitesse)
     
        // Fonction qui permet de calculer le débit selon deux matrices en entrée
        // 1) Matrice de la section (lit): [x1 x2 x3 x4 ...; y1 y2 y3 y4...] en m et en cm
        // 2) Matrice de la vitesse (vitesse): [x1 x2 x3...;v1 v2 v3..] en m/s
        // 2.1) La fonction considère qu'à 0 et à xfin, la vitesse = 0.
        // 3) La sortie est le débit en m³/s
     
    //D'abord, définir le lit du cours d'eau, la deuxième ligne (Y) sera multiplié par 100 pour avoir tout en mètre, à l'écrit plus facile en cm
        lit(2,:) = lit(2,:)*0.01
    // Faire une interpolation linéaire pour connaître la profondeur d'eau pour les valeurs où la vitesse a été prises 
        prof_inter = [vitesse(1,:);interpln(lit,vitesse(1,:))];
     
    //Création d'une nouvelle matrice qui ajoute aux valeurs du lit les valeurs interpolées pour la mesure où les vitesses ont été prises.
        matrice= [lit,[vitesse(1,:);prof_inter(2,:)]];
    // Création d'une matrice_ordonnee pour placer en ordre les valeurs en X et en Y. La création d'une seconde matrice d'indice pour savoir la position de chaque permettra de les mettre en ordre par la suite.    
        [matrice_ordonnee,indices] = gsort(matrice,'c','i');
    //Modifier la 2e ligne de la matrice_ordonnee en mettant les valeurs selon leur position à partir de la matrice des indices    
        matrice_ordonnee(2,:) = matrice(2,indices(1,:));
    //La nouvelle matrice est la matrice_ordonnee
        matrice = matrice_ordonnee;
    //Création d'une matrice pour calculer les aires partielles, d'abord création une matrice de zéros selon la taille de la matrice moins 1    
        aires_partielles = zeros(1,size(matrice,2)-1);
    //Pour chaque i allant de 1 à la taille de la matrice moins 1. Calucler les aires partielles de chaque trapèze.    
        for i = 1:(size(matrice,2)-1)
            aires_partielles(i) = (matrice(1,i+1) - matrice(1,i))*(matrice(2,i+1) + matrice(2,i))/2;
        end
    //Création d'nue matrice de zéros appelée position de taille selon le nombre de données de vitesse calculées    
        position = zeros(1,size(vitesse,2));
    //Pour chaque i de 1 jusqu'au nombre de données de vitesse, trouve la position pour lequel la valeur de la vitesse correspond dans la nième valeur dans la matrice. 
        for i = 1:size(vitesse,2)
            position(i) = max(find(matrice(1,:) == vitesse(1,i)));
        end
    //Création d'une matrice aires_partielles2, soit une matrice de zéros selon la taille de la matrice vitesse +1    
        aires_partielles2 = zeros(1,size(vitesse,2)+1);
     
     
        for i = 1:(size(aires_partielles2,2)+1)
            if i ==1 then aires_partielles2(1) = sum(aires_partielles(1:position(i)-1))
            elseif i > 1 & i < (size(position,2)+1) then aires_partielles2(i) = sum(aires_partielles(position(i-1)-1:position(i)-1))
            elseif i == (size(position,2)+1) then aires_partielles2(i) = sum(aires_partielles(position(i-1):size(aires_partielles,2)))
            end
        end
     
     
        debits_partiels = zeros(1,size(aires_partielles2,2));
     
     
        for i = 1:size(aires_partielles2,2)
            if i == 1 then debits_partiels(i) = 2/3*vitesse(2,i)*aires_partielles2(i);
            elseif i == size(aires_partielles2,2) then debits_partiels(i) = 2/3*vitesse(2,i-1)*aires_partielles2(i);
                else debits_partiels(i) = (vitesse(2,i-1)+vitesse(2,i))/2*aires_partielles2(i);
            end
        end
     
        debit = sum(debits_partiels);
     
    endfunction
    Elle est liée à cette deuxième fonction :

    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
    53
    54
    function debit = debit_P07RB_lit2021(vitesse,hl)
     
    // Programme qui permet de calculer le debit de la rivière des hurons (E01) avec le flowprobe
    // Matrice de la vitesse (vitesse): [x1 x2 x3...;v1 v2 v3..] en m/s
    // hl = hauteur libre en mètres
     
     
    // Lit mesuré en juillet 2021 
       lit_hl = [0 0.84 1 1.5 2 2.5 3 3.5 4 4.5 5 5.13 5.25;3.14 3.435 3.53 3.63 3.655 3.485 3.61 3.505 3.615 3.475 3.49 3.41 3.39];
     
        profondeur_eau_inverse = [lit_hl(2,:)-hl;lit_hl(1,:)];
     
    //Si la hauteur libre est supérieure à la plus petite valeur de la hauteur du lit de référence, alors c = 1 et utilise la profondeur d'eau via la matrice en ordonnées. Si le hauteur libre est inférieure, utilisé la profodeur d'eau.
        if hl > min(lit_hl(2,:)) then
     
            c = 1;
     
    //Pour chaque i, de 1 jusqu'au nombre de y dans le lit de référence moins un. 
            for i = 1:(length(lit_hl(1,:))-1)
     
    //Si la valeur situé dans le matrice profondeur_eau_inverse (1,i) est inférieur à 0 et que la valeur situé à (1, i+1)est supérieur à 1 alors mets dans la matrice zero (1,c)
                if (profondeur_eau_inverse(1,i) < 0 & profondeur_eau_inverse(1,i+1) > 0) | (profondeur_eau_inverse(1,i+1) < 0 & profondeur_eau_inverse(1,i) > 0) 
                then 
                    zero(1,c) = interpln(profondeur_eau_inverse(:,i:(i+1)),0);c = c+1;
                end
            end
    // Ajoute une valeur de 0 pour la deuxième ligne
            zero(2,1:length(zero)) = 0;
     
    //La nouvelle matrice profondeur_eau_inverse, enlève les valeurs négatives;
            profondeur_eau_inverse(:,profondeur_eau_inverse(1,:) < 0) = [];
     
    //La nouvelle matrice profondeur_eau est l'inverse de la matrice profondeur_eau_inverse (inversion des X et Y)
            profondeur_eau = [profondeur_eau_inverse(2,:);profondeur_eau_inverse(1,:)]
    //La nouvelle matrice profondeur_eau est l'ancienne ajouté avec la matrice de zéros
            profondeur_eau = [profondeur_eau,zero];
    //Créer un nouvelle matrice ordonnées et une nouvelle matrice indices avec la matrice profondeur_eau, en les plaçant en ordre pour les X et les Y. La matrice indice indique les valeurs leur place avant le changement.
            [matrice_ordonnee,indices] = gsort(profondeur_eau,'c','i');
     
    // La nouvelle matrice ordonnée placera les valeurs en Y  dans l'ordre qu'il était avant la création de la matrice ordonnée pour remettre au bon endroit les valeurs Y avec les bonnes valeurs de X
            matrice_ordonnee(2,:) = profondeur_eau(2,indices(1,:));
     
    //La nouvelle matrice profondeur_eau va être la matrice_ordonnee
            profondeur_eau = matrice_ordonnee;
     
        else
    //Si la hauteur libre est inférieure à la plus petite valeur de la hauteur du lit de référence, alors la matrice de profondeur_eau est l'inverse de profondeur_eau_inverse, sans passé dans la boucle. 
            profondeur_eau = [profondeur_eau_inverse(2,:);profondeur_eau_inverse(1,:)];
     
        end
    // Pour faire le debitflowprobe, il faut que la valeur en Y soit en centimètre, alors une multiplication par 100 est nécessaire)     
        debit = debitflowprobe([profondeur_eau(1,:); profondeur_eau(2,:)*100],vitesse);
     
    endfunction
    J'obtiens ce code d'erreur :

    --> debit_P07RB_lit2021([0.2 1.15 1.95 2.95 3.55      ;0.354 0.292 0.788 0.306 0.28      ],3.43)
    in builtin                debitflowprobe      ( C:\Users\laura.cote\Desktop\Calculs 2021\debitflowprobe.sci line 0 )
    at line    53 of function debit_P07RB_lit2021 ( C:\Users\laura.cote\Desktop\Calculs 2021\debit_P07RB_lit2021.sce line 53 )
    
    Invalid index.
    Quelqu'un peut m'aider ?

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Il y a un problème d'indice dans le bloc suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        for i = 1:(size(aires_partielles2,2)+1)
            if i ==1 then aires_partielles2(1) = sum(aires_partielles(1:position(i)-1))
            elseif i > 1 & i < (size(position,2)+1) then aires_partielles2(i) = sum(aires_partielles(position(i-1)-1:position(i)-1))
            elseif i == (size(position,2)+1) then aires_partielles2(i) = sum(aires_partielles(position(i-1):size(aires_partielles,2)))
            end
        end
    Et plus précisément dans le terme de droite de l'affectation à la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    elseif i > 1 & i < (size(position,2)+1) then aires_partielles2(i) = sum(aires_partielles(position(i-1)-1:position(i)-1))
    Pour améliorer la lisibilité de ton code, écris plutôt la boucle comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        for i = 1:(size(aires_partielles2,2)+1)
            if i ==1 then 
                aires_partielles2(1) = sum(aires_partielles(1:position(i)-1))
            elseif i > 1 & i < (size(position,2)+1) then 
                aires_partielles2(i) = sum(aires_partielles(position(i-1)-1:position(i)-1))
            elseif i == (size(position,2)+1) then 
                aires_partielles2(i) = sum(aires_partielles(position(i-1):size(aires_partielles,2)))
            end
        end
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

Discussions similaires

  1. [MySQL] Obtention de diverses erreurs : undefined index et invalid resource
    Par kate59 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 04/02/2008, 11h51
  2. [VB.NET]Erreur "invalid cross-thread operation"
    Par NicolasJolet dans le forum Windows Forms
    Réponses: 6
    Dernier message: 05/04/2006, 12h38
  3. [PHPLIB] Obtention d'une erreur undefined index
    Par duplo dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 16/02/2006, 15h48
  4. erreur undefined index
    Par istreen dans le forum Langage
    Réponses: 8
    Dernier message: 06/01/2006, 13h09
  5. [debutant]erreur invalid lvalue in assignment
    Par Battosaiii dans le forum C
    Réponses: 3
    Dernier message: 30/11/2005, 17h32

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