Répondre à la discussion
Affichage des résultats 1 à 16 sur 16

scilab besoin d'aide!!



  1. #1
    gnegnegna

    scilab besoin d'aide!!


    ------

    Bonjour!
    alors j'ai un vecteur u trié et je dois creer une fonction qui quand on me donne un réel a je donne un vecteur v qui sera trié et composé des n composantes de u et de a.

    je voulais utilisé while
    while u(i)<=a then v(i)=u(i)

    mais je ne sais pas dire sinon v(i)=a et v(i+1)=u(i) pour le reste des i

    merci!!!!!

    -----

  2. Publicité
  3. 📣 Nouveau projet éditorial de Futura
    🔥🧠 Le Mag Futura est lancé, découvrez notre 1er magazine papier

    Une belle revue de plus de 200 pages et 4 dossiers scientifiques pour tout comprendre à la science qui fera le futur. Nous avons besoin de vous 🙏 pour nous aider à le lancer...

    👉 Je découvre le projet

    Quatre questions à explorer en 2022 :
    → Quels mystères nous cache encore la Lune 🌙 ?
    → Pourra-t-on bientôt tout guérir grâce aux gènes 👩‍⚕️?
    → Comment nourrir le monde sans le détruire 🌍 ?
    → L’intelligence artificielle peut-elle devenir vraiment intelligente 🤖 ?
  4. #2
    Edelstein

    Arrow Re : scilab besoin d'aide!!

    Bonsoir,

    ta solution consiste à utiliser 2 compteurs. Par contre pardonne moi pour la syntaxe, je n'ai pas fait de scilab depuis un petit moment.

    i =1
    j = 1
    cpta = 0

    for (i in size(v)[1]) {
    if ( u[j] <= a | cpta = size(v)[1]-size(u)[1]) then v[i] = u[j]; j = j+1;
    else v[i] = a; cpta = cpta+1;
    end
    i = i+1;
    }

    L'idée, c'est de se dire : à chaque tour de boucle, je vais modifier la composante suivante de v (ce que tu avais commencé à faire). Par contre, la composante de u à évaluer doit-elle toujours être celle d'après? Pas forcément : pas si a est inférieur aux composantes de u ( et que tous les a n'ont pas déjà été mis dans v) car il faudra alors comparer la même composante au prochain tour de boucle.


    rqs : 1- la fonction size de scilab est un peu particulière, elle te renvoie un vecteur de taille 2 avec dans une coordonnée le nombre de lignes et dans l'autre celui de colonnes. Il faut donc remplacer par size[2] si tu travailles avec des vecteurs ligne.

    2- Il est possible que scilab te jette car dans le code précédent, il peut être amené à évaluer u[taille[u] +1] qui n'existe pas. Il te faut donc protéger cela en vérifiant que j est inférieur ou égal à taille[u]. Tu peux tester l'éventuel "jetage" en donnant u un vecteur dont toutes les composantes sont inférieures à a.

    3-Si j'avais pu essayer de te débloquer sans te donner l'algo, je l'aurais fait. Enfin, il faut que tu aies bien compris l'idée derrière. L'idéal pour vérifier cela serait que tu écrives un algo assez proche qui te renvoie un vecteur ordonné à partir de deux vecteurs eux-mêmes déjà ordonnés... Si tu as des questions sur mon code n'hésite surtout pas!

    Cdlt,

  5. #3
    HAL 9000

    Re : scilab besoin d'aide!!

    Ce qui donne en SCILAB :

    Code:
    i = 1;
    j = 1;
    cpta = 0;
    v = zeros(length(u), 1);
    
    for i = 1 : length(v);
        if (u(j) <= a) || (cpta = length(v)-length(u));
           v(i, 1) = u(j);
           j = j+1;
        else
           v(i, 1) = a;
           cpta = cpta+1;
        end;
    end;
    Par contre pour optimiser ton code tu pourrais calculer qu'une seule fois length(v)-length(u) dès le départ, au lieu de le recalculer à chaque fois…
    Dernière modification par HAL 9000 ; 24/05/2010 à 00h08.

  6. #4
    gnegnegna

    Re : scilab besoin d'aide!!

    bonsoir,

    je suis vraiment novice en scilab et je ne comprends pas pourquoi je dois m'occuper de la taille du vecteur?

    j'ai écrit un truc du genre
    for i=1:n
    while u(i)<=a then v(i)=u(i)
    et là je voudrais écrire (est ce que c'est là que j'insère le j?)
    else for j=i:n v(i)=a and v(j+1)=u(i)

    sinon je pensais utiliser if mais j'ai eu un problème car je voulais dire if a<=u(1) then v=[a,u] elseif a>=u(n) then v=[u,a] et là est ce que je peux dire encore elseif? mais je me retrouve avec le même problème où je ne sais pas comment dire v=[u(1),...a,u(jj+1),..]

    merci si tu peux encore m'aider!

  7. A voir en vidéo sur Futura
  8. #5
    gnegnegna

    Re : scilab besoin d'aide!!

    je précise que j'ai commencé comme ça et que j'ai "fixé" mon vecteur u

    function v=fct1(a,n)
    u=linspace(-5,5,n);
    v=zeros(n+1,1);
    for i=1:n
    while u(i)<=a then v(i)=u(i);
    else v(i)=a,for j=i:n v(j+1)=u(i);

  9. #6
    Edelstein

    Re : scilab besoin d'aide!!

    D'accord,

    je n'avais pas exactement compris ton problème : ton vecteur v est de taille taille(u)+1 d'après ce que tu dis? a n'a à être rajouté qu'une seule fois.
    Dan ce cas c'est plus simple et ton truc m'a l'air presque bon, à la syntaxe près : un while then est incorrect : le then ne va qu'avec un if.
    L'autre truc plus gênant, c'est que tu n'as peut-être pas saisi tout à fait le principe des boucles for et while :
    -une boucle while X, Y,Z end; signifie : tant que la condition X est vérifiée, executer Y et Z.
    -une boucle for i in 1:n, Y,Z, end; signifie : i commence de 1 et à chaque fois, j'exécute Y et Z en incrémentant i tant que i est inférieur à n.

    Du coup que fait ton
    for i in 1: n
    while u(i)<= a, v(i) =u(i)

    Eh bien i vaut 1 quand tu rentres dans le for, et ensuite on a "tant que u(i)<= a alors v(i) =u(i)" : donc je teste u(1) <= a si oui v(1) = u(1). Et puis je vais retester exactement pareil : a-t-on u(1) <=a -> boucle infinie si u(1) est effectivement inférieur à a!
    En bref, ton for i in 1:n ne sert à rien et il ne faut pas que tu oublies d'incrémenter i, en mettant une instruction i = i+1 dans ton while. Je pense en fait que ton problème, c'est vraiment de la syntaxe pure et tu as cru que for i in 1:n incrémenterait le i à chaque tour de la boucle while du dessous, ce qui ne marche absolument pas: il faut incrémenter dans les instructions du while. J'espère avoir été clair .
    Si ce n'était pas le cas, peut-être ceci sera-t-il moins sybillin :

    http://www.ann.jussieu.fr/~postel/sc...ticeScilab.pdf

    Enfin, dernier point, je pense qu'il y a une coquille à la fin, tu as certainement voulu mettre v(j+1) = u(j) et pas u(i).
    En résumé, cela devrait te donner quelque chose plutôt comme ça :

    function v=fct1(a,n)
    u=linspace(-5,5,n);
    v=zeros(n+1,1);
    while u(i)<=a, v(i)=u(i), i = i+1, end;
    v(i)=a;
    for j=i:n, v(j+1)=u(j), end;

    Par ailleurs, ton
    for j=i:n, v(j+1)=u(j), end;
    de la fin peut être remplacé par un
    while i <=n, v(i+1) = u(i), i = i+1, end;
    c'est exactement pareil sauf que tu n'as plus besoin de j. Mais ta solution for est parfaitement correcte!

    Cdlt,

  10. Publicité
  11. #7
    gnegnegna

    Re : scilab besoin d'aide!!

    Merci de m'avoir expliqué le coup du for et du while en même temps.Je comprends mieux maintenant que ça posait problème!
    Merci aussi pour le petit récapitulatif!

    J'ai encore un petit souci car en faisant le programme je rencontre un problème pour le dernier terme.Si a>=u(n) je fais n=n+1 et le problème c'est que je n'ai pas de u(n+1) donc je sais pas trop comment le rajouter dans le programme.

    Merci encore!

  12. #8
    Edelstein

    Re : scilab besoin d'aide!!

    Exact,

    du coup il te faut modifier la condition dans ton while : c'est tant que u(i) <= a ET que i <= n. du coup ton while doit devenir comme suit (le & représente le ET logique en scilab)

    while ( i <= n & u(i) <= a)

    Que se passe-t-il alors, dans le cas où a est plus grand que toutes les composantes de u? Comme d'habitude jusqu'à i = n : à i = n, on entre encore dans la boucle while. On fait v(n)= u(n) et i vaut maintenant n+1. On évalue la condition d'arrêt du while : i est plus grand que n donc on sort. L'expression suivante est v(i) = a avec i = n+1 donc pas de problème. Puis dans ton for, tu fais pour j allant de n+1 à n, c'est par définition une boucle vide donc il ne se passera rien et tu as bien ce que tu voulais.

    rq : Une petite subtilité importante:
    while ( i <= n & u(i) <= a)
    fonctionne mais pas
    while (u(i) <= a & i <=n)
    En effet, scilab évalue ton expression booléenne de gauche à droite et ici dès qu'il a testé i<=n et que c'est faux, il sait déjà que le résultat de la condition sera fausse, donc pas besoin de regarder l'autre membre "u(i)<=a".Ca s'appelle l'évalation paresseuse si cela t'intéresse.
    En résumé, s'il évalue d'abord i <=10, pas de problème. Par contre, s'il évalue u(n+1) <=a avant, il y aura, comme tu dis un couac.

    Voilà, maintenant, tout devrait être clair pour toi!

    Cdlt,

  13. #9
    gnegnegna

    Re : scilab besoin d'aide!!

    Encore merci..Je comprends mieux et en plus je me demandais comment faire le "et" en scilab!
    Est ce que je peux me permettre une autre question??
    j'ai un exo sur les resolutions d'équations.
    J'en avais une d'inconnue x et donc j'ai réussi mais là j'ai une seule équation à 2 inconnues:
    x^2+y^2 -3x+y+5/2=0

    alors je voulais faire un truc du genre

    deff('[z]=f(x,y)','z=x^2+y^2-3*x+y+5/2'),fsolve(0,f)

    mais ça me dit que ça connait pas y..et puis je comprends pas trop ce que je dois mettre après le fsolve( est ce que le 0 veut dire que je veux que l'équation soit égale à 0?

    merci merci merci

  14. #10
    Edelstein

    Re : scilab besoin d'aide!!

    Pour la syntaxe sous scilab, comme je te l'ai dit, je ne m'en rappelle plus bien. Deja que je ne me souvenais guère de la syntaxe des boucles! Je ne vais pas pouvoir t'aider là-dessus et te conseille d'ouvrir un autre topic ou de chercher directement sur google une indication sur cette fonction. Bon courage!

    Cdlt,

  15. #11
    Hiruma

    Re : scilab besoin d'aide!!

    Salut

    Bon, déjà je sais que tu as ce devoir à rendre en LM206 pour vendredi.

    Malheureusement, dans ce module, on attends de toi que tu n'utilises pas de boucle (en particulier "for"), car il s'agit d'un logiciel de calcul matriciel. On peut s'en passer dans cette question. Autre chose, dans l'énoncé, on ne précise pas s'il s'agit d'un vecteur ligne ou d'un vecteur colonne, donc attention.

    Pour ta deuxième question, tout d'abord, je t'invite à travailler cette équation "à la main". De plus, tu peux toujours isoler "y" pour utiliser les fonction Scilab deff et fsolve.

    Voila, bon courage.

  16. #12
    gnegnegna

    Re : scilab besoin d'aide!!

    J'avoue tout c'est du LM206 mais j'ai posé que 2questions sur toute la feuille!
    Et là tu viens de me creer un nouveau problème avec le fait qu'on ne sache pas si c'est un vecteur ligne ou colonne...mince! J'avais pris cette matière pour progresser mais je ne fais que m'arracher les cheveux!!!!

    En fait je l'ai résolue à la main mais j'ai du mal à le faire sur scilab.je l'ai factorisé et ça me donne un truc du genre (X-A)^2+(Y+B)^2=0 donc j'ai la réponse à la main!
    Mais si j'isole Y (càd Y=..) et que je fais fsolve ça me donnera Y=0 et le X mais je ne veux pas obligatoirement Y=0

    Merci

  17. Publicité
  18. #13
    gnegnegna

    Re : scilab besoin d'aide!!

    voilà ce que je fais et je ne comprends pas l'erreur!

    -->deff('z=equa(x,y)','z=(x-3/2)^2+(y+1/2)^2')

    -->p=fsolve([0,0],equa)
    !--error 4
    Variable non définie: y

    at line 2 of function equa called by :
    p=fsolve([0,0],equa)

  19. #14
    gnegnegna

    Re : scilab besoin d'aide!!

    ah oui petite question encore
    il faut que je l'envoie en format texte.ça veut dire quoi?

  20. #15
    Hiruma

    Re : scilab besoin d'aide!!

    Je suppose que le prof attends un script avec une extension .sce, sinon laisse un fichier.txt, il se débrouillera.

  21. #16
    Hiruma

    Re : scilab besoin d'aide!!

    oulala non, la fonction deff ne fonctionne pas comme ça. Je t'invite à regarder la correction de l'exercice 2 du cours 8. Tu verras qu'il faut travailler avec des vecteur en posant par exemple (dans ta tête par sur scilab) u(1) = x et u(2) = y. Donc ne travail qu'avec des u(1) et des u(2), c'est à dire des composante d'un vecteur u.

    Pour fsolve, il me semble que le vecteur initial doit être un vecteur colonne et non un vecteur ligne.

Discussions similaires

  1. Besoin d'aide pour une étude (besoin de réponses)
    Par qqunquipasseparla dans le forum TPE / TIPE et autres travaux
    Réponses: 0
    Dernier message: 06/03/2010, 13h47
  2. Besoin d'aide car je débute sur scilab
    Par guizmo77370 dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 26/05/2009, 02h25
  3. SciLaB - Lagrangien & Hamiltonien - Besoin d'aide...
    Par Lagrangien3 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 04/02/2009, 17h12
  4. Réponses: 4
    Dernier message: 06/12/2008, 22h37