4 votos

No se pueden encontrar todas las raíces de la función con el método del punto fijo

Tengo una función $f(x) = x^2-8x-10\cos(2x)+15$ y se supone que a través de Matlab debo encontrar todas las raíces de esta función. Puedo ver gráficamente que tiene $4$ raíces y he escrito una función de matlab para encontrar una raíz. Cuando la diferencia absoluta entre $x_n$ y $x_{n+1}$ es menor que $10^{-10}$ la función devuelve $x_{n+1}$ como la raíz.

Ya que tiene $4$ raíces llamo a la función $4$ veces, con diferentes valores de partida cada vez, siendo todos ellos cercanos a alguna raíz.

El problema es el siguiente: se encuentran la 1ª y la 3ª raíz. Y las raíces 2ª y 4ª no. Al tratar de encontrar la 2ª raíz me devuelve el valor de la 1ª raíz, y al tratar de encontrar la 4ª raíz sólo hace un bucle que me dice $x_n$ es NaN .

Incluso cuando el valor de inicio cuando trato de encontrar la 2ª raíz es la raíz, sigue devolviendo la 1ª raíz.

Esto es para un laboratorio de la escuela y tiene que ser encontrado con un método de punto fijo que me han dado:

x_n = (1/15)x^2+(7/15)x-(2/3)cos2x+1

Mi función para encontrar las raíces tiene el siguiente aspecto

function root = fixpoint(x, T)

while true
    x_n = 1/15*(x^2)+7/15*x-2/3*cos(2*x)+1;
    error = abs(x_n-x);
    disp(['Error: ', num2str(error),' X_n: ', num2str(x_n)])

    if error < T
        break
    end

    x = x_n;

end

root = x_n;

end

Y lo llamo 4 veces con:

errorMargin = 10^-10;
p1 = fixpoint(2, errorMargin);
p2 = fixpoint(3.977, errorMargin);
p3 = fixpoint(5, errorMargin);
p4 = fixpoint(7, errorMargin);  

Y lo consigo: p1= 2.429 (correcto), p2= 2.429 (el real es 3,977), p3= 5.571 (correcto), p4 bucles 'NaN'

¿Qué tengo que hacer para encontrar todos los $4$ ¿Raíces?

6voto

Shabaz Puntos 403

Su problema es que la iteración de punto fijo sólo converge cuando la derivada del lado derecho es menor que $1$ en valor absoluto. Si se linealiza el problema, el error se multiplica por la derivada del RHS en cada paso. Si esa derivada es mayor que $1$ en valor absoluto, se alejará cada vez más de la raíz. El valor de la derivada en $3.977$ se trata de $2.3$ No dices cuál es la cuarta raíz, pero empezaste en $7$ y la derivada parece ser mayor que $1$ allí también. Un gráfico de la derivada de Alpha está abajo.
Plot from Alpha

3voto

user5713492 Puntos 61

Ese es el problema de la iteración en punto fijo: $$g(r+\epsilon)\approx g(r)+\epsilon g^{\prime}(r)$$ De modo que si $\left|g^{\prime}(r)\right|>1$ Las sucesivas iteraciones se alejarán de la raíz. Se le prescribió una iteración de punto fijo para utilizar, así que ¿cómo hacer que funcione frente a esta adversidad? Un pequeño análisis del problema puede ayudar: si $x_0=r+\epsilon$ entonces $x_1\approx r+\epsilon g^{\prime}(r)$ y $x_2\approx r+\epsilon \left(g^{\prime}(r)\right)^2$ . Entonces $$\frac{\left|x_2-x_1\right|}{\left|x_1-x_0\right|}\approx\left|g^{\prime}(r)\right|$$ Y sabemos que si $\left|g^{\prime}(r)\right|>1$ estamos en problemas. Pero en este caso, $$\epsilon\approx\frac{\left(x_1-x_0\right)^2}{x_2-2x_1+x_0}$$ Así que podemos restar esto de $x_0$ y espero acercarme a $r$ . Aquí está mi función de matlab:

% fixpoint.m

function x2 = fixpoint(f,x0);

quad = 0;
linear = 0;
x1 = f(x0);
err = 1;
calls = 1;
while abs(err) > 1.0e-10,
    x2 = f(x1);
    calls = calls+1;
    if abs(x2-x1) > abs(x1-x0),
        err = (x1-x0)^2/(x2-2*x1+x0);
        x0 = x0-err;
        x1 = f(x0);
        calls = calls+1;
        quad = 1;
    else
        err = x2-x1;
        x0 = x1;
        x1 = x2;
        linear = 1;
    end
end
x2 = x0;
if quad,
    fprintf('Quadratic method was used\n');
end
if linear,
    fprintf('Linear method was used\n');
end
fprintf('calls = %d\n',calls);

Y mi script que lo impulsa:

% fixtest.m

f = @(x) x.^2/15+7/15*x-2/3*cos(2*x)+1;
for x = [2.4 3.9 5.4 6.8],
    y = fixpoint(f,x);
    fprintf('%f %13.11f\n',x,y);
end

Y la salida:

>> fixtest
Linear method was used
calls = 33
2.400000 2.42974456196
Quadratic method was used
calls = 9
3.900000 3.97704805536
Linear method was used
calls = 11
5.400000 5.57154144613
Quadratic method was used
Linear method was used
calls = 10
6.800000 6.72106227846

Tenga en cuenta que fixpoint.m siempre detectaba si $\left|g^{\prime}(r)\right|>1$ correctamente desde el principio, por lo que nunca hubo que cambiar entre los métodos lineal y cuadrático. Ahora bien, si $g^{\prime}(r)=1$ Aún así, habría sido una tostada...

1voto

Hagen von Eitzen Puntos 171160

Está buscando puntos fijos de $g(x)=c\cdot f(x)-x$ . No es de extrañar que dos de los cuatro puntos fijos intersecten la diagonal $y=x$ desde abajo, es decir, en una pendiente $g'(x)>1$ . Tales puntos fijos son repelentes y te alejarán más con cada iteración. Sólo los puntos fijos en los que $|g'(x)|<1$ se puede encontrar iterando desde un punto de partida suficientemente cercano.

La solución es probar diferentes $c$ no sólo (como usted lo hizo) $c=\frac1{15}$ . ¿Qué cambio a $c$ podría hacer que el gráfico de $g$ ¿hacer que la diagonal se cruce desde arriba en su lugar?

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X