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

Octave Discussion :

Fonction logarithme et complexes.


Sujet :

Octave

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 182
    Par défaut Fonction logarithme et complexes.
    Bonjour à toutes et à tous,

    Je pêche depuis quelques temps sur le prôblème suivant :

    Je fais une regression non-linéaire sur la fonction suivante :
    y = (1/p(2))*(log((x-p(3))/EQF) - p(1));
    ou la fonction est minimisée par l'algorithme de levenbergMarquardt (leasqr) au travers des 3 paramètres de p, EQF étant fixé.
    Mon problème vient du fait que l'algorithme fait varier ces paramètres et notamment le paramètre p(3) ce qui peut entrainer x - p(3) < 0. La fonction log de matlab renvoie alors des complexes, et je me retrouve avec des complexes dans tous mes calcules suivants... un problème.

    Je me suis orienté vers reallog(x), qui finalement ne résoud pas le problème, car le changement de cette fonction est de jeter un message d'erreur quand x <= 0, ce que leasqr() n'apprécie évidemment pas.

    Donc la je seche.
    Je suis intéressé par toutes les pistes (sauf les pistes noires).
    Merci et bonnes vacances pour ceux qui sont concernés
    Gian

    Edit : non linéaire pas linéaire! hum
    Edit 2 : Je change le titre car cette problématique concerne aussi sous matlab (fct NLINFIT() je crois)

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 9
    Par défaut
    Tu pourrais creer ta "propre fonction log". Tu verifirai ainsi si tu n'as pas de valeur d'entree negative ou complexe, du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    Fichier : monlog.m
     
    function y=monlog(x)
     
    if(x>0 && imag(x) == 0)
        y = log(x);
    else
        % y = Inf;
        %Ou une autre solution qui fait en sorte que cette solution soit oubliee
    end
    Bon courage pour la suite

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 182
    Par défaut
    Merci pour cette réponse!

    Figures toi que c'est ce que j'expérimentais en redéfinissant le domaine du log sur ]0; +Inf[ avec ce qui suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function y = func(x,p)
    global EQF
    if(((x-p(3))/EQF)<1) %redefine logarithme under ]0; +Inf[
    	y = (1/p(2))*(-1*10^100 - p(1));
    else
    	y = (1/p(2))*(log((x-p(3))/EQF) - p(1));
    end;
    et... ca marche à pru pret (faut que je regarde les résultats en détails). Ca fait un peu bricolo sur les bords, et il faudrait que je mette à peu de choses prêt la valeur extrême stockable sous matlab (j'ai mis 10^100 au pif, mais je crois que c'est 337 ou quelque chose comme ca).

    Edit : j'oubliais : parce que j'ai essayé avec -Inf dans un premier temps, mais leasrq, -Inf, il aime pas... remarque on l'comprends.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 182
    Par défaut
    Bon, donc finalement je reviens sur ce que j'avais fait.
    En effet, le fait d'introduire une fonction monlog() avec des valeurs "à oublier" quandon est proche de 0 ca marche moyennement, car l'algorithme me sort des matrices de covariances des paramètres complètement abérrantes et surtout dépendantes de la valeur retournée par monlog() quand on est proche de 0.

    J'ai donc pensé à faire un truc plus propre, c'est à dire à restreindre les valeurs de p(3) sur les valeurs correctes de y(x) par : p(3) < min(x). Comment introduire cette condition dans l'équation ? je rappelle : @F :
    y = (1/p(2))*(log((x-p(3))/EQF) - p(1));

    J'imagine qu'il faut faire une substitution de variable du style :
    p(3) = Xmin-exp(p3) avec Xmin en global dans la fonction utilisée dans leasqr(@F) ce qui donnerait :
    y = (1/p(2))*(log(((x-Xmin)+exp(p(3)))/EQF) - p(1));
    mais, fitchtre... j'ai du me tromper quelque part... les r² sont très mauvais...

    une idée ?

    PS : peut-être vaudrait-il que je déplace le topic dans mathématiques ou il aurait plus ca place ?

Discussions similaires

  1. Approximant de Padé de la fonction logarithme népérien
    Par Obsidian dans le forum Mathématiques
    Réponses: 2
    Dernier message: 27/01/2014, 22h15
  2. [Débutant] Cherche la fonction logarithme népérien ?
    Par altahir007 dans le forum VB.NET
    Réponses: 1
    Dernier message: 27/09/2011, 10h39
  3. Appel de fonction entre fonction sur architecture complexe
    Par mek-in-gold dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/03/2008, 19h07
  4. Problème fonction retournant type complexe.
    Par mihaestii dans le forum SQL
    Réponses: 3
    Dernier message: 27/08/2007, 14h33
  5. fonction logarithme
    Par adel25 dans le forum C++
    Réponses: 2
    Dernier message: 03/10/2005, 11h06

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