Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Definieremos una función para calcular las raíces múltiples de una función
f(x)=0
Para hallar la raíz de la función en el intervalo (a, b), se divide el intervalo en la mitad.
m=(a+b)/2
El nuevo intervalo reducido se divide por la mitad y se procede de igual forma. Finalmente, en una cierta
etapa del proceso tendremos bien la raíz exacta de la función f(x), o una secuencia de intervalos cada vez
más reducidos [a1,b1], [a2,b2], .... [ai, bi]... tal que
1
f (an )f (bn ) < 0 bn − an = (b − a)
n
2
Como los puntos extremos de la izquierda a1, a2, ... an, ...forman una sucesión creciente y acotada, y los de
la derecha b1, b2, ... bn, ... una sucesión acotada decreciente, existe un límite común que es la raíz ξ buscada.
ξ = lim an = lim bn
n→∞ n→∞
Si queremos conocer el valor de la raíz con un error menor que ε, tenemos que realizar un número n de
iteracciones tal que
1 b − a
n > ln ( )
ln 2 ε
|f (x)| < ε1
En segundo lugar, no podemos programar un proceso indefinido, es preciso, que la rutina repetitiva acabe en
un momento dado. El criterio empleado es el siguiente
∣ an − bn ∣
∣ ∣ < ε2
∣ m ∣
Siendo ε2 cierta cantidad prefijada. La raíz se encuentra en el intervalo (an, bn) y m es el punto medio de
dicho intervalo.
El tercer criterio de terminación establece, que el proceso de búsqueda de la raíz se interrumpirá después de
un número prefijado de iteraciones, notificándose al usuario que no se ha encontrado la raíz de la función
con las condiciones fijadas anteriormente.
Para poder codificar este procedimiento hemos de seguir los pasos siguientes
Definimos la función f para calcular la raíz de la ecuación trascendente y buscamos la raíz en el intervalo
(0.5,1) haciendo 10 iteracciones. Vamos a la ventana de comandos
Nos da un mensaje de error bien por que hemos puesto pocas iteracciones MAXITER, o por que no
acotamos suficientemente el intervalo (a,b).
>> punto_medio(func,0.7,0.8,10)
ans = 0.7393
Raíces múltiples
La representación gráfica de la función en una pantalla de alta resolución nos permitirá estimar los
intervalos en los que la función cambia de signo y aplicar en consecuencia, el procedimiento mitad a cada
intervalo. Si no es posible una representación gráfica o esta no es de la suficiente resolución, será preciso
explorar el eje X en busca de intervalos en los que la función cambia de signo. Cuando los encontremos
aplicaremos a cada uno de ellos el procedimiento del punto medio.
Esta exploración no es sencilla, ya que podemos encontrarnos con intervalos en que la función no cambia
de signo ya sea por que no tiene raíces, o por que tiene un número par, tal como se ve en las figuras. La
solución a este problema es hacer más pequeño el intervalo de exploración, esto implica más tiempo de
cálculo y no garantiza que las raíces puedan ser encontradas si algunas de ellas están muy juntas, o la
curva es tangente al eje X.
Las situaciones en las que nos podemos encontrar cuando buscamos las raíces de una función y=f(x) en un
intervalo (a,b) se muestran en la figura
f(a) y f(b) tienen el mismo signo, no hay raíz de la función en dicho intervalo, pero también puede
ocurrir que haya un número par de raíces en dicho intervalo.
f(a) y f(b) tienen distinto signo, hay una raíz de la función en dicho intervalo, pero también puede
ocurrir que haya un número impar de raíces en dicho intervalo.
Vamos a crear un procedimiento que nos permita buscar los intervalos en los que la función cambia de
signo y calcular la raíz en cada uno de ellos, definiendo una función denominada buscar_intervalos.
Se divide el intervalo (a,b) en n-1 intervalos igualmente espaciados (n divisiones incluidos los extremos) se
calcula si en los extremos de los cada uno de los pequeños intervalos la función cambia de signo, en caso
afirmativo se guardan los extremos (xj, yj) de dicho intervalo en una matriz xb. Si la matriz está vacía (no
tiene ningún elemento) isempty, un mensaje nos lo indica. La función devuelve los intervalos (xj, yj)
guardados en la matriz xb.
function xb = buscar_intervalos(f,a,b,n)
x = linspace(a,b,n);
j = 0;
for i = 1:length(x)-1
if sign(f(x(i))) ~= sign(f(x(i+1)))
j = j + 1;
xb(j,1) = x(i);
xb(j,2) = x(i+1);
end
end
if isempty(xb)
disp('no se han encontrado cambios de signo')
else
disp(['número de intervalos:' int2str(j)])
end
end
Este código es correcto, pero se puede hacer más eficiente, un asunto de vital importancia en el cálculo
intensivo. Nos daremos cuenta, que se calcula dos veces la función f para el mismo valor de x, en el final de
un intervalo y en el comienzo del siguiente, ahorraremos el tiempo que tarda al procesador en realizar estas
operaciones si guardamos el valor de f(x) calculado al final del intervalo previo en la variable local y2 y lo
asignamos a la variable y1, que guarda el valor de la función f(x) en el principio del intervalo siguiente.
function xb = buscar_intervalos(f,a,b,n)
x = linspace(a,b,n);
j = 0;
y1=f(x(1));
for i = 1:length(x)-1
y2=f(x(i+1));
if sign(y1) ~= sign(y2)
j = j + 1;
xb(j,1) = x(i);
xb(j,2) = x(i+1);
end
y1=y2;
end
if isempty(xb)
disp('no se han encontrado cambios de signo')
else
disp(['número de intervalos:' int2str(j)])
end
end
Los mínimos de intensidad son los ceros de la función de Bessel J1(x) cuya representación gráfica vemos
en la figura
Si exploramos el intervalo comprendido entre a=0 y b=30, tomando 6 intervalos, de anchura Δx=5 tal como
vemos en la figura, la función cambia de signo en los intervalos (0,5), (5,10) y (20,25), pero no cambia de
signo en los intervalos (10,15), (15,20) y (25,30) por tener un número par de raíces. Luego, si exploramos la
función J1(x) en el intervalo (0,30) tomando 6 intervalos de anchura Δx=5 encontraremos solamente tres
raíces de las nueve existentes.
Nota: omitimos el origen x=0, por que se produce un máximo (no un mínimo de intensidad)
J1 (x)
lim ( ) = 1
x→0 x
La función buscar_intervalos, busca los intervalos en los que la función J1(x) cambia de signo, el intervalo en
el que se explora la función es (0.1, 30), omitimos el origen. El número de divisiones del intervalo es 50,
incluyendo los extremos. La función devuelve la matriz xb, que guarda los extremos (xj, yj) de cada intervalo
en los que la función cambia de signo. La dimensión de la martriz xb nos la proporciona la función size y se
guarda en el vector nb de dos elementos [filas, columnas]. El número de columnas nb(2) de la matriz es dos
y el número de filas nb(1) es el número de intervalos.
Para cada intervalo en el que la función cambia de signo, se aplica el procedimiento del punto medio,
llamando a la función punto_medio, para buscar la raíz en dicho intervalo.
J1=@(x) besselj(1,x);
xb=buscar_intervalos(J1,0.1,30,50);
nb=size(xb);
disp('mínimos: difracción por abertura circular')
for i=1:nb(1)
min(i)=punto_medio(J1,xb(i,1),xb(i,2),50);
disp(min(i))
end
En la ventana de comandos corremos el script para resolver la ecuación trascendente J1(x)=0 en el intervalo
(0.1,30)
tan(x)-x=0
En la figura, se representan la recta y=x (color azul) y la función y=tan(x) (color rojo). Se ha hecho más
pequeña la escala vertical que la horizontal.
Como observamos en la gráfica los máximos secundarios ocurren aproximadamente para xn≈(2n+1)π/2
donde n=±1, ±2, ±3...
f=@(x) tan(x)-x;
xb=buscar_intervalos(f,0.1,7*pi/2,10);
nb=size(xb);
disp('máximos secundarios: difracción por una rendija')
for i=1:nb(1)
max(i)=punto_medio(f,xb(i,1),xb(i,2),50);
disp(max(i))
end
Como hemos visto en la figura (más arriba), la primera raíz es próxima a 3π/2=4.7124, la segunda, es
próxima 5π/2=7.8540 y la tercera es próxima a 7π/2=10.9956. El resultado que hemos obtenido difiere
notablemente. No parece adecuado el procedimiento del punto medio para calcular las raíces de la
ecuación tan(x)-x=0. El problema radica, como se vé en la figura, en que la tangente se hace muy grande en
valores próximos a xn≈(2n+1)π/2.
y=x·cos(x)-sin(x)
f=@(x) x*cos(x)-sin(x);
xb=buscar_intervalos(f,0.1,7*pi/2,50);
nb=size(xb);
disp('máximos: difracción por una rendija')
for i=1:nb(1)
r(i)=punto_medio(f,xb(i,1),xb(i,2),50);
disp(max(i))
end
En la ventana de comandos
Comparamos las raíces obtenidas con la representación gráfica y vemos que hemos obtenido un resultado
mejor. Un procedimiento numérico no siempre es adecuado para resolver un problema particular.