Code Matlab pour une fonction à un variable et un paramètre qui prend plusieurs valeurs
Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

Code Matlab pour une fonction à un variable et un paramètre qui prend plusieurs valeurs



  1. #1
    turbulent

    Code Matlab pour une fonction à un variable et un paramètre qui prend plusieurs valeurs


    ------

    Bonjour;
    Svp, je cherche à écrire un code pour une fonction à un variable et un paramètre qui prend plusieurs valeurs, par ex: f(x) =a*x, avec x la variable et 'a' prend plusieurs valeurs (3 ou 4 ou plus). L'objectif c'est de tracer un certain nombre de courbes égal au nombre de valeurs que prend 'a'. Merci d'avance.

    -----

  2. #2
    Paraboloide_Hyperbolique

    Re : Code Matlab pour une fonction à un variable et un paramètre qui prend plusieurs valeurs

    Bonjour,

    Si x est un vecteur ligne, a peut être un vecteur colonne. En faisant
    Code:
    y = a .* x
    vous allez multiplier chaque ligne de a (un scalaire ici) par chaque ligne de x (il n'y en a qu'une seule) et obtenir deux lignes y1 = a1 * x et y2 = a2 * x.

    Voici un exemple:

    Code:
    x = linspace(0, 1, 100);
    a = [3; 4];
    y = a .* x;
    plot(x, y(1, :), x, y(2, :))

  3. #3
    turbulent

    Re : Code Matlab pour une fonction à un variable et un paramètre qui prend plusieurs valeurs

    Merci pour la réponse, mais moi, je n'ai pas besoin d'un script, j'ai besoin d'un code de fonction afin que l'on puisse l'appeler dans une autre application qui travaille en simulink avec Matlab.

  4. #4
    Paraboloide_Hyperbolique

    Re : Code Matlab pour une fonction à un variable et un paramètre qui prend plusieurs valeurs

    Hé bien ce n'est pas différent: il suffit de définir une fonction recevant en argument a et x, au besoin vérifier que a et x sont biens sous la forme attendue, et renvoyer y = a .* x.

  5. A voir en vidéo sur Futura
  6. #5
    turbulent

    Re : Code Matlab pour une fonction à un variable et un paramètre qui prend plusieurs valeurs

    Je crois que j'ai trop simplifié l'exemple. Ma fonction elle-même dépend de la détermination des racines d'une autre fonction.

  7. #6
    turbulent

    Re : Code Matlab pour une fonction à un variable et un paramètre qui prend plusieurs valeurs

    Bonjour;
    Je crois que je suis arrivé à écrire "correctement" le code de ma fonction en utilisant le mode de 2 arguments Ouput. J'ai testé une valeur de x et j'ai obtenu son image y. Le problème c'est que quand on fait appel de cette fonction dans Comsol, celui-ci édite l'erreur suivante: Error using *
    Incorrect dimensions for matrix multiplication. Check that the number of columns in the first matrix matches the number of rows in the second matrix. To operate on each element of the matrix individually, use TIMES (.*) for elementwise multiplication.

    Je sais que quelqu'un va me dire: aller donc poser ta question dans un forum de Comsol. Mais moi avant d'y faire, je voulais juste m'assurer avec les professionnels de Matlab qu'il n y a pas d'erreur de produit des matrices de dimensions différentes et pourtant le code script (pas le code de fonction) marche bien et présente des résultats parfaits. Merci d'avance.
    Code:
      function [Roots Z] = MyFunction1(x)%(x,T)
      Function=@(z) tan(3*z)+2*z;
      a=0;
      b=5.0;
      zero=fzero(@(z)Function(z),a);
      oldzero=zero;
      zerotot=zero;
      eps=1e-9;
      for i=a:0.01:b
      zero=fzero(@(z)Function(z),i);
      long=length(zerotot);
      if abs(zero - zerotot)> eps & (a<= zero) & (zero <= b)
      zerotot=[zerotot;zero];
      long=long+1;
      end
      oldzero=zerotot(long);
      end
      index=find(zerotot<a);
      zerotot(index)=[];
      index=find(zerotot>b);
      zerotot(index)=[];
      froots=Function(zerotot); % equal to 0?
      index=find(abs(froots)<=1e-9);
      Roots=zerotot(index);  % Vecteur colonne
    
      T=[0; .25; 1; 3; 7; 10]; % Vecteur ligne
    
       %x=linspace(0,3,50); % Vecteur ligne
      A=1.08;
       fsum=sum((sin(Roots(:)*x).*sin(3*Roots(:)).*exp(-A*(Roots(:).^2).*T ))./(1+...
              3/2+6*Roots(:).^2));
    
      MyFunction1=@(x) log(A -(A-1)*exp(-x)-...
          4*A*exp((3-x)/2)*exp(-A*T/4).*fsum);
      y=MyFunction1(x);
      Z =y;
      end
      %end

  8. #7
    turbulent

    Re : Code Matlab pour une fonction à un variable et un paramètre qui prend plusieurs valeurs

    Toutefois, après réflexion, je me suis rendu compte qu'il s'agit bien d'une erreur dans mon code Matlab (produit matriciel) quoique elle ne s'affiche pas dans l'environnement Matlab (peut être parce qu'il s'agit d'une fonction sans commande d'execution telle que plot) et elle n'est détecté que lorsqu'on lui fait appel dans Comsol pour exécution.
    J'attends votre aide avec impatience.

  9. #8
    umfred

    Re : Code Matlab pour une fonction à un variable et un paramètre qui prend plusieurs valeurs

    le point-virgule en fin de ligne indique de ne rien afficher
    Sinon il faut sûrement que tu transposes l'un de tes vecteurs, vu l'erreur, pour faire correspondre un nombre de lignes avec un nombre de colonnes
    Dernière modification par umfred ; 24/07/2023 à 18h45.

  10. #9
    turbulent

    Re : Code Matlab pour une fonction à un variable et un paramètre qui prend plusieurs valeurs

    Bonjour umfred;
    Etant donné que Roots est un vecteur colonne, donc Roots.^2 est un vecteur colonne (nombre de colonne =1). Par conséquent son produit matriciel avec le vecteur ligne T (nombre de ligne =1) est tolérable. x normalement est la variable de la fonction, il n'est déclaré que lorsque l'on fait appel de la fonction dans un autre fichier. Est-ce que c'est logique ou pas ?

  11. #10
    turbulent

    Re : Code Matlab pour une fonction à un variable et un paramètre qui prend plusieurs valeurs

    Code:
    fsum=sum((sin(Roots(:)*x)*sin(3*Roots(:))*exp(-A*(Roots(:).^2)*T ))./(1+...
               3/2+6*Roots(:).^2));
    fsum est le produit de 3 matrices : sin(Roots(*x), sin(3*Roots() et exp(-A*(Roots(.^2)*T) et la division par un vecteur. Pour ce faire, j'ai d'abord fait le produit matriciel des 2 premières pour obtenir une matrice puis je passe au produit matriciel avec la 3°. Comme size(Roots(*x)= 122 100
    et size(Roots()=122 1
    j'ai utilisé la transposée de Roots(*x, pour obtenir le produit matriciel de la matrice A=sin(Roots(*x)'*sin(3*Roots() avec size(A)=100 1.

    Code:
    fsum=sum(((sin(Roots(:)*x)'*sin(3*Roots(:)))*exp(-A*(Roots(:).^2)*T ))/(1+...
              3/2+6*Roots(:).^2));
    Le problème maintenant, c'est avec la 3° matrice B=exp(-A*(Roots(.^2)*T) où size(B)= 122 5.

    et là, je suis dans l'impossibilité de faire le produit matriciel de A et B. Y a-t-il une autre méthode à suivre ?

  12. #11
    turbulent

    Re : Code Matlab pour une fonction à un variable et un paramètre qui prend plusieurs valeurs

    Apparemment, il n'y a pas de solution et donc cette méthode de réécrire un script en fonction n'est pas valable. Je vais donc l'abandonner en adoptant la méthode d'export de data. Dans ce code je cherche à exporter tous les 5 vecteurs f correspondents au 5 valeurs de T. Dans le workspace on ne retrouve que les dernières valeurs de f correspondants à la dernière valeur de T. J'ai essayé de créer une matrice F avec size(F)= max(i) x Length(f) mais je n'y suis pas arriver. Pourriez-vous m'expliquer comment faire. Merci d'avance.
    Code:
      clc;clear all;close all;
      L=10;
      N=200;
      dz=L/N;
      z=0:dz:L;%
    
      for i=1:6
        if i==1
          T=0;
        end
        if i==2
          T= .25;%
        end
        if i==3
          T=1;
        end
        if i==4
          T=15;
        end
        if i==5
          T=30;
        end
        if i==6
          T=100;
        end
    
        if T==0
          f=z;
        else
          f=log(T)*z.^2;
        end
        %F=zeros(max(i),length(f))
        %F=(i,f(i))
        plot(f,z),hold on
      end

  13. #12
    Paraboloide_Hyperbolique

    Re : Code Matlab pour une fonction à un variable et un paramètre qui prend plusieurs valeurs

    Voici le code qui correspond au vôtre:

    Code:
    L = 10;
    N = 200;
    dz = L/N;
    z = (0:dz:L)'; % Vecteur colonne.
    
    T = [0, 0.25, 1, 15, 30, 100];
    
    F = z;  % Cas T = 0.
    F = [F, log(T(2:end)) .* z.^2]; % Cas général.
    
    % Affichage.
    hold on;
    for i = 1:length(T)
      plot(z, F(:, i));
    end

  14. #13
    turbulent

    Re : Code Matlab pour une fonction à un variable et un paramètre qui prend plusieurs valeurs

    Merci infiniment Paraboloide_Hyperbolique

  15. #14
    Paraboloide_Hyperbolique

    Re : Code Matlab pour une fonction à un variable et un paramètre qui prend plusieurs valeurs

    Je n'ai fait qu'appliquer ce que j'ai indiqué dans mes messages précédents (+ une petite modification pour tenir compte du cas particulier T = 0). Tu aurais pu le trouver par toi-même (et cela aurait été bien plus gratifiant pour toi).

  16. #15
    turbulent

    Re : Code Matlab pour une fonction à un variable et un paramètre qui prend plusieurs valeurs

    Pardon, l'exemple que j'ai présenté est un peu simplifié je crois que le vrai problème n'est pas encore résolu à cause du terme compliqué "fsum" qui depend des "Roots" calculées comme suit:
    Code:
    A=alpha*K_s/(theta_s-theta_r);
    f=@(x) tan(L*x)+2*x;
    a=-5.0;
    b=5.0;
    %fplot(f,[a,b]),grid on;
    zero=fzero(@(x)f(x),a);
    oldzero=zero;
    zerotot=zero;
    eps=1e-9;
    for i=a:0.01:b
      zero=fzero(@(x)f(x),i);
      long=length(zerotot);
      if abs(zero - zerotot)> eps & (a<= zero) & (zero <= b)
        zerotot=[zerotot;zero];
        long=long+1;
      end
      oldzero=zerotot(long);
    end
    index=find(zerotot<a);
    zerotot(index)=[];
    index=find(zerotot>b);
    zerotot(index)=[];
    froots=f(zerotot); % equal to 0?
    index=find(abs(froots)<=eps);
    Roots=sort(zerotot(index))
    et le terme "fsum" est calculé comme suit:
    Code:
    fsum=sum((3*sin(Roots(:)*z).*sin(Roots(:)).*exp(-.04*(Roots(:).^2)*T ))./(1+...
      1.5+6*Roots(:).^2));
    Pour enfin pouvoir calculer f:
    Code:
    if T==0
        f=-z;
      else
        f=log(-.9 -1.9*exp(-z)+3.6*exp((3-z)/2)*exp(-.04*T/4 ).*fsum);
      end
    Quand je maintiens la structure du code telle qu'elle est, j'obtiens mes résultats de h "plotés" mais dans le workspace je n'obtiens que le dernier vecteur de f correspondant à la dernière valeur de T. Maintenant, si j'adopte ta démarche en substituant la boucle de T par le vecteur
    Code:
    T = [0, 0.25, 1, 15, 30, 100];
    j'obtiens l'erreur relative au produit matriciel dans le terme "fsum" et là je me retrouve encore une fois coincé par cette erreur !!!!!!!!.

Discussions similaires

  1. Matlab - valeurs propres en fonction d'une variable
    Par inviteda155e3d dans le forum Programmation et langages, Algorithmique
    Réponses: 4
    Dernier message: 11/04/2016, 15h09
  2. [Matlab] courbe en fonction d'un paramètre variable
    Par invite3ba0dddb dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 28/04/2012, 17h49
  3. MATLAB: méthode de Newton, ou du gradient, (ou autre) pour une fonction à plusieurs variables
    Par invitea29b3af3 dans le forum Programmation et langages, Algorithmique
    Réponses: 15
    Dernier message: 18/10/2011, 23h04
  4. taylor pour fonction a plusieurs variable
    Par invite5a89bfe6 dans le forum Mathématiques du supérieur
    Réponses: 2
    Dernier message: 06/07/2009, 12h15
  5. passer une fonction en paramètre sous matlab
    Par invite8b6c7fe1 dans le forum Mathématiques du supérieur
    Réponses: 5
    Dernier message: 11/06/2009, 16h00