elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda calcular radio círculo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] 3 Ir Abajo Respuesta Imprimir
Autor Tema: Duda calcular radio círculo  (Leído 8,490 veces)
welchu

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Re: Duda calcular radio círculo
« Respuesta #10 en: 10 Febrero 2014, 14:38 pm »

Ya lo he hecho:

/*Programa que el usuario da el area del circulo y calculamos el radio*/
#include <stdio.h>
float potencia(float base, float exponente)
{
    float resultado=1;
    float i;
   
    for(i=1; i<=exponente; i++)
       resultado *=base;
    return resultado;
}
int main()
{
    float area, radio, pi=3.1415, x, exp=0.5;
   
    printf("Introduce el area del circulo: ");
    scanf("%f", &area);
   
    x=area/pi;
    //r=(x)^(1/2)
   
    printf("El radio del circulo es %f", potencia(x,exp));
   
    getchar();
    getchar();
    return 0;
}



El programa no me da error en ningún sitio pero no me calcula bien el radio. Hay algo que tengo mal?
Gracias


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Duda calcular radio círculo
« Respuesta #11 en: 10 Febrero 2014, 14:41 pm »

...

La potencia y la raiz cuadrada no se calculan igual.

La potencia es un simple producto... la raiz cuadrada requiere cálculos adicionales.

Dicho de otra forma... si a la función le pasas un exp = 0.5... y el bucle se repite desde 1 hasta exp... el bucle no se ejecuta NUNCA.

Quieres calcular una raíz cuadrada?? bueno, en mi primera respuesta tienes los pasos a seguir aplicando un algoritmo bastante simple.


« Última modificación: 10 Febrero 2014, 14:43 pm por eferion » En línea

NikNitro!


Desconectado Desconectado

Mensajes: 1.309


Galletaaa!!!


Ver Perfil WWW
Re: Duda calcular radio círculo
« Respuesta #12 en: 10 Febrero 2014, 14:45 pm »

Podrías usar esto:
Código:
float raiz(float m)
{
    float i=0;
    float x1,x2;
    while( (i*i) <= m )
            i+=0.1;
    x1=i;
    for(int j=0;j<10;j++)
    {
        x2=m;
        x2/=x1;
        x2+=x1;
        x2/=2;
        x1=x2;
    }

    return x2;
}

Saludos ;)
En línea

welchu

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Re: Duda calcular radio círculo
« Respuesta #13 en: 10 Febrero 2014, 14:53 pm »

Me ha salidooo!!!!!!!

/*Programa que el usuario da el area del circulo y calculamos el radio*/
#include <stdio.h>
float raiz(float m)
{
    float i=0;
    float x1,x2;
    while( (i*i) <= m )
            i+=0.1;
    x1=i;
    for(int j=0;j<10;j++)
    {
        x2=m;
        x2/=x1;
        x2+=x1;
        x2/=2;
        x1=x2;
    }

    return x2;
}

int main()
{
    float area, radio, pi=3.1415, x;
    
    printf("Introduce el area del circulo: ");
    scanf("%f", &area);
    
    x=area/pi;
    //r=(x)^(1/2)
    
    printf("El radio del circulo es %f", raiz(x));
    
    getchar();
    getchar();
    return 0;
}


No es el radio exacto por los decimales del pi pero al fin está bien!
Muchas gracias por vuestra ayuda!!  :D
En línea

Gh057


Desconectado Desconectado

Mensajes: 1.190



Ver Perfil
Re: Duda calcular radio círculo
« Respuesta #14 en: 10 Febrero 2014, 15:25 pm »

bien welchu, me alegro! el tema es que incrementabas de a uno (i++) cuando lo correcto es usar un incremento float, como bien te indicó NikNitro!, y la función al encapsularla es reutilizable. podrías intentar más adelante implementarla pasándole como parámetro el exponente, para hacerla más general. :) saludos!
En línea

4 d0nd3 1r4 3l gh057? l4 r3d 3s 74n v4s74 3 1nf1n1t4...
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Duda calcular radio círculo
« Respuesta #15 en: 10 Febrero 2014, 17:14 pm »

Me ha salidooo!!!!!!!

No es el radio exacto por los decimales del pi pero al fin está bien!
Muchas gracias por vuestra ayuda!!  :D

Ahora la pregunta del millón... sabes cómo o porqué funciona el código que has, literalmente, copiado??

Si la respuesta es negativa, deberías replantearte la forma de resolver los ejercicios... en la vida real no te va a servir esta forma de trabajar.
En línea

Gh057


Desconectado Desconectado

Mensajes: 1.190



Ver Perfil
Re: Duda calcular radio círculo
« Respuesta #16 en: 10 Febrero 2014, 17:25 pm »

Ahora que tu código anda welchu, si solamente quieres calcular raíces cuadradas podrías usar un algoritmo muy antiguo como el babilónico, (la solución es geométrica, mediante el cálculo de área de un cuadrado) no es tan eficiente como otros más modernos, pero es mucho más limpio y utilizarás menos variables... Te recomiendo buscarlo, leerlo e implementarlo en este ejercicio.
 
Otra de las soluciones que puedes ver por ahí es el de las series de Taylor, que resuelve el problema mediante logaritmos; la complejidad radica en que la función se encuentra en math.h jejej... pero siempre puedes crear otra función para calcularla mediante matrices (para volcar ahí la tabla). Saludos.
En línea

4 d0nd3 1r4 3l gh057? l4 r3d 3s 74n v4s74 3 1nf1n1t4...
Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: Duda calcular radio círculo
« Respuesta #17 en: 10 Febrero 2014, 21:00 pm »

Está muy bien este trabajo, y como comentario quisiera señalar que ese algoritmo:

Código
  1. float raiz(float m)
  2. {
  3.    float i=0;
  4.    float x1,x2;
  5.    while( (i*i) <= m )
  6.            i+=0.1;
  7.    x1=i;
  8.    for(int j=0;j<10;j++)
  9.    {
  10.        x2=m;
  11.        x2/=x1;
  12.        x2+=x1;
  13.        x2/=2;
  14.        x1=x2;
  15.    }
  16.  
  17.    return x2;
  18. }

está basado creo que en el "método de Newton" para solución de ecuaciones no lineales, que en el caso de raíces cuadradas también se conoce como método Babilónico.

 :)
En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
Gh057


Desconectado Desconectado

Mensajes: 1.190



Ver Perfil
Re: Duda calcular radio círculo
« Respuesta #18 en: 11 Febrero 2014, 01:34 am »

Hola yoel_alejandro, efectivamente aunque algo confuso pareciera basarse en el método de Newton (en realidad Newton - Raphson, tuve que buscarlo obviamente!) tengo entendido que fue mientras trabajaba en su famoso método de las fluxiones, que luego se le conoció como derivadas; aunque en ese momento no encontró la relación entre las raíces de polinomios y las sucesiones.

En cambio el método babilónico se basa en una solución geométrica, en llevar los lados de un rectańgulo hasta formar un cuadrado, en donde su lado es la raíz del área del mismo. Es una explicación bastante sosa, es cierto, pero igualmente me tomé el atrevimiento de modificar un poco el código para que sea más entendible, y personamente más intuitivo:

Código:
//Programa que el usuario da el area del circulo y calculamos el radio

#include <stdio.h>

double raiz (double);   // prototipo de función raiz.

int main()
{
    double area, pi=3.141519, x;

    printf("Introduce el area del circulo: ");
    fflush( stdin );    // borra el buffer del teclado.
    scanf("%lf", &area);

    x=area/pi;          // y como r=(x)^(1/2)...

    printf("El radio del circulo es %lf\n", raiz(x));

    return 0;
}

double raiz(double x){  // algoritmo de calculo de raíz cuadrada, método babilónico.
   
    double radio = x, t = 0;
   
    while (t != radio){
        t = radio;
        radio = (x/radio + radio)/2;
    }
    return radio;
}

Espero que les sea de su agrado, es tan sólo otra perspectiva... saludos!
En línea

4 d0nd3 1r4 3l gh057? l4 r3d 3s 74n v4s74 3 1nf1n1t4...
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Duda calcular radio círculo
« Respuesta #19 en: 12 Febrero 2014, 08:39 am »

¡¡¡Me ausento unos días y ya están tratado de reinventar la rueda!!!

:rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes:

Vayamos por partes:

Está muy bien este trabajo, y como comentario quisiera señalar que ese algoritmo:
..............................................................
está basado creo que en el "método de Newton" para solución de ecuaciones no lineales, que en el caso de raíces cuadradas también se conoce como método Babilónico.


Como referencia histórica te lo acepto, peros sólo como eso. ;)

...................................................

En cambio el método babilónico se basa en una solución geométrica, en llevar los lados de un rectańgulo hasta formar un cuadrado, en donde su lado es la raíz del área del mismo. Es una explicación bastante sosa, es cierto, pero igualmente me tomé el atrevimiento de modificar un poco el código para que sea más entendible, y personamente más intuitivo:
............................................
Código
  1. double raiz(double x){  // algoritmo de calculo de raíz cuadrada, método babilónico.
  2.  
  3.    double radio = x, t = 0;
  4.  
  5.    while (t != radio){
  6.        t = radio;
  7.        radio = (x/radio + radio)/2;
  8.    }
  9.    return radio;
  10. }

Creo que te has apuntado un tanto que no es tuyo. Cito textualmente el método expuesto en la Wikipedia:

Código
  1. double raiz(double x){
  2.    double r = x, t = 0;
  3.    while (t != r){
  4.        t = r;
  5.        r = (x/r + r)/2;
  6.    }
  7.    return r;
  8. }

Reconoce que el parecido es cuanto menos asombroso. ;)

Lo de eferion no termino de entender lo último:

Podrías optar por un algoritmo que vaya calculando la raiz cuadrada por aproximación y mediante un mecanismo de prueba y error.

1. Empiezas por un número... por ejemplo el 1
2. Ahora asignas un incremento... por ejemplo una unidad.
................................................
También puedes optar por algoritmos más sofisticados y potentes... pero esos no se si los vas a entender y no creo que sean el objetivo de tu práctica.

Como vaya a calcular la raíz de 10000000 va a tener que iterar 10000000 de veces antes de empezar las aproximaciones propiamente dichas. Y lo del incremento arbitrario que tomas lo admito, como lo anterior, como ejemplo. pero sólo como eso. En cualquier caso alabo tu "ocurrencia" para no hablar de métodos que consideras más sofisticados. ;)

Por cierto, ¿de qué algoritmos sofisticados hablas?. Porque yo puedo mencionar algunos elementales como los métodos de la bisección o bipartición,  Regula Falsi, Secante,  Iteración del punto fijo, Newton y sus tropecientas variantes, por mencionar sólo los elementales y todos ellos aplicables por cualquiera que haya estudiado simplemente el Bachillerato.

En el fondo la sensación que me da es que el hecho de tener que calcular la raíz cuadrada ha ofuscado al personal, cuando en este caso se se trata simplemente de obtener la raíz de una función:

Código
  1. f(x)=x*x-N=0

Personalmente me habría decantado por el Método de bisección por lo simple y fácil de explicar y/o entender, insisto que con un mínimo conocimiento de las Mates del Bachillerato. Y como ejemplo de la impementación al cáculo de la raíz cuadrada de 7:

Código
  1. #include <stdio.h>
  2. #include<stdlib.h>
  3. #include <math.h>
  4. #define f(x)    (x*x-7)
  5.  
  6. int main( void )
  7. {
  8.    double a=2,b=3,c=0,h=.000000001,FA=0,FB=0,FC=0;
  9.    int i=1;
  10.  
  11.   /* if (f(b)*f(a)<0.){
  12.       printf("Como signo de f(b)*f(a) es negativo, hay solucion\n");
  13.     else {
  14.       printf("Como signo de f(b)*f(a) es positivo, hay que elegir otro intervalo.");
  15. .......................................
  16.     }*/
  17.  
  18.    c=(a+b)/2;
  19.    while ((b-a)>=h ){
  20.        FA=f(a),FB=f(b),FC=f(c);
  21.        if ((FA* FC )>0 ){
  22.          a=c;
  23.          FA=FC;
  24.        }
  25.        else {
  26.          b=c;
  27.          FB=FC;
  28.        }
  29.        c = (a+b)/2;
  30.        i++;
  31.    }
  32.     printf("\n\nLa raiz de %1.8g es %1.8lf.\n\nY el valor real es %1.8lf: \n\nsiendo el numero de iteraciones %d\n\n",N,c,sqrt(N),i);
  33.    return 0;
  34. }

Citar

La raiz de 7 es 2.64575131.

Y el valor real es 2.64575131:

siendo el numero de iteraciones 31

Lo que sí es importante poner de manifiesto es la trascendencia de elegir adecuadamente los valores del intervalo en que se encuentra la raíz a fin de una pronta aproximación a la solución de la ecuación, toda vez que al tratarse de un simple polinomio de grado dos cumple los requisitos exigidos por el método, este y los otros mencionados anteriormente. Pero al tratarse en este caso de hallar la raíz cuadrada de un número real es la obtención de dicho intervalo es algo obvio.


Espero que nadie se sienta ofendido y/o molesto por mis comentarios. Sólo pretendo aportar otro punto de vista al derrotero en que había caído el tema. ;)


¡¡¡¡ Saluditos! ..... !!!!









« Última modificación: 12 Febrero 2014, 08:41 am por leosansan » En línea

Páginas: 1 [2] 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda Radio Kenworth
Electrónica
Crackptus^^ 0 4,049 Último mensaje 5 Junio 2004, 06:21 am
por Crackptus^^
calcular area de un circulo en javascript
Desarrollo Web
bibisita 2 21,652 Último mensaje 18 Abril 2012, 19:15 pm
por luismmp007
[Duda]Sistema Radio.
Electrónica
MonzterKuki. 7 5,323 Último mensaje 14 Agosto 2010, 23:39 pm
por simorg
formula para calcular radio d bobina al aire con I, B?
Electrónica
Synth3tik0 2 3,816 Último mensaje 18 Noviembre 2013, 16:32 pm
por Synth3tik0
Un microondas ''estropeado'' por una radio? Duda y curiosidad.
Electrónica
Guarrino 2 2,350 Último mensaje 8 Enero 2019, 06:00 am
por Guarrino
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines