Teorema Bolzano con PHP

ItNaS

Bueno a ver si em ayudais xD. El caso es que me han dicho que si hago "un programa" q calcula los zeros de una funcion en php mediante el teorema de bonzano me suben la nota. y no tengo ni idea d x dnd empezar.

El teorema de bolzano dice mas o menos que si en una funcion ( que sabemos que es continua) tenemos a y b de manera que f(a)>0 y f(b)<0 existira un numero z de manera que f(z)=0. Mas o menos lo q viene a decir es q si tenemos en una funcion un punto positivo(a>0) (respecto eje x) y otro negativo(b<0)(rpto. eje x) y que dichos puntos estan unidos (xq la funcion es continua), la funcion ha de cruzar el eje x ( punto z).

D momento e echo esto y no se como empezar lo chungo :S

<?php
if ( isset($POST[x2],$POST[x1],$POST[termeindependent])){
echo "aaaaaaaaa";
}
else{
echo " Introdueix la funció per trobar els zeros mitjançant el teorema de Bolzano:
<form name=\"bolzano\" method=\"POST\" action=\"$
SERVER[PHP_SELF]\">
f(x)= (campo de texto me da error al copiarlo)
x² + (campo de texto me da error al copiarlo)
x + (campo de texto me da error al copiarlo)
(boton me da error al copiarlo)
</form>
</body>";
}
?>

D

Seguro que solo puedes utilizar el teorema de bolzano?

Mmm... no se, me extraña. Tiene que haber algo mas que puedas usar. Por Bolzano lo mejor que puedes hacer es aproximarte a las raices del polinomio tanteando los valores por ambos lados, y esto solo si tienes idea de por donde pueden estar. Si hay una raiz en x=4,65*1014 a ver quien es el listo que la busca por bolzano.

Otra cosa, tu hablas de calcular los ceros de una funcion, pero el formulario solo te permite introducir un polinomio de segundo grado. Imagino que solo lo tendras que hacer para ese caso.

No te vale (-b +/- RAIZ(b2 - 4ac))/2a?? Imagino que no seria demasiado sencillo.

Mira a ver si puedes concretar un poco mas las pautas que te han establecido.

PD: me parece un proyecto un poco complicado para un niño de 6 años xD

ItNaS

xD tengo 16
podria hacer q preguntase la raiz del polinomio entonces poner los campos necesarios segun el numero introducido... no se xD

cual es la funcion raiz?

mi php es basico xD

B

.

D

Con raiz me referia a raiz cuadrada. Sqrt() en PHP creo. Basicamente lo que queria decir es que usaras la formula para calcular los resultados de la ecuacion polinomica de segundo grado. Pero eso me parece demasiado sencillo. Ahora bien, si te sirve te lo comento con mas detalle.

PD: para bunko, quizas la definicion del teorema sea un poco confusa. Mira esta imagen:

http://users.servicios.retecal.es/jamoro58/bolzano.bmp

El teorema de bolzano asegura que si la funcion es continua en el intervalo a,b y el signo de f(a) y f(b) es distinto (uno es + y el otro -), existe el punto c, tal que f(c)=0 (es decir, la funcion corta al eje x en c)

De acuerdo con lo anterior, bolzano permite ir acotando los ceros de una funcion, acercandonos cada vez mas por un lado o por el otro, cogiendo puntos cada vez mas cercanos a c hasta que dejen de tener distinto signo. Por eso me extraña que se pidan los ceros exactos de una funcion usando bolzano, ya que este teorema ni siquiera asegura que solo haya un punto c, puede haber mas de uno. Bolzano (que yo sepa) es util cuando uno no sabe resolver una ecuacion pero necesita saber si tiene alguna solucion en un intervalo determinado.

Saludos...

ItNaS

$4 esta bien escrito

http://descartes.cnice.mecd.es/ingles/Bach_HCS_2/Bolzano_Weierstrass_theorems/grafico_bolzano.gif

en vez de z lo llama c

#5 esq se supone q e desplicar el codigo. no se como hacerlo xD con lo de la raiz se sacarian los zeros pero ahi sacabaria el ejercicio sin haber usado bolzano, se supone que tendria que encontrar dos numers cualesquiera donde uno fuera positivo y otro negativo (esto es lo dificil) a partir de ahi lo demas es ir dividiendo entre 2 la suma de los dos numeros y mirar se podria hacer con un while. pero ¿q pasaria si uno de los zeros fuera 1.3333333333 x ejemplo? no lo podria encontrar asi ¿no? ¿tendria q marcar un margen de error o algo?

D

mmmm...... vamos a poner un ejemplo, olvidandonos del PHP:

f(x)=x²-x-6, los ceros son las soluciones de la ecuacion x²-x-6=0 la cual seria muy facil de resolver con la formula de toda la vida. Bien, sus soluciones son 3 y -2. Si metemos bolzano ya se complica la cosa:

Cojo dos valores arbitrarios por ejemplo 0 y 5, (la funcion es siempre continua porque es elemental y de dominio todo R). f(0)=-6 f(5)=14. Entre 0 y 5 hay al menos una solucion, pero puede haber mas (bolzano no asegura que solo sea una y nosotros a priori no lo sabemos). En este caso solo hay una solucion, que es en el 3. La solucion 3 la tenemos acotada por el 0 y por el 5. Reduzcamos los limites a 1 y 4, y veremos que se sigue cumpliendo. Ahora reduzcamolos a 2,5 y 3,5 y se sigue cumpliendo. Cada vez nos hacercaremos mas pero nunca hallaremos con certeza la solucion exacta. Este es un caso sencillo, pero la solucion podria ser 3,885211459 a la cual es imposible llegar exactamente con este modo. Ademas te en cuenta que solo nos hemos movido entre 0 y 5. Las soluciones podrian haber estado entre 21.312.435.453 y 21.412.734.429 por ejemplo. No puede hacer un programa que "barra" todos los numeros reales desde -&#8734; hasta +&#8734;.

Buff que parrafada. En fin, usando bolzano no se me ocurre como dar soluciones exactas, ni con PHP ni con papel y boli.

guner

El teormea de bolzano dice que is una funcion f(x) es contínua en un intervalo cerrado [a, b], siendo f(a) y f(b) de distinto signo, tiene que haber un x que haga que f(x) valga 0.

Tienes que hacer:

  • Pedir una funcion.
  • Pedir un intervalo. (Ojo!, que no sea [-127842, 4932857])
  • Pedir un error menor.
  • Comprobar que la función es cotínua en dicho intervalo. (Ni puta idea de como hacerlo, y a base de calcular el dominio de la funcion yo no lo haría ni de coña). Así que yo me aseguraría de que solo se pueden introducir funciones continuas.
  • Después de eso, ir acortando el intervalo. El procedimiento sería irse acercando a 0, y hallar el valor de la función hasta que se alcance el error mínimo, por el lado de a y b, y devolver el intervalo en el que se encuentra el 0. // al menos asía son los problemas de mi libro >_<

Pero la teoría matemática no es lo chungo, lo chungo es , o al menos sería pasar la expresión matemática de la función a php, creo que es tu problema. Así que te tendrías que ayudar de expresiones regulares etc, etc...

Bueno, creo que al menos te he dicho el procedimiento que seguiría : P

D

Siendo como dice guner si se puede. Si tu estableces un intervalo y un margen de error previamente no es muy dificil. Pero si no, si solo le das la funcion, por bolzano es imposible.

No hace falta comprobar la continuidad ya que las funciones tipo ax2+bx+c son todas continuas.

Tengo un poco oxidados los pocos conocimientos de PHP, pero mira a ver si puedes usar dos whiles: uno que se ejecute sumando el margen de error al extremo inferior del intervalo hasta que se deje de cumplir la condicion de los signos opuestos. Y despues otro igual pero restando al extremo superior. De ese modo el ultimo valor de las variable $limiteinferior $limitesuperior (o como las llames) es el intervalo en el que esta la solucion (dentro del margen de error)

ItNaS

pidiendo intervalo y margen de error se facilita, muchas gracias

ItNaS

muchas gracias a todos :)

JuAn4k4

El algoritmo es sencillo:
http://stark.udg.es/emili/docent/qtc/pdf/01_raices.pdf

Simplemente cojes C, aleatorio en el intervalo [a,b] Si f(c) es 0 , terminas, sino, y tampoco se aproxima lo suficiente, miras cual de estas dos se cumple:

f(a)*f(c) < 0 -> Cambias a=c; en el intervalo quedara: [c, b]

f(c)* f(b) < 0. -> Cambias b=c , en el intervalo quedara [a, c]

y vuelves a cojer otro c , aleatorio en el intervalo que te ha quedado.
Asi hasta que la aproximacion sea la que tu quieras.

PD: Para cojer el punto c , aleatorio , coje el de en medio: (A+ B) /2

El orden del algoritmo es logaritmico. (Creo vamos)

En el link lo tienes en FORTRAN

ItNaS

gracias juanaka :D

12 días después
ItNaS

buah e continuado probandolo per no me sale pongo aqui el codigo y el php a ver si alguien me ayuda. muchas gracias

http://runordie.myazor.net/bolzano/bolzano.txt
http://runordie.myazor.net/bolzano/bolzano.php

guner

Te subo el thread porque acabo de ver que acababas de contestar, pero MV tiene una 'feature' que hace que no suba XD.

Ahora estoy ocupadillo con historia, mañana lo miro, además así me miro el tema de continuidad _.

ItNaS

gracias guner :)

guner

http://josm.freeunixhost.com/muestras/bolzano/

Ahí tienes.

Hay un error en la línea que compara los signos de los valores en f(a) y f(b), en realidad no sé qué pasa. Tendrás que poner esa parte entre comentarios o arreglarlo (pero está bien :/).

El resto de las cosas funciona bien.

l Fixed1
l
l
V

X cierto, si ves xq no va lo del xor ponlo xfa.

ItNaS

no em deja acceder
You don't have permission to access /muestras/bolzano/codigo/bolzano.php.txt on this server.

Usuarios habituales