Cita de: Ensslin en 24 Febrero 2013, 00:57 AM
int main(int na, char *arg[])
{
double v;
double n;
if (na < 3) {
fprintf(stderr, "Introduce radicando y número\n"
"Así: \n"
"\t%s <radicando> <numero>\n"
"\n\ny yo te daré su raiz enésima \n\n"
,arg[0]);
exit(-1);
return (-1);
}
v = atof(arg[2]);
n = atof(arg[1]);
if (v<= 0)
{
fprintf(stderr, "El número debe ser positivo.\n");
exit(-1);
}
if (n<= 1)
{
fprintf(stderr, "El radicando debe ser mayor de 1.\n");
exit(-1);
}
ouble pow(double x, double n); //<==¿ESTO QUE PINTA AQUI? las
// declaraciones yson antes del main
double f(double x)//<==¿ESTO QUE PINTA AQUI? las funciones han de estar fuera de main
{
double v;
double n;
return pow(x, n)-v; //Función cuya raíz busco
}
double Df(double x)//<==¿ESTO QUE PINTA AQUI? las funciones han de estar fuera de main
{
double n;
return n*(pow(x, (n-1))); //Derivada de la función f(x)
}
double newton(double semilla, double tolerancia)//<==¿ESTO QUE PINTA AQUI? las funciones han de estar fuera de main
{[/color]
double x1, x2;
double dif;
x1 = semilla;
do {
x2 = x1 - f(x1)/Df(x1);
dif = fabs(x2-x1);
x1 = x2;
} while (dif > x2*tolerancia);
return x1;
double raiz = newton(1.0, 1e-9);
printf("La raíz enésima es %17.12f\n",raiz );
return 0;
}
Ahora sólo me marca este error
"nraices.c:87: error: expected declaration or statement at end of input" Por los dos corchetes que tengo en rojo
Fíjate en los comentarios que te pongo en "tu" código.
Te dejo como sería el formato del código funcionando, ya tu lo pasas a argumentos. Fíjate en que forma tomo la función, para evitar raices así como su derivada. También te dejo un par de printf para que observes la "evolución" de la aproximación;
Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define RAIZ 2.0
#define N 3.0 /*numero del que queremos hallar la raiz*/
#define SEMILLA 1.0
#define TOLERANCIA 1e-9
double f( double x);
double Df( double x );
double newton(double x);
int main(){
double raizN = newton( RAIZ);
printf("La raiz %lf de %lf es %1.12lf\n",RAIZ,N,raizN);//calculo Newton
return 0;
}
/**********************************************/
double newton( double x)
{
double x1, x2;
double dif;
double dif_;
x1 = SEMILLA;
do {
x2 = x1 - f(x1)/Df(x1);
printf("f(x1,RAIZ) %1.12lf Df(x1,RAIZ) %1.12lf\n",f(x1),Df(x1));//prescindible
dif_=x2-x1;
if (dif_<0)
dif_=-dif_;
printf("dif %1.12lf\n",dif_);//prescindible
printf("x1= %1.12lf x2= %1.12lf fabs %1.12lf\n",x1,x2,dif_);//prescindible
x1 = x2;
} while (dif_ > x2*TOLERANCIA);
return x1;
}
/**********************************************/
double f ( double x)
{
/* x = (N)(^1/RAIZ) ==> x^RAIZ-N = f */
return (pow(x, RAIZ)-N);
}
/**********************************************/
double Df( double x )
{
/* Df = RAIZ*x^(RAIZ-1) */
return RAIZ*(pow(x, RAIZ-1));
}
/**********************************************/
Saluditos!.