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

Java Discussion :

Développement limité de fonction


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16
    Par défaut Développement limité de fonction
    Bonsoir,

    Dans le cadre de mes études je dois créer 3 versions d'une même méthode pour obtenir le même résultat pour les fonctions exponentielles, cosinus et sinus.

    1ere méthode à l'aide de la classe Math :

    - Cosinus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public double valeur(double x) 
    {
    	return Math.cos(x);
    }
    - Sinus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public double valeur(double x) 
    {
    	return Math.sin(x);
    }
    - Exponentielle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public double valeur(double x) 
    {
    	return Math.exp(x);
    }
    2e version via le développement limité de la fonction et les fonctions puissance et factorielle (Math.pow et Factoriel.fact) :

    La méthode fact(double x) de la classe Factoriel est une classe personnel qui fonctionne correctement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	public double valeur2(double x)
    	{
    		double exp = 0;
    		for(int i = 0; i<n;i++)
    		{
    			exp += Math.pow(x, i)/Factoriel.fact(i);
    		}
                    return exp;
    	}
    Cependant, je ne sais comment déterminer la valeur n pour obtenir le résultat adéquate. Est ce que ma méthode est enfaite bien plus complexe que celle présentée similaire à quelque chose comme cela : http://www.maths-forum.com/calcul-ex...ite-101965.php mais adapté au cas.

    Quant à la troisième version, elle correspond à une solution plus efficace (n’utilise pas les fonctions puissance et factorielle), basée sur le fait que le
    terme d’ordre i peut être calculé en fonction du terme d’ordre i − 1.

    Merci d'avance pour votre aide

  2. #2
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    Si tu veux une valeur de n, je peux en donner une :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private final const int n =10;
    Ce qui manque à votre sujet, c'est une problématique.
    Du style, "Comment faire le calcule suivant : ?"...

    Si tu dois faire 3 fonctions qui renvoient (exactement) le même résultat.
    Alors, il n'y a pas 36 solutions :
    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
    public double fonction1(double x) 
    {
    	return doFonction(x);
    }
     
    public double fonction2(double x) 
    {
    	return doFonction(x);
    }
     
    public double fonction3(double x) 
    {
    	return doFonction(x);
    }
     
    private double doFonction(double x) 
    {
    	return x;
    }
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16
    Par défaut
    Le résultat renvoyé par les trois versions n'est pas identique mais très similaire à un ordre de grandeur minimum.

    Le but de l'exercice est de visualiser les approximations obtenues en fonction de l’ordre du développement limité utilisé et ensuite tester de manière concrète la différence de performance des deux derniers algorithmes.

    On souhaite simplement utiliser des algorithmes différents pour une même résultat recherché.

  4. #4
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Par défaut
    Citation Envoyé par Schnapse Voir le message
    On souhaite simplement utiliser des algorithmes différents pour une même résultat recherché.
    Oui j'ai bien compris ça mais du coup où est la question ? Je suppose que ton soucis doit plus s'apparenter à un problème de math que d'informatique non ?
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  5. #5
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Par défaut
    Ca me fait penser à un exo que j'avais eut en pascal en 1ere année. Il fallait calculer le cosinus d'un multiple entier de PI.

    Evidemment la plupart des étudiants ont vu que :

    cos(n * PI) = 1 si n est pair et 0 si n est impair. Ca fait une première solution lol...

    Plus sérieusement, quelques remarques avant d'aller plus loin.

    Tu ne dois pas utiliser "const" en Java.

    Programme des méthodes avec des vrais noms. Tu peux avoir trois méthodes comme calculerSinus, calculerCosinus, calculerExponentiel que tu mets dans une interface nommée Calculette. Ensuite tu fais 3 classes qui implémentents Calculette, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public interface Calculette {
      Double calculerCosinus(Double d);
      Double calculerSinus(Double d);
      Double calculerExponentiel(Double x, Double e);
    }
    puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class Calculette1 implements Calculette {
      public Double calculerSinus(Double d) {
        return ...
      }
     
      ...
    }
    Ca te permettre en outre de faire très facilement tes cas de test, avec JUnit par exemple, surtout si tu penses à factoriser tes appels dans une classe abstraite et à spécifier ton implémentation dans le test en bout de chaine.

    Pense aussi à bien formater ton code en Java, et non en C.

    Une question que je me pose, c'est comment calculer un exponentiel avec des chiffres trop grands si tu travailles avec des doubles, idem pour le factoriel (je parle précisément de ce cas en annexes de mon article de présentation de 3T) car la capacité des int et des double est vite atteinte...

    Sinon, effectivement, dès qu'on dépasse une certaine précision, on ne cherche plus à tester l'égalité mais l'appartenance à un intervalle de valeur (le plus petit possible), c'est à dire à minorer l’imprécision.
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche

  6. #6
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    Tu peux aussi faire :
    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
    public class Calculette  {
    	private int nbIteration = 1;
     
    	public Calculette(iteration){
    		this.nbIteration = iteration;
    	}
    	public Double calculerSinus(Double d) {
    		return doCosinus(d, nbIteration);
    	}
     
            private double doCosinus(double x, int n){
    		double exp = 0;
    		for(int i = 0; i<n;i++)
    		{
    			exp += Math.pow(x, i)/Factoriel.fact(i);
    		}
                    return exp;
    	}
    }
    Et faire plusieurs calculette...
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  7. #7
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Par défaut
    Et même une interface pour la Calculette et une classe abstraite pour le code proposé par kolodz. Là ça serait vraiment top.

    Reste à régler le problème du calcul du factoriel et de la capacité des doubles.
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche

  8. #8
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2004
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2004
    Messages : 102
    Par défaut
    Citation Envoyé par Schnapse Voir le message
    Le résultat renvoyé par les trois versions n'est pas identique mais très similaire à un ordre de grandeur minimum.

    Le but de l'exercice est de visualiser les approximations obtenues en fonction de l’ordre du développement limité utilisé et ensuite tester de manière concrète la différence de performance des deux derniers algorithmes.

    On souhaite simplement utiliser des algorithmes différents pour une même résultat recherché.
    Dans ce cas là, n'est ce pas la valeur de 'n' qui importe ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    boolean end = false;
    int n =0 ;
    double epsilon = 0.0001;
    while ( ! end ){
        n++;
        double diff = Math.abs(cos(x) -doCosinus(x,n));
        end = diff <= epsilon;
    }
    System.err.println("........ iteration calcul algo 1 " + n );
    Si tu ne peux pas utiliser cos(x), tu peux peut-être faire un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    boolean end = false;
    int n =1 ;
    double epsilon = 0.0001;
    while ( ! end ){
        n++;
        double diff = Math.abs(doCosinus(x,n-1) -doCosinus(x,n));
        end = diff <= epsilon;
    }
    System.err.println("........ iteration calcul algo 1 " + n );

    tu refais la même chose pour l'algo 2 et tu compares le nombre d'itérations. Celui qui a le plus petit a gagné.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/02/2008, 10h10
  2. [Dates] Limite des fonctions natives DATE
    Par gloubi dans le forum Langage
    Réponses: 11
    Dernier message: 15/08/2007, 19h39
  3. Calculer un développement limité
    Par loic35 dans le forum MATLAB
    Réponses: 3
    Dernier message: 16/12/2006, 14h07
  4. Réponses: 54
    Dernier message: 18/10/2006, 19h08
  5. Liste déroulante limitée en fonction d'un choix...
    Par Gabrielle dans le forum Access
    Réponses: 7
    Dernier message: 28/09/2005, 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