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 :
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
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
J'obtiens ce code d'erreur :
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
Quelqu'un peut m'aider ?--> 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.
Partager