Boucle Scilab

Discutez d'informatique ici !
Zweig
Membre Complexe
Messages: 2010
Enregistré le: 02 Mar 2008, 04:52

Boucle Scilab

par Zweig » 22 Jan 2012, 22:48

Salut,

Je débute en Scliab et on me demande, étant donné un tableau à double entrée notes/nombres, de calculer de deux façons différentes (avec sum et for) le nombre d'élèves, l'écart-type et la moyenne générale. Pour l'utilisation de sum, ça va, mais pour l'utilisation de for, ça coince, ça marque en fait chaque itération les unes au-dessous des autres au lieu d'avoir le résultat global ...

Quelles sont les erreurs ?

Merci.

Code: Tout sélectionner
Notes = [0, 1 ; 1, 2 ; 2, 2 ; 3, 2 ; 4, 0 ; 5, 4 ; 6, 3 ; 7, 5 ; 8, 4 ; 9, 9 ; 10, 4 ; 11, 2 ; 12, 3 ; 13, 3 ; 14, 4 ; 15, 5 ; 16, 5 ; 17, 3 ; 18, 1 ; 19, 1 ; 20, 4] ;
N = sum(Notes(1:21, 2))
M = (sum(Notes(1:21, 1) .*Notes(1:21,2)))/N
E = ((sum(Notes(1:21, 1) .*(Notes(1:21, 2)-M) .^2))/N) .^(1/2)

for i=1:21
    N2 = 0 ;
    N2= N2 + Notes(i, 2)
end

for i = 1:21
    M2 = 0 ;
    M2 = M2 + (Notes(i, 1) .*Notes(i,2))/N2
end

for i = 1:21
    E2 = 0 ;
    E2 = (E2+(Notes(i, 1) .*(Notes(i, 2)-M2) .^2)/N2) .^(1/2)
end


Erreurs :

Code: Tout sélectionner
Initialisation :
  loading initial environment
  N  =
 
    67. 
 M  =
 
    10.656716 
 E  =
 
    13.247915 
 N2  =
 
    1. 
 N2  =
 
    2. 
 N2  =
 
    2. 
 N2  =
 
    2. 
 N2  =
 
    0. 
 N2  =
 
    4. 
 N2  =
 
    3. 
 N2  =
 
    5. 
 N2  =
 
    4. 
 N2  =
 
    9. 
 N2  =
 
    4. 
 N2  =
 
    2. 
 N2  =
 
    3. 
 N2  =
 
    3. 
 N2  =
 
    4. 
 N2  =
 
    5. 
 N2  =
 
    5. 
 N2  =
 
    3. 
 N2  =
 
    1. 
 N2  =
 
    1. 
 N2  =
 
    4. 
 M2  =
 
    0. 
 M2  =
 
    0.5 
 M2  =
 
    1. 
 M2  =
 
    1.5 
 M2  =
 
    0. 
 M2  =
 
    5. 
 M2  =
 
    4.5 
 M2  =
 
    8.75 
 M2  =
 
    8. 
 M2  =
 
    20.25 
 M2  =
 
    10. 
 M2  =
 
    5.5 
 M2  =
 
    9. 
 M2  =
 
    9.75 
 M2  =
 
    14. 
 M2  =
 
    18.75 
 M2  =
 
    20. 
 M2  =
 
    12.75 
 M2  =
 
    4.5 
 M2  =
 
    4.75 
 M2  =
 
    20. 
 E2  =
 
    0. 
 E2  =
 
    9. 
 E2  =
 
    12.727922 
 E2  =
 
    15.588457 
 E2  =
 
    20. 
 E2  =
 
    17.888544 
 E2  =
 
    20.820663 
 E2  =
 
    19.843135 
 E2  =
 
    22.627417 
 E2  =
 
    16.5 
 E2  =
 
[Continuer à afficher? n (no) pour arrêter, autre touche pour continuer]



Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6472
Enregistré le: 22 Nov 2007, 14:00

par fatal_error » 22 Jan 2012, 22:59

salut,

rajoutes un point virgule
N2= N2 + Notes(i, 2) ;

et au passage initialise ta variable en dehors de la boucle for
Code: Tout sélectionner
N2 =0;
for machin
 N2=N2+note(machin) ;
end
N2 (pour afficher la variable)
la vie est une fête :)

Zweig
Membre Complexe
Messages: 2010
Enregistré le: 02 Mar 2008, 04:52

par Zweig » 22 Jan 2012, 23:11

Merci, ça marche !

Du coup, pour l'écart-type, je trouve deux valeurs différentes (alors que M2 = M et N2 = N) :\ J'vois pas d'où ça vient

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6472
Enregistré le: 22 Nov 2007, 14:00

par fatal_error » 22 Jan 2012, 23:31

jte fais confiance pour la formule théorique de lecart type.

dans
Code: Tout sélectionner
for i = 1:21
    E2 = (E2+(Notes(i, 1) .*(Notes(i, 2)-M2) .^2)/N2) .^(1/2)
end

tu chopes la racine carrée à chaque fois, c'est faux. c'est plutot un truc genre
Code: Tout sélectionner
for i = 1:21
    E2 = (E2+(Notes(i, 1) .*(Notes(i, 2)-M2) .^2)/N2)
end
E2 = sqrt(E2)

ou si tu es soucieux de loptimisation :
Code: Tout sélectionner
for i = 1:21
    E2 = (E2+(Notes(i, 1) .*(Notes(i, 2)-M2) .^2)
end
E2 = sqrt(E2/N2)

en factorisant N2 qui est une constante

enfin pdt que jy suis, au lieu decrire 21 partout, tu as certainement une fonction qui te retourne la taille du tableau notes, genre length(Notes), ou bien size(Notes) (je sais pas mais a toi de chercher lol), c'est un peu mieux.
la vie est une fête :)

Zweig
Membre Complexe
Messages: 2010
Enregistré le: 02 Mar 2008, 04:52

par Zweig » 22 Jan 2012, 23:34

Justement, j'suis pas très sûr pour la formule de l'écart-type, enfin je suppose que lorsqu'on a des données pondérées, on doit rajouter les coefficients devant les différences de carrée ... Je n'arrive pas à trouver la version "pondérée" sur Wikipedia ...

Merci sinon :lol3:

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6472
Enregistré le: 22 Nov 2007, 14:00

par fatal_error » 22 Jan 2012, 23:39

Au pire on peut voir que
Notes = [0, 1 ; 1, 2 ; 2, 2 ];
=>
note = [0,1,1,2,2] (genre le 1 apparait deux fois parce que deux élèves, idem le 2)
et faire comme d'hab.

De fait, on a bien un truc style
E2 = E2 + note(i,2) * (note(i,1) - M)^2

je pense pas qu'il y ait besoin de mettre d'opération .* qui signifie je pense opération sur composante de vecteur. Vu que tu manipules des scalaires, c'est des vecteurs de taille 1 donc c'est correct, mais ca sert à rien.
la vie est une fête :)

Zweig
Membre Complexe
Messages: 2010
Enregistré le: 02 Mar 2008, 04:52

par Zweig » 22 Jan 2012, 23:48

En fait, c'était pas bon car j'avais inclu le coeff dans le carré, j'avais pas fait gaffe !

Merci !

Zweig
Membre Complexe
Messages: 2010
Enregistré le: 02 Mar 2008, 04:52

par Zweig » 23 Jan 2012, 00:56

Autre chose. Existe-t-il une manière de créer une matrice carrée comme suit : tous les éléments valent "1" exceptés deux éléments (dont on connaît leurs "coordonnées" dans la matrice) dont on choisit leur valeur ? Je suppose que oui, mais je ne vois pas quelle fonction utiliser (rien trouvé dans l'aide :\). Il faut savoir que la taille de la matrice dépend d'un entier n (donné par l'utilisateur), et donc de même pour l'emplacement de ces 2 éléments (je ne peux donc pas la créer à la main comme t'alleurs). J'ai bien pensé à découper ma matrice en deux : la matrice carrée n - 2 constitué que de 1 (ça se fait bien avec repmat) mais pour la matrice n-2 * 2, jvois pas comment faire

Merci !

Zweig
Membre Complexe
Messages: 2010
Enregistré le: 02 Mar 2008, 04:52

par Zweig » 23 Jan 2012, 02:34

Encore un problème tout bête je suppose ... Je ne comprends pas l'erreur ! J'ai vérifié qu'on a bien tous les "else", "if", end machin (ça se fait automatiquement en plus avec l'interface de Scilab) pourtant ...

--> function [t]=taux(n)
--> if 1<= n<= 10 then
--> t=0.031/12
--> else
--> if 11<= n<= 15 then
--> t=0.034/12
--> else
--> if 16<= n<=20 then
--> t=0.035/12
--> else
--> if 21<= n<= 25 then
--> t=0.0365/12
--> else
--> if 26 <= n <= 30 then
--> t=0.0395/12
--> end
--> end
--> end
--> end
--> end
--> endfunction

-->taux(2)
!--error 43
Pas encore implémenté dans Scilab...

Zweig
Membre Complexe
Messages: 2010
Enregistré le: 02 Mar 2008, 04:52

par Zweig » 23 Jan 2012, 04:18

Mon but est de construire un tableau de remboursement (comme ici http://fr.wikipedia.org/wiki/Plan_de_remboursement#Tableau_de_remboursement). Le montant à rembourser est fixé à 95000€ par mensualités de 594€. Pour chaque mois i, je dois donc calculer les interets (Int_remb), le capital remboursé (capi_remb) et le capital restant dû (capi_rest). En mettant de côté la fonction de mon message précédent (qui va déterminer le taux mensuel des intérets en fonction de l'année sur lequel s'effectuera le remboursement), càd que j'ai fixé une valeur pour taux(n), j'obtiens des erreurs que je n'arrive pas à virer ...

J'ai fixé taux(n) à 0.02 pour l'exemple.

Code: Tout sélectionner
 function [Tab]=pret(n) // n en anées
    Tab = ['Mois' 'Capital restant du' 'Interets rembourses' 'Capital rembourse']
    Int1 = 95000*0.02
    Capi_remb = 594 - Int1
    Capi_rest = 95000 - Capi_remb
        for i = 1:n*24
            Int_remb = Int1 - Capi_remb*0.02
            Capi_remb = 594 - Int_remb
            Capi_rest = 95000 - Capi_remb
            Tab(i+1,1) = i
            Tab(i+1, 2) = Capi_rest
            Tab(i+1,3) = Int_remb
            Tab(i+1,4) = Capi_remb
    end
   
endfunction


Erreurs :

Code: Tout sélectionner
[Tab]=pret(1)
 !--error 43
Pas encore implémenté dans Scilab...

at line       8 of function %s_i_c called by : 
at line      10 of function pret called by : 
[Tab]=pret(1)


Merci !

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6472
Enregistré le: 22 Nov 2007, 14:00

par fatal_error » 23 Jan 2012, 09:47

es-tu sur qu'on a le droit d'écrire
Code: Tout sélectionner
if 16<= n<=20 then

et qu'il faut pas plutot ecrire
Code: Tout sélectionner
if 16<=n && n<=20 then


Ensuite, pour les if/else, jte fais confiance pour leur nombre, mais pour la lecture, ca reste mieux de les indenter...comme tu l'as fait pour la fonction pret
Code: Tout sélectionner
if blabla
  if blabla
    ....
  else
    ...
  end
  if blabla 2
    ...
  end
else


C'est assez byzarre cela dit pour ta fonction pret. J'ai pas de scilab et j'en connais pas la syntaxe, mais je dirais que tu peux tenter :
de virer la ligne
Code: Tout sélectionner
    Tab = ['Mois' 'Capital restant du' 'Interets rembourses' 'Capital rembourse']

parce que tu declare un tableau de string, et en plus 1D, alors qu'apres tu manip des tableaux de nombres 2D...donc ya ptet conflit de types+Dimension.

Ensuite pour le passage
Code: Tout sélectionner
Tab(i+1,1) = i
            Tab(i+1, 2) = Capi_rest
            Tab(i+1,3) = Int_remb
            Tab(i+1,4) = Capi_remb

Bien que ca me semble correct, essaie déjà de commencer à 1 (au lieu de 2) donc
Code: Tout sélectionner
Tab(i,1) = i
Tab(i, 2) = Capi_rest
Tab(i,3) = Int_remb
Tab(i,4) = Capi_remb

Et enfin autant minimiser le nombre de lignes
Code: Tout sélectionner
Tab(i,1:4) = [i Capi_rest Int_remb Capi_remb]

ca ne résoudra pas le probleme, mais ca sera déjà plus joli

Si ca marche toujours pas, ben supprimes le max de lignes annexes, jusqu'à avoir un truc épuré de tout éventuel problème, de la même manière que tu as commenté taux(n) ben tu peux sortir Tab(i,2) de la boucle for genre Tab(1,2)=3 et tester que c'est good, etc...
la vie est une fête :)

Zweig
Membre Complexe
Messages: 2010
Enregistré le: 02 Mar 2008, 04:52

par Zweig » 23 Jan 2012, 14:49

Salut,

J'ai modifié un peu taux(n) pour les besoins du déboggage on va dire, j'ai juste pris en compte les années limites des prêt. Du coup, je n'obtiens plus d'erreur mais un tableau incohérent. Pour n = 1, j'obtiens ça

Code: Tout sélectionner
C_tot = 95000 ;
M = 594 ;
Tab = [] ;
// 1) //

function [t]=taux(n) // n en années
    select n
    case 1
        t=0.025/12
    case 10
        t = 0.031/12
    case 15
        t = 0.034/12
    case 20
        t = 0.0365/12
    case 30
        t = 0.0395/12
    end
    endfunction

function [Tab]=pret(n) // n en années
    Int1 = C_tot*taux(n)
    Capi_remb = M - Int1
        for i = 1:n*12
            Int_remb = Int1 - Capi_remb*taux(n) ;
            Capi_remb = M - Int_remb ;
            Capi_rest = C_tot - Capi_remb ;
            Tab(i,1) = i ;
            Tab(i, 2) = Capi_rest ;
            Tab(i,3) = Int_remb ;
            Tab(i,4) = Capi_remb ;
    end
   
endfunction


Code: Tout sélectionner
  1.     94603.091    197.09149    396.90851 
    2.     94603.09     197.08977    396.91023 
    3.     94603.09     197.08977    396.91023 
    4.     94603.09     197.08977    396.91023 
    5.     94603.09     197.08977    396.91023 
    6.     94603.09     197.08977    396.91023 
    7.     94603.09     197.08977    396.91023 
    8.     94603.09     197.08977    396.91023 
    9.     94603.09     197.08977    396.91023 
    10.    94603.09     197.08977    396.91023 
    11.    94603.09     197.08977    396.91023 
    12.    94603.09     197.08977    396.91023 
    13.    94603.09     197.08977    396.91023 
    14.    94603.09     197.08977    396.91023 
    15.    94603.09     197.08977    396.91023 
    16.    94603.09     197.08977    396.91023 
    17.    94603.09     197.08977    396.91023 
    18.    94603.09     197.08977    396.91023 
    19.    94603.09     197.08977    396.91023 
    20.    94603.09     197.08977    396.91023 
    21.    94603.09     197.08977    396.91023 
    22.    94603.09     197.08977    396.91023 
    23.    94603.09     197.08977    396.91023 
    24.    94603.09     197.08977    396.91023


Ca viendrait donc de la boucle maintenant ... Mais je ne vois pas ce qui cloche

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6472
Enregistré le: 22 Nov 2007, 14:00

par fatal_error » 23 Jan 2012, 15:35

re,

Int_remb = Int1 - Capi_remb*taux(n) ;

n ctune constante, tu veux ptet plus mettre un truc genre i.

cest chelou ta boucle for avec n*12, 12 ca mevoque des mois.
donc jdirais plutot que tu appels taux(n) avec n des mois...

du coup tenquilles taux(i) dans la fonction pret, et puis dans ta fonction taux(m) tu fais des checks sur le nombre de mois.

non?

rq: ca coute rien de mettre des variables bien nommees hein? :lol3:
nbAnnees, nbMois, ... :D
la vie est une fête :)

Zweig
Membre Complexe
Messages: 2010
Enregistré le: 02 Mar 2008, 04:52

par Zweig » 23 Jan 2012, 15:37

Bon, je vais revoir le côté mathématique car je pense que je me suis emêlé les pinceaux ici, je reverrai le code après

merci !

Zweig
Membre Complexe
Messages: 2010
Enregistré le: 02 Mar 2008, 04:52

par Zweig » 23 Jan 2012, 16:01

Si j'appelle , et respectivement le capital restant dû, les intérêts payés et le capital payé au mois n (, et avec le prêt à rembourser, la mensualité et le taux mensuel) alors on a :







On est d'accord ?

A partir de là, je peux donc tout déduire en fonction de n (comme est une suite arithmético-géométrique) mais je suppose que la prof veut que je fasse joujou avec des boucles ... Ca m'a l'air un peu moins "crado" que toute à l'heure ... Je vais réessayer !

Zweig
Membre Complexe
Messages: 2010
Enregistré le: 02 Mar 2008, 04:52

par Zweig » 23 Jan 2012, 16:26

Argh, ça me gonfle ... J'ai modifié mon code, et voici une autre erreur

Code: Tout sélectionner
 
C = 95000 ;
M = 594 ;
// 1) //

function [t]=taux(n) // n en années
    select n
    case 1
        t=0.025/12
    case 10
        t = 0.031/12
    case 15
        t = 0.034/12
    case 20
        t = 0.0365/12
    case 30
        t = 0.0395/12
    end
    endfunction

function [Tab]=pret(n) // n en années
            for i = 1:n*24
                R(1) = C
                I(1) = R(1)*taux(n)
                C(1) = M - I(1)
               
            R(i+1)= (1+taux(n))*R(i) - M
            I(i+1)= R(i)*taux(n)
            C(i+1)=M-I(i)
            Tab(i,1) = i ;
            Tab(i,2) = R(i) ;
            Tab(i,3) = I(i) ;
            Tab(i,4) = C(i) ;
    end
   
endfunction


Voici l'erreur :

Code: Tout sélectionner
 [Tab]=pret(1)
 !--error 15
Sous-matrice incorrectement définie.

at line       3 of function pret called by : 
[Tab]=pret(1)


J'ai vérifié la syntaxe sur la matrice sur l'aide, j'vois pas où j'ai foiré ... Car si je mets des [], j'aurai des matrices de matrices non ?

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 14:39

par Dlzlogic » 23 Jan 2012, 17:02

Bonjour,
Je n'ai jamais pratiqué le Scilab, mais dans tous les langages que je connais un "select" (ou "switch" dans d'autres langages) renvoient à une adresse. Cela signifie qu'après exécution du code voulu, il faut sortir. Il doit y avoir un mot-clé du genre "endselect" ou "endcase". Dans d'autres langages, c'est "break".
Petit détail sur le premier calcul, dans le cas où la moyenne n'est pas une valeur vraie, le dénominateur dans le calcul de l'écart-type est (N-1) et non pas N. Dans la littérature Wiki, il est utilisé le terme "biaisé".

Zweig
Membre Complexe
Messages: 2010
Enregistré le: 02 Mar 2008, 04:52

par Zweig » 23 Jan 2012, 17:13

Merci pour les précisions.

Pour le select, y a le "end" à la fin (scilab met en fait automatiquement les mots-clés de fin dès qu'on rentre le mot-clé de début)

Mais même en enlevant la fonction pret, j'ai toujours cette erreur sur la matrice...

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 14:39

par Dlzlogic » 23 Jan 2012, 17:44

Zweig a écrit:Merci pour les précisions.

Pour le select, y a le "end" à la fin (scilab met en fait automatiquement les mots-clés de fin dès qu'on rentre le mot-clé de début)

Mais même en enlevant la fonction pret, j'ai toujours cette erreur sur la matrice...

Ce que je veux dire, c'est que dans les autres langages, avec un tel code, le programme passera toujours à la case 30, s'il est passé par l'une des case 1, 10, 15, 20, ce qui fait que "t = 0.0395/12" sera exécuté dans tous les cas, ou plutôt des autres seront peut-être exécutés aussi mais avant, donc écrasés.
Pour la gestion des tableaux (pardon, matrices :hum: ) c'est probablement une question de syntaxe, il faudrait que je regarde.

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6472
Enregistré le: 22 Nov 2007, 14:00

par fatal_error » 23 Jan 2012, 20:56

re,

la fonction taux retourne un tableau, et je pense que I(1) attend un scalaire.
Donc tu peux essayer (avec un peu de chance)
a=pret(n)
I(1) = a(1)
ou la version peut etre plus rapide
[I(1)] = taux(1)
la vie est une fête :)

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 7 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite