|
|
|
|
Salut
function PX = Lagrange_interpolate(x,y,X) n=size(x,2); m=size(X,2); [prodx mx]=meshgrid(x); prodx=prodx-mx;clear mx; prodx(1:n+1:n^2)=1; prodx=prod(prodx); prodx=repmat(prodx,1,m); X=reshape(repmat(X,n^2,1),n,n*m); x=repmat(x.',1,n*m); Xmx=X-x;clear x X; Xmx(reshape(repmat((1:n+1:n^2).',1,m)+repmat(n^2*(0:m-1),n,1),n*m,1))=1; PX=prod(Xmx)./prodx;clear Xmx prodx; y=repmat(y,1,m); PX=y.*PX;clear y; PX=reshape(PX,n,m); PX=sum(PX); A plus Some folks are born made to wave the flag, ooo, they're red, white and blue. And when the band plays "Hail to the Chief", ooo, they point the cannon at you, y'all!
|
Merci sacabouffe, c'est gentil
|
Salut
P=coefficients_Lagrange_interpolate(xi(1:3:24),yi(1:3:24)); integrale_polynom(P,-1,20) Tu obtiens 205.2546080953784 Par contre, j'ai modifié un petit truc dans le calcul du polynôme d'interpolation de Lagrange. Pour n points, on obtenait un vecteur de longueur n+1, c'est-à-dire un polynôme de degré n. Le coefficient an était censé être nul, mais avec les erreurs numériques, il l'était pas tout à fait des fois. Du coup je propose plutôt ça: function P = coefficients_Lagrange_interpolate(x,y) n=size(x,2); P=[ones(n,1) -x.']; P=repmat(P,[1 1 n]); P(1:2*n+1:2*n^2)=1; P(n+1:2*n+1:2*n^2)=0; P=fft(P,n,2); P=prod(P); P=ifft(P,[],2); P=squeeze(P); [x mx]=meshgrid(x); x=x-mx;clear mx; x(1:n+1:n^2)=1; x=y./prod(x); P=P*x.'; P=P.'; Voilà... Et tu peux tutoyer les gens de ce forum je pense. Je doute que quiconque ici te reprochera de le faire. A plus Some folks are born made to wave the flag, ooo, they're red, white and blue. And when the band plays "Hail to the Chief", ooo, they point the cannon at you, y'all! |
Répondre à rawad25
|
Bonjour,
|
Salut rawad25
|
Merci beaucoup, tout d'abord c'est vraiment trop gentil... tu es pour moi maitnenant mon einstein :P vraiment......
|
Salut
polyfit(x,f,1) Et hop! T'as la droite de régression :-D Par contre, vu que ta courbe est loin d'être une droite, je vois pas trop ce que tu vas pouvoir faire de ta droite de régression. Pour la dérivée, ben tu sais que f'(x)=lim (f(x+h)-f(x))/h h->0, c'est ça que t'utilises pour calculer la dérivée de manière approchée. Voilà les quelques lignes qui calculent la dérivée. function fprime = compute_derivative(x,f) %% Décentré à droite %% Dérivée calculée pour x(1:end-1) % xp = circshift(x,[0 -1]); % fp = circshift(f,[0 -1]); % fprime = (fp(1:end-1)-f(1:end-1))./(xp(1:end-1)-x(1:end-1)); %% Décentré à gauche %% Dérivée calculée pour x(2:end) % xm = circshift(x,[0 1]); % fm = circshift(f,[0 1]); % fprime = (fm(2:end)-f(2:end))./(xm(2:end)-x(2:end)); %% Centré %% Dérivée calculée pour x(2:end-1) xp = circshift(x,[0 -1]); xm = circshift(x,[0 1]); fp = circshift(f,[0 -1]); fm = circshift(f,[0 1]); fprime = (fp(2:end-1)-fm(2:end-1))./(xp(2:end-1)-xm(2:end-1)); J'ai mis 3 possibilités, tu choisiras celle que tu veux (je note les indices entre parenthèses) en décommentant la partie voulue. Décentré à droite, on utilise la formule f(x(i))≈(f(x(i+1))-f(x(i)))/(x(i+1)-x(i)) Décentré à gauche, on utilise la formule f(x(i))≈(f(x(i))-f(x(i-1)))/(x(i)-x(i-1)) Centré, on utilise la formule f(x(i))≈(f(x(i+1))-f(x(i-1)))/(x(i+1)-x(i-1)) Là le petit bout de bidule est fait pour le cas général, mais si tu utilises une discrétisation régulière, c'est-à-dire si x(i+1)-x(i) est indépendant de i, tu peux simplifier en petit peu les quelques lignes. Tu me diras si t'as réussi pour la méthode de Newton. Par contre, si le terme initial utilisé pour ta méthode itérative est trop loin du zéro de la fonction, la méthode convergera pas. Bonne nuit Some folks are born made to wave the flag, ooo, they're red, white and blue. And when the band plays "Hail to the Chief", ooo, they point the cannon at you, y'all! |
Encore un tout petit message vite fait...
P=polyfit(xi,yi,size(xi,2)-1); Et hop! C'est fini... :-DDD Tu vois? Je suis loin d'être une encyclopédie!!! Bonne nuit Some folks are born made to wave the flag, ooo, they're red, white and blue. And when the band plays "Hail to the Chief", ooo, they point the cannon at you, y'all! |
Tout d'abord meci pour tes messages si je ne vais pas t'appeler mon enstein on moins mon professeur semble etre "fair" et juste :)
|
Salut de nouveau
|
Salut rawad25!!!
fprime=compute_derivative(xi,yi); plot(xi(2:end-1),fprime); et voilà... Pour trouver les zéros de la fonction, il y a plus simple que la méthode de Newton. Je m'explique... 1) Tu pars de la première valeur yi(1). Dans les données que tu m'as écrites, elle est négative. 2) Tu testes les valeurs suivantes yi(2), yi(3), etc... pouf! Dès que ça change de signe, ça veut dire que ta courbe a coupé l'axe des abscisses. Tu prends la demi-somme entre la valeur où c'était négatif et celle où ça devient positif et t'as un zéro (à peu près). 3) Tu recommences à partir de la dernière valeur. Inconvénient: Si c'est un zéro où la fonction admet un extremum local, ça marche plus, comme par exemple x -> x², elle s'annule sans changer de signe. Tu peux aussi utiliser le polynôme d'interpolation de Lagrange, il y a une fonction Matlab qui donne les racines d'un polynôme P, c'est roots(P). Par contre, si c'est les zéros de la dérivée que tu dois trouver, utiliser le polynôme d'interpolation de Lagrange, je suis pas sûr que ce soit une bonne idée, même en utilisant les nœuds de Tchebychev... En utilisant les nœuds de Tchebychev, il y a déjà plus de chances pour que ta fonction soit bien approchée par les polynômes d'interpolation de Lagrange, mais de là à dire que la dérivée de la fonction est bien approchée par la dérivée des polynômes... ben... pas sûr du tout... Si t'arrives pas à coder les points 1 et 2, dis-moi, je te donnerai ça. A plus Some folks are born made to wave the flag, ooo, they're red, white and blue. And when the band plays "Hail to the Chief", ooo, they point the cannon at you, y'all! |
Salutt profff :)
|
Eheh... salut!
|