Aide sur matlab
Résolu/Fermé
A voir également:
- Interpolation de lagrange matlab
- Wifipass lagrange - Forum Matlab
- Interpolation linéaire excel - Forum Excel
- Interpolation linéaire excel ✓ - Forum Excel
- Formate de menace interpol ✓ - Forum Vos droits sur internet
- Interpolation dans excel avec intervalles non constants ✓ - Forum Excel
34 réponses
Sacabouffe
Messages postés
9427
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 835
14 mai 2008 à 00:44
14 mai 2008 à 00:44
Salut
Tout d'abord, fais un tour ici.
A plus
Tout d'abord, fais un tour ici.
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
Sacabouffe
Messages postés
9427
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 835
14 mai 2008 à 18:53
14 mai 2008 à 18:53
Salut
De rien, ça m'arrange aussi de t'aider. J'avais pas de programme pour calculer le polynôme d'interpolation de Lagrange. Maintenant il est fait, il pourra toujours resservir :-)))
Pour ton truc, c'est tout à fait normal, il y a au moins 3 bonnes raisons.
1) Les polynômes d'interpolation de Lagrange c'est pas le top quand il y a beaucoup de points d'interpolation: phénomène de Runge (oscillations des polynômes autour de la fonction).
https://fr.wikipedia.org/wiki/Ph%C3%A9nom%C3%A8ne_de_Runge
2) Pour que la norme d'une fonction moins son polynôme d'interpolation de Lagrange sur un intervalle converge vers 0 quand le nombre de points d'interpolation converge vers l'infini, il faut que la fonction soit assez régulière et que ses dérivées successives n'aient pas une norme qui croit trop rapidement.
https://math-linux.com/mathematiques/interpolation/article/interpolation-polynomiale-de-type-lagrange (voir la partie Erreur d'interpolation de Lagrange)
Sinon... pas génial...
3) Quand tu calcules l'intégrale de la fonction polynomiale, si tu prends tes 24 points d'interpolation, tu as à évaluer des nombres du type 20^23 (ton intervalle est [-1,20] et ton polynôme est de degré 23). Avec des valeurs comme celles-ci, les erreurs numériques sont importantes. Et une somme de tels nombres qui doit normalement donner 200 pourra facilement donner n'importe quoi. Il suffit de faire par exemple (20^23+200)-20^23 pour s'en rendre compte. La somme te donne 0 tout simplement.
Solutions:
1) Le premier point peut-être évité en utilisant les nœuds de Tchebychev pour l'interpolation.
https://en.wikipedia.org/wiki/Chebyshev_nodes
Ou en utilisant des splines comme tu l'as fait.
2) Le deuxième, il y a pas grand chose à y faire, si la fonction est pourrie, elle est pourrie :-D
3) Diminuer le degré des polynômes d'interpolation, c'est-à-dire diminuer le nombre de points d'interpolation.
Mais dans ton cas, c'est le point 3 qui prédomine à mon avis.
Tu l'as probablement fait, mais si t'essaies avec 3 fois moins de points d'interpolation, c'est-à-dire
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:
Voilà...
Et tu peux tutoyer les gens de ce forum je pense. Je doute que quiconque ici te reprochera de le faire.
A plus
De rien, ça m'arrange aussi de t'aider. J'avais pas de programme pour calculer le polynôme d'interpolation de Lagrange. Maintenant il est fait, il pourra toujours resservir :-)))
Pour ton truc, c'est tout à fait normal, il y a au moins 3 bonnes raisons.
1) Les polynômes d'interpolation de Lagrange c'est pas le top quand il y a beaucoup de points d'interpolation: phénomène de Runge (oscillations des polynômes autour de la fonction).
https://fr.wikipedia.org/wiki/Ph%C3%A9nom%C3%A8ne_de_Runge
2) Pour que la norme d'une fonction moins son polynôme d'interpolation de Lagrange sur un intervalle converge vers 0 quand le nombre de points d'interpolation converge vers l'infini, il faut que la fonction soit assez régulière et que ses dérivées successives n'aient pas une norme qui croit trop rapidement.
https://math-linux.com/mathematiques/interpolation/article/interpolation-polynomiale-de-type-lagrange (voir la partie Erreur d'interpolation de Lagrange)
Sinon... pas génial...
3) Quand tu calcules l'intégrale de la fonction polynomiale, si tu prends tes 24 points d'interpolation, tu as à évaluer des nombres du type 20^23 (ton intervalle est [-1,20] et ton polynôme est de degré 23). Avec des valeurs comme celles-ci, les erreurs numériques sont importantes. Et une somme de tels nombres qui doit normalement donner 200 pourra facilement donner n'importe quoi. Il suffit de faire par exemple (20^23+200)-20^23 pour s'en rendre compte. La somme te donne 0 tout simplement.
Solutions:
1) Le premier point peut-être évité en utilisant les nœuds de Tchebychev pour l'interpolation.
https://en.wikipedia.org/wiki/Chebyshev_nodes
Ou en utilisant des splines comme tu l'as fait.
2) Le deuxième, il y a pas grand chose à y faire, si la fonction est pourrie, elle est pourrie :-D
3) Diminuer le degré des polynômes d'interpolation, c'est-à-dire diminuer le nombre de points d'interpolation.
Mais dans ton cas, c'est le point 3 qui prédomine à mon avis.
Tu l'as probablement fait, mais si t'essaies avec 3 fois moins de points d'interpolation, c'est-à-dire
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
J'ai comme donnee 24 points x(i) et 24 point y(i).... dont j'ai pas la fonction reliant x a y
j'ai besoin d'ecrire un programme en matlab me donnant en retour le polynome interpolant en utilisant la methode de lagrange...
merci
j'ai besoin d'ecrire un programme en matlab me donnant en retour le polynome interpolant en utilisant la methode de lagrange...
merci
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Sacabouffe
Messages postés
9427
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 835
19 mai 2008 à 01:47
19 mai 2008 à 01:47
Salut
La valeur de l'intégrale c'est u(20)-u(-1) où u'=f.
Pour le code, tu remplaces x par les points de discrétisation xi, y par les valeurs de la fonction aux points xi, c'est-à-dire yi. f0, c'est la condition initiale, c'est-à-dire -1.751.
Le nombre de points xi et yi doit être impair.
A plus
La valeur de l'intégrale c'est u(20)-u(-1) où u'=f.
Pour le code, tu remplaces x par les points de discrétisation xi, y par les valeurs de la fonction aux points xi, c'est-à-dire yi. f0, c'est la condition initiale, c'est-à-dire -1.751.
Le nombre de points xi et yi doit être impair.
A plus
Bonjour,
J'ai récupéré des données telles, longitude et latitude de points dans un fichier .dat, et désormais je dois les lires avec matlab pour pouvoir les placer sur un graphique.
Je sais qu'il faut que j'utilise dans un premier temps la fonctions textscan, mais je n'arrive même pas à la tester sur un fichier pipo.txt.
voila mon fichier pipo.txt:
Sally Type1 12.34 45 1.23e10 inf NaN Yes\par
Joe Type2 23.54 60 9e19 -inf 0.001 No\par
Bill Type3 34.90 12 2e5 10 100 No\par
et voici ma commande:
fid = fopen('pipo.txt');
C = textscan(fid,'%s%s%f32%d8%u%f%f%s');
fclose(fid);
voila le message que l'on me renvoie,
??? Error using ==> textscan
Invalid fid.
Je ne comprend pas, pouvez vous m'expliquer, merci
J'ai récupéré des données telles, longitude et latitude de points dans un fichier .dat, et désormais je dois les lires avec matlab pour pouvoir les placer sur un graphique.
Je sais qu'il faut que j'utilise dans un premier temps la fonctions textscan, mais je n'arrive même pas à la tester sur un fichier pipo.txt.
voila mon fichier pipo.txt:
Sally Type1 12.34 45 1.23e10 inf NaN Yes\par
Joe Type2 23.54 60 9e19 -inf 0.001 No\par
Bill Type3 34.90 12 2e5 10 100 No\par
et voici ma commande:
fid = fopen('pipo.txt');
C = textscan(fid,'%s%s%f32%d8%u%f%f%s');
fclose(fid);
voila le message que l'on me renvoie,
??? Error using ==> textscan
Invalid fid.
Je ne comprend pas, pouvez vous m'expliquer, merci
bonjour tt le monde.j'ai besoin de votre aide pr résoudre 2 exercices en mathlab
ex1
x1=sin(ax1+bx2)
x2=cos(ax1-bx2)
*1)ecrire le programme (point fixe et newton)
2)tracer la courbe en fonction des itérations
ex2
1) donner le polynome de lagrange d'ordre 2 des fonctions suivant ds l'interval [-1,1];[-5,5]
*2) donner la fonction matlab qui permet de calculer le polynome de lagrange pour une fonction donne
3) tracer le graphe de polynome de lagrange et la fonction pour chaque fonction
*exp(x)
*1/(1-x^2)
*abs[x-1/2
je vous en serais reconnaissante.
merci d'avance.
ex1
x1=sin(ax1+bx2)
x2=cos(ax1-bx2)
*1)ecrire le programme (point fixe et newton)
2)tracer la courbe en fonction des itérations
ex2
1) donner le polynome de lagrange d'ordre 2 des fonctions suivant ds l'interval [-1,1];[-5,5]
*2) donner la fonction matlab qui permet de calculer le polynome de lagrange pour une fonction donne
3) tracer le graphe de polynome de lagrange et la fonction pour chaque fonction
*exp(x)
*1/(1-x^2)
*abs[x-1/2
je vous en serais reconnaissante.
merci d'avance.
Sacabouffe
Messages postés
9427
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 835
21 mars 2008 à 22:10
21 mars 2008 à 22:10
Salut
Utilise un des ode solvers de Matlab.
A plus
Utilise un des ode solvers de Matlab.
A plus
merci sacabouffe, c'est gentil
hehe, programme du lycee... peut etre...
je suis ingenieur et je porte un double bac dont le bac francais, mais les math, j'aime pas :P
mercii... ce pendant cette interpolation donne des valeurs trop lointe des valeurs experimentales... en certains points, essentiellement les point >17 ...et de meme le calcul d'integrale
les donnees que j'ai sont les suivantes
xi=[-1.000, -0.5000, -0.11, 0.27, 0.95, 1, 1.5, 1.99, 2.82, 3.05, 4.01, 4.28, 4.95, 5.31, 6.11, 7.92, 9.21, 10.57, 11.05, 12.41, 13.62, 16.27, 19.02, 20];
yi=[-1.751, -1.4376, -0.887, -0.7118, 0.1748, 0.249, 1.0574, 1.9643, 3.7449, 4.2891, 6.7715, 7.524, 9.4753, 10.564, 13.049, 18.667, 22.221, 25.013, 25.667, 26.194, 24.584, 11.375, -22.411, -41.0];
et le calcul d'integrale en utilisant la methode de trapeze 1erement pour les point xi, donne une valeur = 195.3640...alors qu'en utilisant la spline curviline(interpolation) pour un pas de 0.01--> integrale = 205.2498
la valeur exacte etant 205.2497999
en integrant el polynome de langrange obtenu j'obtients 8.3598e+017...
y'a t'il une explication ??? est-ce logique...
merci bcp pour l'aide il semble qu vous etes assez bon en math et matlab :)
hehe, programme du lycee... peut etre...
je suis ingenieur et je porte un double bac dont le bac francais, mais les math, j'aime pas :P
mercii... ce pendant cette interpolation donne des valeurs trop lointe des valeurs experimentales... en certains points, essentiellement les point >17 ...et de meme le calcul d'integrale
les donnees que j'ai sont les suivantes
xi=[-1.000, -0.5000, -0.11, 0.27, 0.95, 1, 1.5, 1.99, 2.82, 3.05, 4.01, 4.28, 4.95, 5.31, 6.11, 7.92, 9.21, 10.57, 11.05, 12.41, 13.62, 16.27, 19.02, 20];
yi=[-1.751, -1.4376, -0.887, -0.7118, 0.1748, 0.249, 1.0574, 1.9643, 3.7449, 4.2891, 6.7715, 7.524, 9.4753, 10.564, 13.049, 18.667, 22.221, 25.013, 25.667, 26.194, 24.584, 11.375, -22.411, -41.0];
et le calcul d'integrale en utilisant la methode de trapeze 1erement pour les point xi, donne une valeur = 195.3640...alors qu'en utilisant la spline curviline(interpolation) pour un pas de 0.01--> integrale = 205.2498
la valeur exacte etant 205.2497999
en integrant el polynome de langrange obtenu j'obtients 8.3598e+017...
y'a t'il une explication ??? est-ce logique...
merci bcp pour l'aide il semble qu vous etes assez bon en math et matlab :)
wow...
merci beaucoup sacabouffe,,,
tu es une vraie encyclopedie vivante en mathematique et matlab....
genial!!
merci beaucoup sacabouffe,,,
tu es une vraie encyclopedie vivante en mathematique et matlab....
genial!!
Sacabouffe
Messages postés
9427
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 835
15 mai 2008 à 01:25
15 mai 2008 à 01:25
:-DDD
De rien...
Matlab, je commence un peu à connaître. Pour les maths, je connaissais pas tout ça par cœur, j'ai recherché des liens à partir de différents souvenirs que j'avais.
Bonne nuit
De rien...
Matlab, je commence un peu à connaître. Pour les maths, je connaissais pas tout ça par cœur, j'ai recherché des liens à partir de différents souvenirs que j'avais.
Bonne nuit
bonjour,
Sacabouffe t'es vraiment modeste :)
j'ai encore bcp de questions si sa ne t'emmerde pas....
Je voudrais trouver ces noeuds de Tchebichev dont tu m'as dis par Matlab
Puis determiner la derivee premiere de la fonction de la fonction (non le polynome) sur -1,20 (MATLAB)
Puis trouver les racines si elles existes sur -1,20 par Newton et Lagranage (MATLAB)
et enfin trouver la droite de regression qui rapproche (xi,yi) (MATLAN)
J'espere que tu m'aide de tes connaissance et que ca ne fera pas bcp de soucis :)
Merci :D
Sacabouffe t'es vraiment modeste :)
j'ai encore bcp de questions si sa ne t'emmerde pas....
Je voudrais trouver ces noeuds de Tchebichev dont tu m'as dis par Matlab
Puis determiner la derivee premiere de la fonction de la fonction (non le polynome) sur -1,20 (MATLAB)
Puis trouver les racines si elles existes sur -1,20 par Newton et Lagranage (MATLAB)
et enfin trouver la droite de regression qui rapproche (xi,yi) (MATLAN)
J'espere que tu m'aide de tes connaissance et que ca ne fera pas bcp de soucis :)
Merci :D
Sacabouffe
Messages postés
9427
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 835
15 mai 2008 à 16:00
15 mai 2008 à 16:00
Salut rawad25
Non, non, t'inquiète, ça m'emmerde pas. Par contre, je te réponds un peu plus tard ou demain avec plus de détails si les trucs que j'écris ici te suffisent pas. Donc, vite fait pour le moment...
Pour les nœuds de Tchebychev, je pense que tu peux arriver à te débrouiller, il y a l'expression de ces nœuds dans la section Notes sur le lien Wikipédia:
https://en.wikipedia.org/wiki/Chebyshev_nodes#Notes
Pour la dérivée première, tu utilises la formule de Taylor pour l'approcher. La dérivée f'(x(i)) en un point de discrétisation x(i), c'est à peu près (f(x(i+1))-f(x(i)))/(x(i+1)-x(i)). Ça marche bien si ton pas de discrétisation est pas trop grand.
Pour rechercher les zéros d'une fonction, tu peux aussi essayer la fonction fzero de Matlab. Si tu cherches les zéros de la dérivée, tu cherches donc les extrema de la fonction, dans ce cas tu peux essayer fminbnd. Mais tout ça, c'est quand t'as une formule explicite pour ta fonction.
Dans ton cas, effectivement, il vaut peut-être mieux utiliser autre chose. La méthode de Newton s'implémente vite, tu devrais y arriver, tu peux essayer aussi d'autres méthodes:
https://fr.wikipedia.org/wiki/Algorithme_de_recherche_d%27un_z%C3%A9ro_d%27une_fonction
Par contre, pour la droite de régression, je comprends pas, ta courbe ressemble pas du tout à une droite, pourquoi tu veux l'approcher par une droite?
Dis-moi les points que tu veux que je détaille, les trucs que t'arrives pas à faire tout seul, etc... Je te répondrai plus tard.
A plus
Non, non, t'inquiète, ça m'emmerde pas. Par contre, je te réponds un peu plus tard ou demain avec plus de détails si les trucs que j'écris ici te suffisent pas. Donc, vite fait pour le moment...
Pour les nœuds de Tchebychev, je pense que tu peux arriver à te débrouiller, il y a l'expression de ces nœuds dans la section Notes sur le lien Wikipédia:
https://en.wikipedia.org/wiki/Chebyshev_nodes#Notes
Pour la dérivée première, tu utilises la formule de Taylor pour l'approcher. La dérivée f'(x(i)) en un point de discrétisation x(i), c'est à peu près (f(x(i+1))-f(x(i)))/(x(i+1)-x(i)). Ça marche bien si ton pas de discrétisation est pas trop grand.
Pour rechercher les zéros d'une fonction, tu peux aussi essayer la fonction fzero de Matlab. Si tu cherches les zéros de la dérivée, tu cherches donc les extrema de la fonction, dans ce cas tu peux essayer fminbnd. Mais tout ça, c'est quand t'as une formule explicite pour ta fonction.
Dans ton cas, effectivement, il vaut peut-être mieux utiliser autre chose. La méthode de Newton s'implémente vite, tu devrais y arriver, tu peux essayer aussi d'autres méthodes:
https://fr.wikipedia.org/wiki/Algorithme_de_recherche_d%27un_z%C3%A9ro_d%27une_fonction
Par contre, pour la droite de régression, je comprends pas, ta courbe ressemble pas du tout à une droite, pourquoi tu veux l'approcher par une droite?
Dis-moi les points que tu veux que je détaille, les trucs que t'arrives pas à faire tout seul, etc... Je te répondrai plus tard.
A plus
merci beaucoup, tout d'abord c'est vraiment trop gentil... tu es pour moi maitnenant mon einstein :P vraiment......
meme si tu ne connais pas tout ca par coeur m'ais tu es une personne qui sait quoi faire....
le noeuds de chebichev ca a marche, facile... pas ci complique
Pour la droite de regression c'est en effect quelquechose de demandé "droite de regression qui approche les donnees xi, f(xi)"... si sa ne te cause pas trop de soucis de me donner un code matlab...
J'ai pas bien compris comment determiner numeriquement la derive premiere et comment l'implementer sur Matlab
Enfin pusique la methode de newton est facile comme tu m'as dis j'esserai de la faire et si je n'arrive pas je te demandrais l'aide encore une fois :)
Merci beacoup.... ton aide es vraiment utile et je l'apperci :)
A plus
meme si tu ne connais pas tout ca par coeur m'ais tu es une personne qui sait quoi faire....
le noeuds de chebichev ca a marche, facile... pas ci complique
Pour la droite de regression c'est en effect quelquechose de demandé "droite de regression qui approche les donnees xi, f(xi)"... si sa ne te cause pas trop de soucis de me donner un code matlab...
J'ai pas bien compris comment determiner numeriquement la derive premiere et comment l'implementer sur Matlab
Enfin pusique la methode de newton est facile comme tu m'as dis j'esserai de la faire et si je n'arrive pas je te demandrais l'aide encore une fois :)
Merci beacoup.... ton aide es vraiment utile et je l'apperci :)
A plus
Sacabouffe
Messages postés
9427
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 835
15 mai 2008 à 22:21
15 mai 2008 à 22:21
Salut
Ton Einstein :-DDD
Ouhla!!! Faut pas pousser non plus...
Ce qui est cool avec toi, c'est que tu cherches aussi par toi même.
Si ça marche pour Tchebychev, tant mieux.
Pour la droite de régression, tu vas pas avoir à te fatiguer beaucoup, il y a une fonction Matlab qui fait les choses pour toi.
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.
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
Ton Einstein :-DDD
Ouhla!!! Faut pas pousser non plus...
Ce qui est cool avec toi, c'est que tu cherches aussi par toi même.
Si ça marche pour Tchebychev, tant mieux.
Pour la droite de régression, tu vas pas avoir à te fatiguer beaucoup, il y a une fonction Matlab qui fait les choses pour toi.
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
Sacabouffe
Messages postés
9427
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 835
16 mai 2008 à 04:06
16 mai 2008 à 04:06
Encore un tout petit message vite fait...
D'ailleurs je connaissais pas la fonction polyfit de Matlab, je viens de la découvrir aujourd'hui.
Mais pour le coup, pour trouver le polynôme d'interpolation de Lagrange, pas la peine de se prendre la tête avec le programme que j'avais écrit.
Et hop! C'est fini... :-DDD
Tu vois? Je suis loin d'être une encyclopédie!!!
Bonne nuit
D'ailleurs je connaissais pas la fonction polyfit de Matlab, je viens de la découvrir aujourd'hui.
Mais pour le coup, pour trouver le polynôme d'interpolation de Lagrange, pas la peine de se prendre la tête avec le programme que j'avais écrit.
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
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 :)
Vraiment tu m'aides trop et t'es gentil et j'espere un jour que je pourrais t'aider, peut etre si un jour tu aura besoin d'aide en vb, database ou autre language de programmation, je pourrais rendre service :) ... je ne sais pas si peut etre tu es aussi bon en ca mais juste je voulais passer se message comme remerciment :) .. car le matlab c'est pas vraiment ma specialite :P ni les math... par contre je pourrais aitre utile dans d'autre domaines :)
tout d'abord pour le polyfit c'est bon mais je pense que ca utilise la methode des moindres carrees (et dans les autres cas j'avais besoin de langrage) et en tout cas sa fonctionne bien :)
ma droite de regression est faite :)
les noeuds de tchebichev c'est genial :)
cependant en appliquant le code pour la derivee en appelant la fonction par les arguments (xi,yi) j'ai obtenu en resultat un vecteur d'ordre 22 est-ce le polynome qui represente la derivee ? avec des pussiances decroissantes an (allant de x^21 a x^0 (1) ??
ou plus concretement est-ce la derivee est
0.9708x^21 +0.9426x^20 +1.0017x^19 +1.3162x^18 +1.6047x^17 +1.7326x^16 +2.0360x^15 +2.1932x^14 +2.5434x^13 +2.6300x^12 +2.8764x^11 +2.9515x^10 +3.0808x^9 +3.1046x^8 +2.9587x^7 +2.3947x^6 +1.8728x^5 +0.6418x^4 -0.4214x^3 -3.8391x^2 -8.7028x -14.0416 ??
d'autre part j'ai arriver pour newton la difficulte que je trouve est que je veux appliquer newton pour ma fonction definie point par point... j'arrive pas a l'implementer sur matlab malgres que j'essaie...
merci d'avance de me repondre sur ses deux point mon prof saccaboufe :)
Vraiment tu m'aides trop et t'es gentil et j'espere un jour que je pourrais t'aider, peut etre si un jour tu aura besoin d'aide en vb, database ou autre language de programmation, je pourrais rendre service :) ... je ne sais pas si peut etre tu es aussi bon en ca mais juste je voulais passer se message comme remerciment :) .. car le matlab c'est pas vraiment ma specialite :P ni les math... par contre je pourrais aitre utile dans d'autre domaines :)
tout d'abord pour le polyfit c'est bon mais je pense que ca utilise la methode des moindres carrees (et dans les autres cas j'avais besoin de langrage) et en tout cas sa fonctionne bien :)
ma droite de regression est faite :)
les noeuds de tchebichev c'est genial :)
cependant en appliquant le code pour la derivee en appelant la fonction par les arguments (xi,yi) j'ai obtenu en resultat un vecteur d'ordre 22 est-ce le polynome qui represente la derivee ? avec des pussiances decroissantes an (allant de x^21 a x^0 (1) ??
ou plus concretement est-ce la derivee est
0.9708x^21 +0.9426x^20 +1.0017x^19 +1.3162x^18 +1.6047x^17 +1.7326x^16 +2.0360x^15 +2.1932x^14 +2.5434x^13 +2.6300x^12 +2.8764x^11 +2.9515x^10 +3.0808x^9 +3.1046x^8 +2.9587x^7 +2.3947x^6 +1.8728x^5 +0.6418x^4 -0.4214x^3 -3.8391x^2 -8.7028x -14.0416 ??
d'autre part j'ai arriver pour newton la difficulte que je trouve est que je veux appliquer newton pour ma fonction definie point par point... j'arrive pas a l'implementer sur matlab malgres que j'essaie...
merci d'avance de me repondre sur ses deux point mon prof saccaboufe :)
salut de nouveau
En effet ce que j'ai pus faire par newton, c'est une fonction qui me calcule une racine
mais ce ci pour deux polynomes que j'entre manuellement dans matlab f(x) et d(fx) , et en passant la cdt initiale comme argument...
mais ce pendant je pense qu'ayant le polynome qui interpole la fonction je peux construire facilement une fonction qui me donne la derivee de f(x), mais est-ce ca la bonne soluntion ? devrais-je utiliser un polynome avec le quel j'ai aprroche ma fonction ?? (par exp polynome de lagrange ou peut etre polynome de lagrange avec les noeuds de tchebichev) ?
merci, a plus
En effet ce que j'ai pus faire par newton, c'est une fonction qui me calcule une racine
mais ce ci pour deux polynomes que j'entre manuellement dans matlab f(x) et d(fx) , et en passant la cdt initiale comme argument...
mais ce pendant je pense qu'ayant le polynome qui interpole la fonction je peux construire facilement une fonction qui me donne la derivee de f(x), mais est-ce ca la bonne soluntion ? devrais-je utiliser un polynome avec le quel j'ai aprroche ma fonction ?? (par exp polynome de lagrange ou peut etre polynome de lagrange avec les noeuds de tchebichev) ?
merci, a plus
Sacabouffe
Messages postés
9427
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
29 mai 2009
1 835
17 mai 2008 à 00:52
17 mai 2008 à 00:52
Salut rawad25!!!
Bon, bon... appelle-moi comme tu veux alors, si ça te fait plaisir... mais ça me fait plaisir aussi, j'avoue... :-DDD
Pour l'aide que tu pourras me fournir, je dois dire qu'elle sera la bienvenue. Pour le moment c'est pas trop possible mais j'aimerais bien retourner au C++ et au Fortran90. Mais en attendant tu peux certainement aider pas mal de gens dans le forum programmation qui attendent impatiemment que tu les fasses profiter de tes compétences. :-)))
Sinon... c'est exact, polyfit(xi,yi,n) ça calcule le polynôme P de degré n qui approche le mieux les valeurs yi aux points xi au sens des moindres carrés. Seulement on voit facilement qu'en choisissant n=size(xi,2)-1, le polynôme en question c'est justement le polynôme d'interpolation de Lagrange, eh oui...
Pour le petit truc que je t'ai donné pour la dérivée, il s'agit pas d'un polynôme... non, non... relis les commentaires dans le code, ça te calcule la dérivée aux points xi(2:end-1) (pour la partie "Centré"). Si tu veux avoir la tête de la dérivée tu fais juste
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
Bon, bon... appelle-moi comme tu veux alors, si ça te fait plaisir... mais ça me fait plaisir aussi, j'avoue... :-DDD
Pour l'aide que tu pourras me fournir, je dois dire qu'elle sera la bienvenue. Pour le moment c'est pas trop possible mais j'aimerais bien retourner au C++ et au Fortran90. Mais en attendant tu peux certainement aider pas mal de gens dans le forum programmation qui attendent impatiemment que tu les fasses profiter de tes compétences. :-)))
Sinon... c'est exact, polyfit(xi,yi,n) ça calcule le polynôme P de degré n qui approche le mieux les valeurs yi aux points xi au sens des moindres carrés. Seulement on voit facilement qu'en choisissant n=size(xi,2)-1, le polynôme en question c'est justement le polynôme d'interpolation de Lagrange, eh oui...
Pour le petit truc que je t'ai donné pour la dérivée, il s'agit pas d'un polynôme... non, non... relis les commentaires dans le code, ça te calcule la dérivée aux points xi(2:end-1) (pour la partie "Centré"). Si tu veux avoir la tête de la dérivée tu fais juste
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
14 mai 2008 à 13:33
tout d'abord j'ai pas compris le but de me rendre vers un link de politesse.... Aurai-je manque de politesse en demandand de l'aide et en disant merci d'avane ?
Deuxiement merci scarabouche mais c'etait pas exactement ce que je voulais...
je voulais une methode de calculer le polynome interpolant ma fonction donee point par point, (24 points) et non les valeurs de ces points...
Une fois ce polynome est calcule, comment integrer ce polynome entre 2 bornes qui sont les bornes inferieur et superieur de xi, merci
14 mai 2008 à 15:39
Oh... le lien... t'en fais pas. C'est juste qu'à première lecture, ton message donnait ce genre d'impression : "Je veux ça, merci".
Mais je te l'accorde, c'est pas toujours facile de savoir comment une personne va interpréter ce qu'on écrit. Enfin bref... tout ça pour dire qu'un petit bonjour lors de ton tout premier message aurait atténué l'idée qu'on s'en faisait au premier abord. En tout cas, désolé d'avoir été un peu sec.
Pour ton problème, ce serait plus vite réglé avec un logiciel de calcul formel comme Maple peut-être. Peu importe...
Pour obtenir le polynôme d'interpolation de Lagrange, il faut multiplier des polynômes entre eux, et c'est là tout le problème, car la comme qui suit ne pose pas de souci.
Le produit de deux polynômes, c'est en fait le produit de convolution de deux vecteurs (vecteurs des coefficients de chaque polynôme). Le problème, c'est qu'apparemment la fonction conv n'a pas d'options pour convoler plus de deux vecteurs à la fois, ou alors je l'ai pas trouvé... Alors ça obligeait à faire le calcul avec une boucle. Utiliser Matlab pour faire des boucles, c'est un peu du gâchis, quand on peut éviter, les programmes tournent plus vite en bossant en matriciel. Du coup comme la convolution c'est rien d'autre qu'un produit dans le domaine de Fourier, je suis passé par une fft puis un ifft. Et il y a pas de boucle...
Le résultat est un vecteur ligne contenant les coefficients du polynôme d'interpolation de Lagrange. Comme d'hab, si P=an*X^n+...+a0, ils sont organisés comme ceci:
[an...a0].
Voilà...
Après, intégrer un polynôme entre deux bornes, c'est du programme de lycée.
A plus