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 :

Créer une B spline en fonction des coefficients


Sujet :

Scilab

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Créer une B spline en fonction des coefficients
    Bonjour à tous,

    J'ai besoin de coder une fonction qui prend en paramètre un vecteur de coefficient et un vecteur nodale et qui me renvoie la valeur de la fonction B-spline (degré 3) ainsi créee en plusieurs points x.

    Pour cela j'ai d'abord créée la fonction BBS qui construit une fonction de base B spline de degré 3:

    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
    function y=BBS(x,a,b,c,d,e)
     
        if x<a then 
            y=0;
        elseif (a<=x) & (x<b) then
            y=((x-a)/(d-a))*((x-a)/(c-a))*((x-a)/(b-a));
        elseif (b<=x) & (x<c) then
            y=((x-a)/(d-a))*((x-a)/(c-a))*((c-x)/(c-b))+((x-a)/(d-a))*((d-x)/(d-b))*((x-b)/(c-b))+((e-x)/(e-b))*((x-b)/(d-b))*((x-b)/(c-b));
        elseif (c<=x) & (x<d) then
            y=((x-a)/(d-a))*((d-x)/(d-b))*((d-x)/(d-c)) +((e-x)/(e-b))*((x-b)/(d-b))*((d-x)/(d-c))+((e-x)/(e-b))*((e-x)/(e-c))*((x-c)/(d-c));
        elseif (d<=x) & (x<e) then
            y=((e-x)/(e-b))*((e-x)/(e-c))*((e-x)/(e-d));
        elseif x>=e then
            y=0;
        end,
    endfunction
    Ensuite je me sers de cette fonction pour creer une fonction B-spline:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function y=BS(x,z,t)
        [lhz,m]=size(z);
        [lht,n]=size(t);
        [lhx,dim]=size(x);
     
        y=zeros(x);
     
        for j=1:dim
        for i=1:m
            y(j)=y(j)+z(i)*BBS(x(j),t(i),t(i+1),t(i+2),t(i+3),t(i+4));
        end
        end
    endfunction
    z étant mon vecteur des coefficient et t mon vecteur nodal
    Le problème est que, quand je test cette fonction sur un vecteur x de données, et que je fais un plot, j'obtiens tout sauf une fonction qui ressemble à une B-spline. J'avoue être un peu perdu et ne sais pas si mon erreur vient de mon code ou d'une mauvaise compréhension des B-spline.
    Si quelqu'un pouvait m'éclaircir, cela m'aiderait beaucoup.

    Merci d'avance du temps que vous y consacrerez. Si je me suis mal fait comprendre n'hésitez pas à me le dire et j'essayerai d'être plus clair

    Cordialement, Mouton.

  2. #2
    Nouveau membre du Club
    Inscrit en
    Juin 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 40
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par MoutonM Voir le message
    Bonjour à tous,

    J'ai besoin de coder une fonction qui prend en paramètre un vecteur de coefficient et un vecteur nodale et qui me renvoie la valeur de la fonction B-spline (degré 3) ainsi créee en plusieurs points x.

    Pour cela j'ai d'abord créée la fonction BBS qui construit une fonction de base B spline de degré 3:
    Bonjour
    je suppose que tu as regardé la fonction spline de Scilab et qu'elle ne te convient pas ?
    par curiosité pourrais tu dire pourquoi ?

    help spline
    ci dessous un code en exemple dans l'aide de spline:

    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
    // example 2 : show behavior of different splines on random data
    a = 0; b = 1;        // interval of interpolation
    n = 10;              // nb of interpolation  points
    m = 800;             // discretization for evaluation
    x = linspace(a,b,n)'; // abscissae of interpolation points
    y = rand(x);          // ordinates of interpolation points
    xx = linspace(a,b,m)';
    yk = interp(xx, x, y, splin(x,y,"not_a_knot"));
    yf = interp(xx, x, y, splin(x,y,"fast"));
    ym = interp(xx, x, y, splin(x,y,"monotone"));
    clf()
    plot2d(xx, [yf ym yk], style=[5 2 3], strf="121", ...
           leg="fast@monotone@not a knot spline")
    plot2d(x,y,-9, strf="000")  // to show interpolation points
    xtitle("Various spline and sub-splines on random data")
    show_window()

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    J'avais besoin de créer une fonction spline en utilisant un vecteur de coefficients dans la base des B-Spline, et non en interpolant des points.

Discussions similaires

  1. Réponses: 9
    Dernier message: 24/03/2007, 22h37
  2. [Débutant] Créer une page HTML qui valide des attributs
    Par sebpsi dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/03/2007, 12h30
  3. Créer une GUI et insérer dynamiquement des objets
    Par nix74 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 25/11/2006, 09h04
  4. Réponses: 5
    Dernier message: 17/07/2006, 18h34
  5. Réponses: 10
    Dernier message: 02/11/2005, 11h12

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