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

C Discussion :

newton raphson à plusieurs variables


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 4
    Points : 3
    Points
    3
    Par défaut newton raphson à plusieurs variables
    Bonjour,


    dans le cadre d'un projet, je dois coder la méthode de newton raphson pour une fonction à une variable mais également pour une fonction à plusieurs variables. Pour la méthode à une variable (f(x)) pas de problèmes j'ai réussi à coder la méthode. En revanche pour la méthode de newton raphson au niveau vectoriel (f(x1,x2,...xn)) je ne vois pas du tout comment faire. Je sais que la Jacobienne de f intervient mais en fait je ne vois pas comment coder la méthode..


    Si vous pouviez m'aider à la coder cela m'arrangerait beaucoup.
    Cordialement.

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations forums :
    Inscription : Juillet 2012
    Messages : 200
    Points : 342
    Points
    342
    Par défaut
    Salut. Pour gérer le nombre de variables dont dépend la fonction, tu peux utiliser un pointeur auquel tu alloueras la mémoire nécessaire suivant le nombre de variable. Cette dicussion te sera utile. Ensuite, tu pourras faire ceci :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    // Fonction de calcul par la méthode Newton
    // argument 1 : nbre de variables,
    // argument 2 : pointeur sur l'espace occupé par les variables
    double fonctioncalcul(int, int*);
     
    int main(int argc, char** argv) {
        int *p = NULL;
        int nbVar; // pour le nombre de variables
        int i;
        double resultat;
     
        // Récupere le nbre de variables
        scanf("%d", &n);
        // Allouer la mémoire nécessaire avec une des méthodes de la discussion
        // ci-dessus mentionnée.
     
        // Récupérer les valeurs des variables
        for (int i = 0; i < n; i++)
             scanf("%d", (p + i));
     
       // Tu peux maintenant appeler la fonction de calcul avec en paramètre
       // le nombre de variables et le pointeur
       resultat = fonction_calcul(n, p);
    }

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Il est possible en C de faire une fonction avec un nombre variable d'arguments, ça peut aussi servir :
    http://c.developpez.com/faq/?page=fo..._args_variable
    http://www.cprogramming.com/tutorial/c/lesson17.html

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Excusez pour la réponse un peu longue mais j'ai essayé et j'ai réussi.. Cependant j'ai toujours un problème concernant le critère d'arret de la méthode de newton à plusieurs variables. Voilà mon code pour une fonction à 2 variables :


    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include "fonction.h"
    #include "gauss.h"
    #define NMAX 2
     
    main()
    {
    	double x0[NMAX],x1[NMAX],x[NMAX];
    	double e;
    	double f[NMAX], dpf[NMAX][NMAX],jacobinv[NMAX][NMAX];
    	double rac[NMAX];
    	double val,err;
    	double delta[NMAX];
    	int i,j,k,nmax; 
     
     
    	printf("entrez la premiere approximation: \n");
    	for (i=0;i<NMAX;i++)
    		{
    		scanf("%lf",&x0[i]);	
    		}			
    	printf("entrez l'erreur maximale:\n");
    	scanf("%lf", &e);
    	printf("entrez le nombre maximale d'iterations : \n");
    	scanf("%d",&nmax);
     
    	i=1;
    	while(i<nmax)
    	{
    		fonction(x0,f); //fonction qui ressort les valeurs de f1 et f2 en x0
    		jacobienne(x0,dpf); // fonction qui ressort la jacobienne de f en x0
    		gauss(dpf,f,x,NMAX); // solution Ax=b ou A est la jacobienne; b la fonction f et x=-(x1-x0)
    		for(j=0;j<NMAX;j++)
    		{
    			x1[j]=x[j]-x0[j]; 
    		}
    		printf("\n %d iterations : (%.7lf, %.7lf)\n",i,x1[0],x1[1]);
    		for(j=0;j<NMAX;j++)
    		{
    			delta[j]=x1[j]-x0[j];
    		}	
     
    		//CRITÈRE D'ARRET POSE PROBLÈME !!!!! Voilà tout ce que j'ai essayé pour le critère d'arret mais je ne parviens toujours pas...
     
     
    		//if ((module(delta,NMAX))<e)  // module est une fonction qui ressort le module du vecteur delta
     
    		//if ((infini(delta,NMAX)/infini(x0,NMAX))<e)	//infini est une fonction qui ressort la norme infinie du vecteur delta ou x0
     
     
    		//if ((fabs(delta[0])<e) && (fabs(delta[1])<e))  
    		{
    			rac[0]=x1[0];
    			rac[1]=x1[1];
    			break;
    		}
    		else
    		{
    			for (j=0;j<NMAX;j++)
    			{
    				x0[j]=x1[j];
    			}
    		}
    		i++;
    	}
    	if ((rac[0]==x1[0]) && (rac[1]==x1[1]))
    	{
    		printf("racine (%.7lf , %.7lf)\n",rac[0],rac[1]);
    		j++;
    	}
    	else
    	{
    	printf("\nAugmentez le nombre d'itérations\n");
    	printf("\n");
    }
    Si vous pouviez m'aider concernant le critère d'arret ça m'aiderai beaucoup!

Discussions similaires

  1. Réponses: 6
    Dernier message: 17/11/2012, 01h57
  2. Plusieurs variables dans Dim et Case??
    Par samlepiratepaddy dans le forum Access
    Réponses: 2
    Dernier message: 02/10/2005, 18h04
  3. Envoyer plusieur variable a un programme
    Par scaleo dans le forum Langage
    Réponses: 9
    Dernier message: 06/09/2005, 11h09
  4. envoyer plusieurs variables dans l'url?
    Par brgui dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/08/2005, 14h18
  5. Réponses: 5
    Dernier message: 28/04/2004, 16h06

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