Aide sur matlab

Résolu
Bonjour,

Je dois écrire un programme pour résoudre des équations différentielles du premier et du second ordre sur matlab, mais je n'y connais strictement rien, pourriez-vous m'aider s'il vous plait ?

Merci.
Configuration: Windows XP
Firefox 2.0.0.11

34 réponses

Résumé de la discussion

Des utilisateurs cherchent à écrire un programme MATLAB pour interpoler des données via la méthode de Lagrange et à comprendre les limites numériques qui en découlent. Plusieurs éléments de réponse abordent les enjeux de stabilité numérique, le phénomène de Runge et les bénéfices des nœuds de Chebyshev ou des splines pour limiter les oscillations. Des participants proposent des scripts et des méthodes pour calculer les coefficients de Lagrange, comparer les résultats et proposer des alternatives lorsque le degré du polynôme devient problématique. Enfin, des ressources en ligne citées incluent des pages sur les nœuds de Chebyshev et l'erreur d'interpolation, utiles pour choisir une approche adaptée au problème posé.

Bobot (l’IA à votre service)
  1. Salut
    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
    2
    1. bonjour,
      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
      0
    2. @rawad25Salut rawad25
      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...
      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)=0;
      P(n+1:2*n+1:2*n^2)=1;
      
      P=fft(P,n+1,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.';

      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.
      function integrale = integrale_polynom(P,a,b)
      
      n=size(P,2);
      P=P./(n:-1:1);
      a=(a*ones(1,n)).^(n:-1:1);
      b=(b*ones(1,n)).^(n:-1:1);
      integrale=P.*(b-a);
      integrale=sum(integrale);

      A plus
      0
  2. 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.
    1
    1. merci bien, ce la j'ai besoin aussi! c'est très utile
      1
      1. Salut
        CCM - Charte - Respect d'autrui
        Ne pas poster un message sur une discussion en cours qui n’est pas la vôtre...
        Place-toi dans le répertoire où est ton fichier ou précise le chemin complet.
        A plus
        0
        1. 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
          1
          1. 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
            1
            1. salut...
              Merci...
              ma dernière question je l'espere bien :)
              comment deduire une valeur approchée de l'integrale a partir de ce qu'on vient de faire (question 2)
              et pour la question 3--> que faut il changer dans le code pour etre en train de calculer rk4 .. pour la fct y'=f'
              et y(-1)=-1.75 qui n'est autre que f!!!!
              j'espere que tu n'ai pas endormi encore sinon a demain :)
              0
              1. Salut
                function f = compute_RK4(x,y,f0)
                %% Calcul de f'=y f(x(1))=f0
                %% Taille de x impaire
                xm = circshift(x,[0 2]);
                x = x(1:2:end);
                xm = xm(1:2:end);
                ym = circshift(y,[0 2]);
                ymid = [0 y(2:2:end)];
                y = y(1:2:end);
                ym = ym(1:2:end);
                %%
                f = (x-xm)/6.*(y+4*ymid+ym);
                f(1) = f0;
                f = cumsum(f);

                A plus
                0
                1. Salut
                  wiiiiiii
                  s'il te plait.... j'ai besoin de ca pour le rendre demain :)
                  mon heros :P a plus... s'il te plait runge-kutta semble etre complique :)
                  0
                  1. Salut
                    Ben je vois que t'as bossé, c'est cool :-DDD
                    Pour la formule de Taylor, je t'en avais parlé ici, rien de bien compliqué.
                    Quand on te dit "dessiner la courbe intégrale", ça veut juste dire que tu dois tracer la courbe représentative de la solution de l'équation différentielle, c'est tout.
                    Si tu veux vérifier ce que t'as fait pour Euler et Heun, je te file les codes.
                    function f = compute_Euler(x,y,f0)
                    %% Calcul de f'=y f(x(1))=f0
                    xm = circshift(x,[0 1]);
                    ym = circshift(y,[0 1]);
                    %%
                    f = (x-xm).*ym;
                    f(1) = f0;
                    f = cumsum(f);

                    function f = compute_Heun(x,y,f0)
                    %% Calcul de f'=y f(x(1))=f0
                    xm = circshift(x,[0 1]);
                    ym = circshift(y,[0 1]);
                    %%
                    f = (x-xm)/2.*(y+ym);
                    f(1) = f0;
                    f = cumsum(f);

                    Pour Runge-Kutta, vu que t'es censé connaître la valeur de la fonction au demi-pas d'espace, tu peux l'approcher par la moyenne entre les pas entiers. Si tu y arrives pas, j'écrirais quelque chose vite fait.
                    A plus
                    0
                    1. Salut,,,,
                      Enfin....Je ne verrai pas de decevoir aussi, je pense que j'ai reussi a faire le boulot... grace a ton aide immence :)
                      Merci mon proffffffffffffffffffffff.....
                      merci bcp......
                      merci
                      merci
                      merci
                      merci...
                      il ne me reste que rk4 ... maintenant je sors et je retourne la nuit pour y penser...
                      GOD BLESS U
                      au revoir mon ami :)
                      0
                      1. salut de nouveau ... j'avais oublie de mentioneer dans la donnée de la question 1 qu'on nous demande de rapprocher y(x) par taylor, je sais pas si sa aide ou clompique les choses :)...
                        a plus
                        0
                        1. Salut Prof de nouveau....
                          merci de tout...
                          je vais te decevoir, mais j'y arrive pas, c'a m'emmerde cette question deja....et le temps me coince bcp...
                          c'est un projet que je fais a ma master et c'est hyper important.....
                          s'il te plait je voudrais un bout de code.... sur matlab
                          un code qui donne euler pour le premier pas...et je continuerais les autre mois meme de facon identique...
                          et comment deduire une valeur approchee de l'integrale....
                          enfin...un tout petit code comment resoudre la question 3 ... pour le premiers pas...
                          Je serais troppppp reconnaisant... s'il te plait, c'est une urgence et quelquechose de vital... :)
                          je devrais rendre ca aujourd'hui....
                          a plus mon ami
                          0
                          1. Salut

                            C'est dit dans l'énoncé, f est la fonction donnée par les points xi et yi, c'est-à-dire f(xi)=yi pour tout i.

                            A moins que tu parles du f des liens Wikipédia. Dans ce cas, remplaçons-le momentanément par un grand F. Les liens Wikipédia parlent donc d'équations différentielles du type u'(t)=F(t,u(t)) (c'est la forme générale d'une équation différentielle).
                            Il suffit de prendre ton équation différentielle à toi et de regarder ce qu'est ton grand F dans ton cas.
                            Ton équation différentielle c'est u'(x)=f(x) où l'inconnue est u bien évidemment (ce qui est noté dy/dx dans ton énoncé).
                            Donc si tu cherches à écrire ton équation différentielle sous la forme générale, ton F(x,u(x)) c'est rien d'autre que f(x), c'est tout.

                            Voilà donc ce qu'il fait faire pour calculer la solution u de ton équation différentielle (je rappelle que f(xi)=yi pour tout i).

                            Pour Euler:
                            u(i+1)=u(i)+(x(i+1)-x(i))*y(i)

                            Pour Heun:
                            u(i+1)=u(i)+(x(i+1)-x(i))/2*(y(i+1)+y(i))

                            Pour Runge-Kutta 4:
                            Je te laisse l'écrire... :-D

                            Bonne nuit
                            0
                            1. salut de nouveau Prof :)
                              ce que je voudrais savoir, que faire avant d'appliquer les methodes :)
                              appliquer les methodes sur quoi ? sur une fct pt par pt sa se fait ? ou sur un polynome...
                              ce que je veux en effet est non les methodes, mais comment faire ? comment commencer par resoudre la 1ere question, comment deduire une integrale ,et la 3eme question
                              juste quelques notes pour me mettre le travail en train :)
                              merci, s.v.p. urgences :)
                              0
                              1. Prof, ce que je n'arrive pas a comprendre c'est comment commencer... que prendre f ?
                                comment integrer ... et la reponse que devrait elle etre ?
                                merci prof Sacabouffe, bonnenuit a toi aussi :)
                                0
                                1. Eheh... salut!
                                  Vi, ça va bien. Ça a l'air d'aller pour toi aussi apparemment :-D
                                  Tu vois, tu progresses sans même t'en rendre compte, les trucs te paraissent simples et en plus ça marche.
                                  Ben pour le reste, tu devrais pas avoir trop de soucis. Toutes les méthodes dont tu as besoin sont expliquées sous Wikipédia :-D
                                  https://fr.wikipedia.org/wiki/M%C3%A9thode_d%27Euler
                                  https://en.wikipedia.org/wiki/Heun%27s_method
                                  https://fr.wikipedia.org/wiki/M%C3%A9thode_de_Runge-Kutta
                                  Bon, avec Matlab, c'est toujours mieux de faire tout en matriciel (quand il y a assez de mémoire pour ça), mais même si tu fais des boucles c'est pas un drame.
                                  Si t'as des soucis pour coder ça, dis-le moi. Mais tu devrais pas avoir de mal, il y a rien de bien compliqué.
                                  Bonne nuit mon ami rawad25
                                  0
                                  1. slt, j ai voir que vous ette un assistant dans les formule mathematique , et pour cela je te pose mon problemme
                                    avant tous , je suis en trein de prepare une application sur la methode de classification des texte basé sur la machine a vecteure de suppor (svm),et pendant le traitement de mes données (cordoné x et y) dans un plan de 2axe( terme ,frequence) pour trouver un hyperplan separateure optimale, j ai trouve que la methode svm basé sur les multiplicateure de lagrange pour l'optimisation et trouver les vecteure de support corespondant,
                                    comment faire pour calculer ces multiplicateure de lagrange par matlab, ou donne moi un pseudo code montre comment calculer ces multiplicateure, puisque ces derniere c la base pour resoudre mon problemme et la porte a trouver l'hyperplan optimale, aide moi svp dans les plus pres delais si possible
                                    accepte mes salutation distingué et mercie pour vos aides
                                    cordialement
                                    0
                                2. salutt profff :)
                                  ca va bien

                                  Ca va tout a fonctionne, j'ai utilise les polynome de lagrange interpoles par les noeuds de tchebichev et ca roule..les deux zeros de la fonctions je les ai bien...de meme j'ai devolepee une fonction pour calculer la deriver d'un polynome ...trop facile ... newton pour les zero pour ma fonction est satisfaisant ... tout et fini pour cette partie...reste un ptit probleme et opla fini...quelquechos dont je ne comprends meme pas la question... peut etre ce serai facile de te donner la question.. et tu me dirais des astuces que je trouve trop utiles..... des astuces de ce qui est demande, comment commencer et d'ou, comment faire, et ou chercher... c'est la 2eme et derniere partie de mon probleme
                                  ou f est la meme fonction donee par les xi et yi

                                  resoudre numeriquement l'equation differentielle dy/dx (x) = f
                                  y(-1)-0
                                  sur [-1,20] pour les pas 0.05, 0.1 ... utilisant
                                  1)euler progressive
                                  2) heun
                                  3) runge-kutta 4
                                  -dessiner la courbe integrale obtenue dans chaque cas et precisez l'effet du pas d'integration sur la solution numerique
                                  B-Deduire une valeur approchee de l'ntegrale de f sur [-1,20] et comparez aux valeurs obtenus en partie 1
                                  C-resoudre numeriquement l'equation differentielle y'(x) = f'(x)
                                  y(-1) = -1.751
                                  sur [-1,20] pour les pas 0.05, 0.1 ....utilisant runge-kuta 4 ... commentez
                                  ------------------------------------------------------------------------------------------------------------------
                                  et ce serai tout, je devrais arriver a implementer sa d'ici a dimanche soir, et j'espere qu'avec ton aide precieuse j'arriverai :) .... merci d'avance, mon ami Sacabouffe
                                  0
                                  1. 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
                                    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
                                    0
                                    • 1
                                    • 2