Main Content

Ecuaciones no lineales con

Consideremos el problema de encontrar una solución a un sistema de ecuaciones no lineales cuyo jacobiano es escaso. La dimensión del problema en este ejemplo es 1000. El objetivo es encontrar tal que () = 0.xFx Suponiendo = 1000, las ecuaciones no lineales sen

F(1)=3x12x122x2+1,F(i)=3xi2xi2xi12xi+1+1,F(n)=3xn2xn2xn1+1.

Para resolver un gran sistema no lineal de ecuaciones, () = 0, puede utilizar el algoritmo reflexivo de región de confianza disponible en, un algoritmo a gran escala ().FxfsolveAlgoritmos a gran escala frente a mediano escala

Paso 1: escriba un archivo nlsf1. m que calcule los valores de la función objetiva y el jacobiano.

function [F,J] = nlsf1(x) % Evaluate the vector function n = length(x); F = zeros(n,1); i = 2:(n-1); F(i) = (3-2*x(i)).*x(i)-x(i-1)-2*x(i+1) + 1; F(n) = (3-2*x(n)).*x(n)-x(n-1) + 1; F(1) = (3-2*x(1)).*x(1)-2*x(2) + 1; % Evaluate the Jacobian if nargout > 1 if nargout > 1    d = -4*x + 3*ones(n,1); D = sparse(1:n,1:n,d,n,n);    c = -2*ones(n-1,1); C = sparse(1:n-1,2:n,c,n,n);    e = -ones(n-1,1); E = sparse(2:n,1:n-1,e,n,n);    J = C + D + E; end

Paso 2: llame a la rutina de resolución para el sistema de ecuaciones.

xstart = -ones(1000,1); fun = @nlsf1;  options = optimoptions(@fsolve,'Display','iter',...     'Algorithm','trust-region',...     'SpecifyObjectiveGradient',true,'PrecondBandWidth',0); [x,fval,exitflag,output] = fsolve(fun,xstart,options);

Se da un punto de partida, así como el nombre de la función. El método predeterminado para es Trust-region-dogleg, por lo que es necesario especificar como en el argumento con el fin de seleccionar el algoritmo de confianza-región.fsolve'Algorithm''trust-region'Opciones Establecer la opción en las causas para mostrar la salida en cada iteración.Display'iter'fsolve Configuración a, causas para utilizar la información jacobiana disponible en.'SpecifyObjectiveGradient'truefsolvenlsf1.m

Los comandos visualizan esta salida:

                                         Norm of      First-order 
 Iteration  Func-count     f(x)          step          optimality
     0          1            1011                            19
     1          2         16.1942        7.91898           2.35      
     2          3       0.0228027        1.33142          0.291      
     3          4     0.000103359      0.0433329         0.0201      
     4          5      7.3792e-07      0.0022606       0.000946      
     5          6     4.02299e-10    0.000268381       4.12e-05

Equation solved, inaccuracy possible.

fsolve stopped because the vector of function values is near zero, as measured by the value
of the function tolerance. However, the last step was ineffective.

Un sistema lineal se resuelve (aproximadamente) en cada iteración principal utilizando el método de degradado conjugada precondicionada. El ajuste a 0 en significa una diagonalPrecondBandWidthOpciones se utiliza el preacondicionador. (especifica el ancho de banda de la matriz de preacondicionamiento.PrecondBandWidth Un ancho de banda de 0 significa que sólo hay una diagonal en la matriz.)

A partir de los valores de optimalidad de primer orden, se produce una convergencia lineal rápida. El número de iteraciones de gradiente conjugada (CG) requeridas por iteración principal es bajo, a lo más cinco para un problema de 1000 dimensiones, lo que implica que los sistemas lineales no son muy difíciles de resolver en este caso (aunque se requiere más trabajo a medida que avanza la convergencia).

Si desea utilizar un preacondicionador tridiagonales, es decir, una matriz de preacondicionamiento con tres diagonales (o ancho de banda de uno), establezca el valor:PrecondBandWidth1

options = optimoptions(@fsolve,'Display','iter','SpecifyObjectiveGradient',true,...    'Algorithm','trust-region','PrecondBandWidth',1); [x,fval,exitflag,output] = fsolve(fun,xstart,options);

En este caso, la salida es

                                         Norm of      First-order   Iteration  Func-count     f(x)          step          optimality      0          1            1011                            19      1          2         16.0839        7.92496           1.92            2          3       0.0458181         1.3279          0.579            3          4     0.000101184      0.0631898         0.0203            4          5     3.16615e-07     0.00273698        0.00079            5          6     9.72481e-10     0.00018111       5.82e-05  Equation solved, inaccuracy possible.  fsolve stopped because the vector of function values is near zero, as measured by the value of the function tolerance. However, the last step was ineffective.

Tenga en cuenta que aunque el mismo número de iteraciones tiene lugar, el número de iteraciones PCG ha caído, por lo que se realiza menos trabajo por iteración. Ver.Método de gradiente conjugada precondicionado

Establecer en (este es el valor predeterminado) significa que el solucionador utiliza la factorización de Cholesky en lugar de PCG.PrecondBandWidthInf