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:
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
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
z étant mon vecteur des coefficient et t mon vecteur nodal
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
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.
Partager