Plantié dos ecuaciones con dos incognitas las iguale, despues iguale a cero y use un for con un incremento muy chico para buscar en que momento esa funcion cambiaba de signo, entonces tendría un cero. Me pusieron B- por no justificar precision, quería saber como se justifica en esos casos la precisión.
No, tu solución es correcta y le corresponde B. (Te faltó mencionar la relación lineal entre el segmento y el ángulo que recorre el for, pero es hilar demasiado fino.)
Lo que pudo haber pasado es que el corrector se confundió con lo que sucedió con varios otros participantes.
Es algo sutil pero importante. Tal como decís, el problema se puede reducir a buscar un $x$ tal que $f(x)=0$. En el caso de este problema, $x$ es la longitud del segmento y $f(x)$ puede ser por ejemplo “longitud del arco menos dos veces longitud del segmento”.
Lo importante es esto: el enunciado pide aproximar $x$, no reducir $f(x)$. Lo que varios participantes hicieron fue buscar un $y$ tal que $f(y)$ sea casi 0. Pero, si la función $f$ fuera muy mala, un tal $y$ podría estar muy lejos el $x$ solución. En otras palabras, $|f(y)| < 0.0001$ no implica que $|x-y|$ sea chico. A veces pasa y a veces no, así que hay que justificarlo o usar otro camino.
Por ejemplo llegue a esto: si $x=2sen(x)$ entonces $1000x$ es la longitud de la cuerda. Entonces iguale a cero y busque el cambio de signo. Con una ecuación como la primera, podría haber usado un método iterativo como punto fijo y tengo 10 decimales en pocos pasos. Está mal si lo hago así?
Usando punto fijo solamente es todavía más difícil justificar la precisión lograda.
Mejor como estaba: encerrar un cambio de signo (y por lo tanto una raíz) entre dos valores muy cercanos. Ese camino es el que más fácil permite justificar.
Hola!
Este problema lo resolví bien en el último certamen, pero obtuve 3—, porque la jutificación no era correcta. Se me aconsejó que debía buscar las raices de una función. Me gustaría saber si la siguiente solución está bien, y que se podría mejorar:
Sea x la longitud del segmento trazado y L la longitud del arco que se forma.
L = 2*x;
Entonces se puede plantear la funcion F(x) = L - 2*x, y encontrar las raices. La solución sería x, tal que F(x) = 0 (o casi cero)
L = PI * 2000 * (360-2*arcsen(x/2000)) / 9;
Finalmente,
F(x) = PI * 50 * (360-2*arcsen(x/2000)) / 9 - 2*x;
La respuesta que obtengo es x = 1895.49
Gracias!
Saludos!
Una forma que yo pensé es esta: (suponemos radio=1 y despues multiplico por 1000)
Si a la circunferencia trigonometrica de centro O (centrada en ejes cartesianos y de radio 1) le marco un punto A en el segundo cuadrante de manera que esté a X/2 del eje X (media cuerda en el problema), y que el angulo que forma el segmento AO con el semieje positivo de las X mida X (medio arco grande en el problema), el ángulo que forma AO con el semieje negativo de las X es 180-X. Luego sen[X]=sen[180-X]=Op/Hip=(X/2)/1=X/2. Entonces si existe un valor c que anula a f[x]=x-2sen[x], es solución del problema.
Un posible programa es el siguiente hecho en Basic que controla el error.
dim a as double, b as double, c as double
function f(x as double) as double
f=x-2*sin(x)
end function
a=0
b=3.14
for i = 1 to 100
c=(a+b)/2
if f(a)*f(c)<0 then b=c
if f(b)*f(c)<0 then a=c
next
print 1000*a,"Error menor a";1000*(b-c)
sleep
El resultado en pantalla:
1895.49426703398 Error menor a 2.22044604925031e-013
Saludos y nos vemos mañana a los que vallan al nacional :)
maxi: Tenés que tener cuidado con eso de "La solución sería x, tal que F(x) = 0 (o casi cero)". Como dijo pablo, el hecho de que F(x) sea casi 0 no significa que el error que estás cometiendo con respecto a la x sea pequeño.
Lo que tendrías que hacer es encontrar dos valores x, x' tales que F(x)>0 y F(x')<0.
Entonces existe un valor z entre x y x' tal que F(z)=0. Esto sucede porque F(x) es continua (se puede graficar sin levantar el lapiz, :-) ).
Por lo tanto, una vez que conseguis dos valores x e x' que cumplen lo anterior, y que tienen diferencia menor que 1, entonces cualquier valor entre x y x' es solución al problema.
Por ejemplo:
si tomas $x= 1895$, tenés $f(x) = \pi * 50 * (360-2*arcsen(1895/2000)) / 9 - 2*1895 = 2.53...$
si tomas $x= 1896$, tenés $f(x) = \pi * 50 * (360-2*arcsen(1896/2000)) / 9 - 2*1896 = -2.59...$
Por lo tanto, existe un valor x'', 1985<x''<1986 tal que f(x'')=0.
Cualquier valor entre 1895 y 1896 es solución al problema.
rodrigo: solo un par de cositas para comentarte (aunque supongo que la mayoría las sabés y las pusiste en tu solución completa):
1. Lo de "multiplicar por 1000" habría que aclarar que es "hacer una homotecia de razón 1000" y que esa homotecia mantiene las proporciones entre segmentos.
2. Cuando haces
if f(a)*f(c)<0 then b=c
if f(b)*f(c)<0 then a=c
sería mejor si hicieras
if f(c)>0 then b=c
else a=c
De esta manera, te ahorrás de calcular la función varias veces, lo cual aunque no sea mucha diferencia en este problema, sería útil si f fuera mas costosa de calcular.
Además tu código tenía un pequeño (pero no poco importante) problemita. Si por casualidad, f(c) da 0, el ciclo no hace nada. Por ejemplo, fijate que hubiera pasado si f(1,57)=0.
3. Habría que aclarar también que 100 iteraciones son suficientes, es decir, mostrar que $\frac{3,14}{ 2^{100}} <1$.
El for es hasta 100 porque sabía que así consigo un error muy chico, en todo caso mi programa me muestra que es menor a 2.10^-13. Podría haber hecho un do en vez de un for y salir si el error es menor a lo que pide el enunciado, pero como 100 pasos no me cuestan nada, así el número es mas exacto (esta mal dicho esto no?). Lo de las condicionales, si pongo como vos decis, el error seria menor o igual a uno de los extremos de (a,b), ahora veo que sirve mas hacer eso y tomar despues el valor de a, pero bueno en este caso sabía que c es irracional, sino trataba de despejarlo :P