Foros del Web » Programando para Internet » PHP »

Bucle que realiza iteraciones de operaciones

Estas en el tema de Bucle que realiza iteraciones de operaciones en el foro de PHP en Foros del Web. Buenas a todos, Son novato en el mundillo de php y necesito de vuestra ayuda para solucionar una duda/problema que tengo Les copipasteo el fragmento ...
  #1 (permalink)  
Antiguo 19/11/2011, 10:47
erchavalin
Invitado
 
Mensajes: n/a
Puntos:
Pregunta Bucle que realiza iteraciones de operaciones

Buenas a todos,
Son novato en el mundillo de php y necesito de vuestra ayuda para solucionar una duda/problema que tengo

Les copipasteo el fragmento de código que tengo y les explico por partes este.
Código PHP:
    $i0 = ($vg/$r);
    
$vd0 $ktentreq * (exponencial ($i0/$is) + 1); 
    
$errorpermitido abs($precision $vd1); 
    
$contador 0;
    
$vd1 0;
    while ( 
abs($vd0 $vd1) <= $errorpermitido) {
    
$vd1 $vd0;
    
$i1 = ($vg-$vd0)/ $r;
    
$vd1 $ktentreq * (exponencial ($i1/$is) + 1);
      
$contador++;
    } 
Los valores de $vg, $r, $precision, $is, $kentreq son proporcionados por el usuario a través de un formulario (he comprobado que este funciona y recoge los datos correctamente, por lo que no es necesario agregarlo).
La funcion llamada exponencial calcula la constante de euler elevada a lo que se le introduzca (también funciona correctamente).
La parte que no consigo que me funcione es la del bucle. Este bucle ha de calcular $vd1 y $i1. Si el valor absoluto del valor final ($vd1) menos el valor inicial ($vd0) no son menores que $errorpermitido ha de repetir todo el bucle actualizando los valores de $vd0 y $i1 y sumando 1 al contador; es decir: el valor de $vd1 será igual que el de $vd0 y repetirá el ciclo hasta cumplir la condición.

El problema está en ese bucle, seguro que es un error garrafal el que he cometido pero no sé verlo.
¿Pueden ayudarme, por favor?

Muchas gracias de antemano
  #2 (permalink)  
Antiguo 19/11/2011, 12:38
 
Fecha de Ingreso: noviembre-2011
Ubicación: Morelia, Mich, México
Mensajes: 95
Antigüedad: 13 años
Puntos: 18
Respuesta: Bucle que realiza iteraciones de operaciones

Hola,
mm pero cual es el error que te da??
  #3 (permalink)  
Antiguo 19/11/2011, 12:53
Avatar de charlyalegret  
Fecha de Ingreso: septiembre-2011
Ubicación: Barcelona
Mensajes: 705
Antigüedad: 13 años, 1 mes
Puntos: 140
Respuesta: Bucle que realiza iteraciones de operaciones

A lo mejor digo una tontería, pero no será

$errorpermitido = abs($precision * $vd1); ---> no sería $vd0 ??
  #4 (permalink)  
Antiguo 19/11/2011, 15:40
erchavalin
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Bucle que realiza iteraciones de operaciones

El problema es que no funciona
Si pongo $vd1 como error permitido no ejecuta nada, en caso contrario me devuelve que el contador es 0 siempre y no me devuelve los resultados de vd1 e i1
(los llamo con echo)
[php]

echo "<h1> RESULTADOS </h1>";
echo "Han sido necesarias : $contador iteraciones";
echo "$vd1";
echo "$i1";
[php]
  #5 (permalink)  
Antiguo 20/11/2011, 14:32
Avatar de charlyalegret  
Fecha de Ingreso: septiembre-2011
Ubicación: Barcelona
Mensajes: 705
Antigüedad: 13 años, 1 mes
Puntos: 140
Respuesta: Bucle que realiza iteraciones de operaciones

Mi pregunta era, cuando pones $errorpermitido = abs($precision * $vd1);
¿qué vale $vd1 antes de la linea anterior? de dónde sale? Por que si no lo has definido, el errorpermitido será 0.
Entonces en el while: abs($vd0 - $vd1) = vd0 <= 0 que será siempre falso y no se ejecutará el bucle.
  #6 (permalink)  
Antiguo 20/11/2011, 15:43
erchavalin
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Bucle que realiza iteraciones de operaciones

Tienes toda la razón, por ello no se ejecuta el bucle.
La cuestión ahora es que el valor de $vd1 debe salir del bucle y actualizarse en el $errorpermitido
¿Sería factible abrir un if en el bucle que calcule el error permitido y usar un break si se cumple para salir de este? O ¿podría expresarlo directamente en la condición del while?
  #7 (permalink)  
Antiguo 20/11/2011, 16:37
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 10 meses
Puntos: 44
Respuesta: Bucle que realiza iteraciones de operaciones

Romper el bucle a tiempo te puede ahorrar ciclos si vas a seguir haciendo cosas tras la comparación.

Rompe el bucle en cuanto puedas.
  #8 (permalink)  
Antiguo 20/11/2011, 17:02
erchavalin
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Bucle que realiza iteraciones de operaciones

Entonces el bucle se me queda así pero hay algún error ya que no se ejecuta

Código PHP:
//Comenzamos a contar las iteraciones
    
while ( $manzanas != $peras) { //Por ejemplo, no sé que poner para inicializar el bucle
    
$i0 = ($vg/$r); //Primera aproximación de la intensidad
    
$vd0 $ktentreq * (exponencial ($i0/$is) + 1); //Utilizamos la función que calcula e y lo elevamos según la segunda ecuación
    
$contador 1
    
$i1 = ($vg-$vd0)/ $r;
    
$vd1 $ktentreq * (exponencial ($i1/$is) + 1);
    
$errorpermitido abs($precision $vd1); //Definimos el error permitido como el valor absoluto de la resta del valor inicial         y el final multiplicado por el margen de error establecido en el enunciado
    
$contador++;
    if ( 
abs($vd0 $vd1) <= $errorpermitido) :
    break;
    else :
    
$vd0 $vd1;
    endif;
    } 
  #9 (permalink)  
Antiguo 22/11/2011, 07:10
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 10 meses
Puntos: 44
Respuesta: Bucle que realiza iteraciones de operaciones

Un problema que veo es que asignas la variable contado ( $contador = 1; ) siempre dentro del bucle, entonces esa variable siempre va a valer 2 antes del if (desconozco si ese es tu propósito, pero visto que luego no la utilizas, no tiene mucho sentido).

Otra cosa es la inicialización del bucle. Inicialo con un "true" si vas a cortarlo manualmente dentro (cuidado con formar un bucle infinito).

Hay otra línea que tampoco entiendo, en este caso, la última ( $vd0 = $vd1; ).

Estás asignando a $vd0 un valor, para luego en la segunda línea del bucle, volver a asignar un valor distinto sin usar lo anterior.

Otro fallo que te veo es la inicialización de la variable $i0. Debido a que no la modificas dentro del bucle, inicalízala fuera para no definirla en cada iteración del bucle.

Ten en cuenta el ambito de las variables.
Tu código ordenado. hazle un debug con algún IDE (eclipse pdt por ejemplo)
Código PHP:
    $i0 = ($vg/$r); //Primera aproximación de la intensidad 
    
$contador 0;
    
$v0 0;
    while ( 
true ) { //El bucle se ejecuta constantemente hasta que lo rompas manualmente
    
        
$vd0 $ktentreq * (exponencial ($i0/$is) + 1); //Utilizamos la función que calcula e y lo elevamos según la segunda ecuación 
        
$i1 = ( ($vg-$vd0)/ $r ); 
        
$vd1 $ktentreq * (exponencial ($i1/$is) + 1); 
        
$errorpermitido abs($precision $vd1); //Definimos el error permitido como el valor absoluto de la resta del valor inicial y el final multiplicado por el margen de error establecido en el enunciado 
        
$contador++; 
        if ( 
abs($vd0 $vd1) <= $errorpermitido) {
            break; 
        }
        
        
$vd0 $vd1
    } 
PD: perdona si tengo errores, lo estoy haciendo desde éste editor y es algo complicado.

Última edición por SetheR; 22/11/2011 a las 11:38 Razón: Cambio nombre de variable
  #10 (permalink)  
Antiguo 23/11/2011, 16:35
erchavalin
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Bucle que realiza iteraciones de operaciones

Gracias a vuestros mensajes he conseguido realizar todo, mi especial agradecimiento a todos (que habéis sido recompensados con karma)
Los fallos detectados gracias a vuestros consejos son los siguiente:
1. El ámbito de las variables, se me olvidó añadir "global"
2. El sacar vd0 del bucle es correcto, pero también he de añadir que i0 es i1 tras finalizar el if


El código definitivo es el siguiente:
Código PHP:
function calculadora () {
global 
$vg;
global 
$is;
global 
$r;
global 
$precision;

    
$ktentreq 0.025;
    
$i0 = ($vg/$r); //Primera aproximación de la intensidad 
    
$contador 0;
    
$vd0 0;
    while ( 
true ) { //El bucle se ejecuta constantemente hasta que lo rompas manualmente
    
        
$vd0 $ktentreq * (exponencial ($i0/$is) + 1); //Utilizamos la función que calcula e y lo elevamos según la segunda ecuación 
        
$i1 = ( ($vg-$vd0)/ $r ); 
        
$vd1 $ktentreq * (exponencial ($i1/$is) + 1); 
        
$errorpermitido abs($precision $vd1); //Definimos el error permitido como el valor absoluto de la resta del valor inicial y el final multiplicado por el margen de error establecido en el enunciado 
        
$contador++; 
        if ( 
abs($vd0 $vd1) <= $errorpermitido) {
            break; 
        }
        
        
$vd0 $vd1;
        
$i0 $i1;
    }
        echo 
"<p>El n&uacute;mero de iteraciones necesarias ha sido de: $contador iteracione(s)</p>";
        echo 
"<p>La tensión del diodo es de: $vd1 voltio(s)</p>";
        echo 
"<p>La intensidad del diodo es de: $i1 amperio(s)</p>"
    } 
Este código ejecuta correctamente, queda comprobar que los resultados devueltos son correctos, que mañana os lo confirmaré (ya que aquí son casi las 12 de la noche).

Os agradezco vuestra ayuda y me quedaré por el foro ayudando a aquellos en lo que me sea posible. Un saludo

Etiquetas: bucle, iteracion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:11.