IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

implantation d'une fonction integrale (formel) sur matlab


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 22
    Points : 6
    Points
    6
    Par défaut implantation d'une fonction integrale (formel) sur matlab
    bonsoir,
    je veux implémenter sur matlab la fonction suivante, où n et B sont des inconnues à déterminer par la suite.

    f(t)=∫((n-1)*1400* B*t+(-36*y)^(1-n))^(1/(1-n))*y dy pour y de[-1,8 1,8]
    l'ennui est que la fonction quad ne donne que la valeur numérique d'une integrale en un point, donc ça n'a pas marché, et vu que je suis débutante en matlab, j'ai pas trouvé de solution,
    j'ai entendu dire qu'il ya un tool book qui est Formal math Toolbox, or j'ai la version matlab 7.10.0, j'ai cherché ce toolbox mais il n'y a pas?
    est ce que quelqu'un a une idée comment je peux l'implémenter?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    La Toolbox dont tu parles est la Symbolic Math Toolbox.
    Si elle n'aparaît pas lorsque tu tapes ver, c'est que tu ne l'a pas installée.
    Cependant, je pense que tu peux t'inspirer de cette discussion.

  3. #3
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 22
    Points : 6
    Points
    6
    Par défaut
    en fait j'ai essayé de faire un code, qui fait l'optimisation de a(1) et a(2), (qui sont n et B dans la fonction que j'ai écrit la dessus, pour cela il faut implémenter la fonction qui est un produit d'un scalaire et d'une intégrale, j'ai utilisé la méthode des trapèzes pour l'implémentation de l'intégrale, mais ça m'affiche des message d'erreurs, et vu que je suis vraiment débutante je n'arrive pas à comprendre l'erreur
    voici mon code
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    function main
    global xi yi	 
    ti = [10800 43200 86400 172800 604800];
    yi = [0.6 0.7 1 1.2 1.4];
    a0 = [0.1 5]; 
    asol = fminsearch ( @F, a0)
    plot (xi, yi, '*', xi, f(asol, xi))
     
     
    function y = f(a,t)
    y=0.035*@Integrale;
    end
     
    function out = F(a)
    global xi yi
    out = sum ( (yi - f(a,xi)).^2 );
    end
     
     
    function I = Integrale(a,v)
        v=-1.8:1.8;
        I=trapz(v,maFonction(a,t,v));
    end
    function fc = maFonction(a,t,v)
    t = t(:);   
    v = v(:)';  
    f = v.*((a(2)-1).*a(1).*1400*t+(-35.95.*v).^(1-a(2))).^(1./(1-a(2)));
    end
    end

  4. #4
    Invité
    Invité(e)
    Par défaut
    Alors dans un premier temps, tu ne définis pas la variable xi (au même niveau que yi normalement dans le main) à moins que ce soit ti?.
    Ensuite, la ligne y=0.035*@Integrale; n'a pas de sens. Il te faut un truc du genre y=0.035*Integrale(a,v); avec deux paramètres en entrée comme tu l'as définie.

    Pour finir, évite d'utiliser des variables globales (inutiles ici car tu travailles avec des fonctions imbriquées), préfère utiliser des fonctions anonymes à la place ou fonctions imbriquées. Ceci te montrera la façon de faire.

  5. #5
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 22
    Points : 6
    Points
    6
    Par défaut
    j'ai corrigé les bêtise que j'ai faites en confondant les ti et les xi (c la même variable juste un problème de notation)
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    function main
    global ti yi	 
    ti = [10800 43200 86400 172800 604800];
    yi = [0.6 0.7 1 1.2 1.4];
    a0 = [0.1 5]; 
    asol = fminsearch ( @F, a0)
    plot (ti, yi, '*', ti, f(asol, ti))
     
     
    function y = f(a,t)
    y=0.035*Integrale(a,t);
    end
     
    function out = F(a)
    global ti yi
    out = sum ( (yi - f(a,ti)).^2 );
    end
     
     
    function I = Integrale(a,t)
        v=-1.8:1.8;
        I=trapz(v,maFonction(a,t,v));
    end
    function fc = maFonction(a,t,v)
    t = t(:);   
    v = v(:)';  
    f = v.*((a(2)-1).*a(1).*1400*t+(-35.95.*v).^(1-a(2))).^(1./(1-a(2)));
    end
    end
    un message d'erreur m'indique;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    File: main.m Line: 15 Column: 8
    The GLOBAL or PERSISTENT declaration of "ti" appears
     in a nested function, but should be in the outermost function where it is used.
    en fait j'ai pas compris le message d'erreur, ni ce que vous voulez dire par
    Pour finir, évite d'utiliser des variables globales (inutiles ici car tu travailles avec des fonctions imbriquées), préfère utiliser des fonctions anonymes à la place ou fonctions imbriquées
    puisque je ne connais pas grand chose sur matlab , c bête mais je tâtonne toujours

  6. #6
    Invité
    Invité(e)
    Par défaut
    Alors les fonctions imbriquées (ou nested functions en anglais) sont de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function principale
    % code principale
    
        function sub1
            % code sub1
        end
        ...
    
        function subn
            % code subn
        end
    end
    à différencier de (avec ou sans les end)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function principale
    % code principale
    end
    
    function sub1
        % code sub1
    end
    
    ...
    
    function subn
        % code subn
    end
    Ont l'avantage du fait que chaque variable déclarée dans la principale est accessible en lecture/écriture par les sous-fonctions (d'où tes déclarations globales inutiles ici).

    Petite remarque:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function fc = maFonction(a,t,v)
        t = t(:);
        v = v(:)';
        fc = v.*((a(2)-1).*a(1).*1400*t+(-35.95.*v).^(1-a(2))).^(1./(1-a(2)));
    end
    PS: le lien fourni dans mon précédent post détaille toutes les méthodes possibles pour ce genre de calcul.
    Dernière modification par Invité ; 18/05/2011 à 00h45.

  7. #7
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 22
    Points : 6
    Points
    6
    Par défaut
    désolée si ça vous ennui mais vraiment je n'y suis plus toujours une liste de message d'erreurs qui m'apparait
    voila j'ai trouvé le toolbox qui permet d'écrire l'équation d'une façon formel, sans utiliser le trapèze, qui est la fonction int, mais apparemment je suis encore loin
    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
    17
    function main
    global ti yi	 
    ti = [10800 43200 86400 172800 604800];
    yi = [0.6 0.7 1 1.2 1.4];
    a0 = [0.1 5]; 
    asol = fminsearch ( @F, a0)
    plot (ti, yi, '*', ti, f(asol, ti))
     
    function y = f(a,t)
    fc = v.*((a(2)-1).*a(1).*1400.*t+(-35.95.*v).^(1-a(2))).^(1./(1-a(2)));
    I=int(fc,v,-1.8,1.8);
    y=0.035*I;
     
     
    function out = F(a)
    global ti yi
    out = sum ( (yi - f(a,ti)).^2 );

  8. #8
    Invité
    Invité(e)
    Par défaut
    Oula je doute que mélanger données numériques et variables symboliques soit une bonne idée
    Je te conseille de rester sur la méthode précédente.
    D'ailleurs il te faudra utiliser la fonction repmat pour le calcul de fc afin de bien obtenir une matrice de taille length(v) x length(t).

Discussions similaires

  1. appel d'une fonction à chaque appui sur une touche du clavier
    Par jonnyboy dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 18/09/2007, 16h32
  2. [GD] Est-ce que c'est possible qu'une fonction tourne mieux sur Win et pas sur Linux
    Par nkki_nkki dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 22/07/2007, 17h34
  3. appel d'une fonction en cliquant sur un lien
    Par pazaroti dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 17/04/2007, 13h20
  4. Transcrire une fonction mathématique en code Matlab
    Par casper84 dans le forum MATLAB
    Réponses: 1
    Dernier message: 30/03/2007, 17h04
  5. Executer une fonction se trouvant sur la fenetre maitre
    Par PrinceMaster77 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/02/2006, 14h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo