Sistema de Ecuaciones No Lineales
Sistema de Ecuaciones No Lineales
Sistema de Ecuaciones No Lineales
lineales
En esta página, vamos a obtener las raíces de un sistema de ecuaciones transcendentes
aplicando el procedimiento de Newton-Raphson. Finalmente, utilizaremos la función
MATLAB fsolve para este propósito.
{x2−y2+2y=02x+y2−6=0{x2−y2+2y=02x+y2−6=0
>> hold on
>> ezplot('x^2-y^2+2*y',[-8,8,-8,8])
>> ezplot('2*x+y^2-6',[-8,8,-8,8])
>> hold off
>> title('Funciones implícitas')
>> grid on
Observamos que el sitema de ecuaciones tiene cuatro raíces, vamos a obtener estas
raíces aplicando el procedimiento de Newton-Raphson
Procedimiento de Newton-Raphson
Para aplicar este procedimiento para un sistema de n ecuaciones con n incógnitas,
representamos la variable x por x1 y la variable y por x2. El sistema de dos ecuaciones se
escribe de una forma más general
{f1(x1,x2)=0f2(x1,x2)=0{f1(x1,x2)=0f2(x1,x2)=0
f1(x1+Δx1,x2+Δx2)≈f1(x1,x2)+∂f1∂x1Δx1+∂f1∂x2Δx2f2(x1+Δx1,x2+Δx2)≈f2(x1,x2)+∂f2∂
x1Δx1+∂f2∂x2Δx2f1(x1+Δx1,x2+Δx2)≈f1(x1,x2)+∂f1∂x1Δx1+∂f1∂x2Δx2f2(x1+Δx1,x2+Δx2)≈f2(x
1,x2)+∂f2∂x1Δx1+∂f2∂x2Δx2
f1(x1,x2)+∂f1∂x1Δx1+∂f1∂x2Δx2=0f2(x1,x2)+∂f2∂x1Δx1+∂f2∂x2Δx2=0f1(x1,x2)+∂f1∂x1Δx1+∂f
1∂x2Δx2=0f2(x1,x2)+∂f2∂x1Δx1+∂f2∂x2Δx2=0
(f1f2)+⎛⎝⎜∂f1∂x1∂f2∂x1∂f1∂x2∂f2∂x2⎞⎠⎟(Δx1Δx2)=0(f1f2)+(∂f1∂x1∂f1∂x2∂f2∂x1∂f2∂x2)(Δx
1Δx2)=0
Denominamos vector x al vector (x1,x2), el vector función F está formado por dos
elementos que son las funciones (f1,f2) y la matriz cuadrada de dimensión dos es el
Jacobiano J. Despejamos Δx1 y Δx2 del sistema de ecuaciones o el vector Δx.
F(x)+JΔx=0Δx=−J−1FF(x)+JΔx=0Δx=−J−1F
J-1 es la matriz inversa de J y Δx es el vector diferencia entre el vector que nos da las
coordenadas del nuevo punto xk+1, conocidas las del punto previo xk
xk+1=xk−J−1Fxk+1=xk−J−1F
⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪f1(x1,x2...xn)=0f2(x1,x2...xn)=0...fn(x1,x2...xn)=0{f1(x1,x2...xn)=0f
2(x1,x2...xn)=0...fn(x1,x2...xn)=0
El procedimiento se escribe
⎛⎝⎜⎜⎜⎜x′1x′2...x′n⎞⎠⎟⎟⎟⎟=⎛⎝⎜⎜⎜x1x2...xn⎞⎠⎟⎟⎟−⎛⎝⎜⎜⎜⎜⎜⎜⎜∂f1
∂x1∂f2∂x1...∂fn∂x1∂f1∂x2∂f2∂x2...∂fn∂x2............∂f1∂xn∂f2∂xn...∂fn∂xn⎞⎠⎟⎟⎟⎟⎟⎟⎟−1⎛⎝⎜⎜⎜
⎜f1(x1,x2...xn)f2(x1,x2...xn)...fn(x1,x2...xn)⎞⎠⎟⎟⎟⎟(x1'x2'...xn')=(x1x2...xn)−(∂f1∂x1∂f
1∂x2...∂f1∂xn∂f2∂x1∂f2∂x2...∂f2∂xn............∂fn∂x1∂fn∂x2...∂fn∂xn)−1(f1(x1,x2...xn)f2(x1,x2...xn)...
fn(x1,x2...xn))
o bien, X=X-J\F, utilizando el operador MATLAB, división por la izquierda \. Se
obtiene el nuevo punto, el vector X de la izquierda, a partir del punto X previo, a la
derecha de la igualdad
Para el sistema de dos ecuaciones que hemos planteado al principio de esta sección
{x21−x22+2x2=02x1+x22−6=0{x12−x22+2x2=02x1+x22−6=0
El Jacobiano es
J=(2x12−2x2+22x2)J=(2x1−2x2+222x2)
El código MATLAB para calcular las raíces es similar al empleado para calcular una
raíz de la ecuación f(x)=0
F=@(x) [x(1)^2-x(2)^2+2*x(2);2*x(1)+x(2)^2-6];
J=@(x) [2*x(1),-2*x(2)+2;2,2*x(2)];
x=[-4.6;-3.8]; %punto inicial
i=0;
while i<100
y=-J(x)\F(x);
if sqrt(norm(y)/norm(x))<0.001
disp('Solución')
disp(x)
break;
end
x=x+y;
i=i+1;
end
if i>=100
disp('Se ha soprepasado el número de iteracciones');
end
En la primera línea se define el vector columna F de las funciones. En la segunda, la
matriz cuadrada J que representa el Jacobiano. En la tercera, las coordenadas del punto
inicial. En la representación gráfica de las dos funciones (figura más arriba), utilizamos
el icono denominado Data cursor del menú de la ventana gráfica, para conocer el valor
aproximado de una de las raíces (0,5, 2.2), que tomaremos como vector inicial de
partida para el procedimento de cálculo.
0.6252
2.1794
>> F(x)
ans = 1.0e-09 *
0.3991
0.0536
Cuando introducimos el valor de la raíz buscada x en la función F, vemos que se
obtiene un valor próximo a cero
Con Data cursor buscamos un valor próximo a la segunda raíz (-4.6,-3.8).
Modificamos en la tercera línea de código el vector inicial que tomamos para calcular la
raíz y obtenemos al correr el script modificado
-4.8642
-3.9659
>> F(x)
ans = 1.0e-09 *
0.2845
0.1122
El problema más importante para aplicar este procedimiento es la elección del vector
inicial, cuando el número de ecuaciones es tres o más.
La función fsolve
MATLAB dispone de una función denominada fsolve que realiza un cálculo similar
f1(x,y)=2x2-xy-5x-1=0
f2(x,y)=x+3log10x-y2=0
x=linspace(2.5,5.5,50);
y1=(2*x.^2-5*x-1)./x;
y2=sqrt(x+3*log10(x));
plot(x,y1,'b',x,y2,'r')
Vamos a utilizar la función fsolve de MATLAB para obtener el punto de intersección.
sin(xy)+exp(−xz)−0.9=0zx2+y2−−−−−−√−6.7=0tan(yx)+cosz+3.2=0sin(xy)+exp(−xz
)−0.9=0zx2+y2−6.7=0tan(yx)+cosz+3.2=0
Código En Matlab.
Inicialmente, al igual que en los programas de este tipo que hemos
hecho hasta este momento, nuestra función en Matlab, solo recibirá
como argumento de entrada, una función que depende de una sola
variable (definida con anticipación). Llamaremos a nuestra función
‘pfalse’