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.