2017-05-11 1 views
0

J'essaie de trouver une racine avec la méthode du point fixe simple en C++, mais le point est que Xr est une racine de f(x) et un point d'inflexion. En outre, une équation est un peu plus complexe que la méthode à virgule fixe normale. L'équation est ajoutée constante c pour vérifier la vitesse de convergence vers la racine xr. J'allais trouver une racine et ensuite vérifier si la racine est un point d'inflexion ou pas, mais cela ne fonctionne pas et je ne trouve pas le problème dans mon code. J'ai besoin de votre aide.Code deux condition requise pour trouver la racine avec la méthode du point fixe

Le vrai problème est

Tenir compte le problème de la recherche des racines f(x)=0 avec la racine xr, avec f '(x)=0. Convertissez le problème en un point fixe simple.

x=x+c*f(x)=g(x) 

avec c une constante non nulle. Comment devrait être choisi c pour assurer la convergence rapide des

x(n+1)=x(n)+c*f(x(n)) (x(n+1) means the value of the n+1th of X) 

à c (à condition que x0 est choisi suffisamment proche de xr?). Appliquez votre façon de choisir c au problème de recherche de racine x*x*x-5=0. Démarrez votre programme avec x0=1.0 et exécuter avec plusieurs valeurs de c et discuter de la tendance observée dans les résultats (en d'autres termes, l'effet de la valeur c sur le comportement de convergence)

#include <stdio.h> 
#include <conio.h> 
#include <math.h> 
#include <stdlib.h> 

double gx(double x, double c) 
{ 
    return(x + c*(x*x*x - 5)); 
} 

double gxpr(double x, double c) 
{ 
    return(x + c*(3 * x*x)); 
} 

void Simple_Fixed_Point(double x, double c) 
{ 
    int i = 1; 
    long double x2=0.0; 
    long double x3=0.0; 
    long double ea=0.0; 
    long double ea2 = 0.0; 
    long double es = pow(10, -6); 

    printf("Simple Fixed Point Method\n"); 

    Lbl: 
     x2 = gx(x,c); 

      printf("iteration=%d Root=%.5f Approximate error=%.15f\n", i++, 
x2, ea); 

     if (ea=fabs((x2 - x)/x2*100) <es) 
     { 
      goto Lbm; 
     } 
     else 
     { 
      x = x2; 
      goto Lbl; 
     } 

    Lbm: 
     x3 = gxpr(x2, c); 

     if (ea2 = fabs((x3 - x2)/x3 * 100) < es) 
     { 
      goto End; 
     } 
     else 
     { 
      x2 = x3; 
      goto Lbm; 
     } 

    End: 
     getch(); 
} 

int main(void) 
{ 
    Simple_Fixed_Point(1.0, 1.0); 

    return(0); 
} 
+0

La fonction 'f (x) = x^3-5' avec 'f' (x) = 3x^2' a un point d'inflexion à' x = 0', qui n'est cependant pas une racine de 'f' . Voulez-vous dire 'f (x) = (x-5)^3'? – LutzL

+0

Veuillez modifier votre code C++ pour qu'il fonctionne sans les instructions 'goto'. Veuillez expliquer quel rôle joue la fonction 'gxpr' car la tâche ne dit rien de l'itération' xnext = x + c * f '(x) ' – LutzL

+0

Goto est génial. Ignorer le message ci-dessus. – AppWriter

Répondre

0

Hope this vous aide:

//f(x+dx) = f(x) + (dfdx) * dx; 
eps = 1.0;  
dx = 1e-7; //something small 
x = x0; 
while (eps > mineps) { 
    f1 = f(x); 
    f2 = f(x + dx);  
    f3 = f(x + dx + dx);   
    d2fdx2 = (f3 - f2 - f2 + f1)/dx/dx; 
    dfdx = (f2 - f1)/dx; 
    x -= (relax1 * f1/dfdx + relax2 * dfdx/d2fdx2); //relax - something less 1 
    eps = max(abs(dfdx), abs(f1)); 
}