/ / El método más rápido para resolver sistemas de ecuaciones no lineales en MATLAB: matlab, rendimiento, eficiencia de procesamiento, bigdata

El método más rápido para resolver el sistema de ecuaciones no lineales en MATLAB - matlab, rendimiento, eficiencia de procesamiento, bigdata

Supongamos que tenemos tres ecuaciones:

 eq1 =  x1 + (x1 - x2) * t - X         == 0;
eq2 =  z1 + (z1 - z2) * t - Z         == 0;
eq3 = ((X-x1)/a)^2 + ((Z-z1)/b)^2 - 1 == 0;

mientras que seis de las variables conocidas son:

a  =  42 ;
b  =  12 ;
x1 =  316190;
z1 =  234070;
x2 =  316190;
z2 =  234070;

Entonces estamos buscando tres variables desconocidas que son:

X , Z and t

Escribí dos métodos para resolverlo. Pero, como necesito ejecutar este código para 5.7 millones de datos, se vuelve muy lento.

Método uno (usando "resolver"):

tic
S  = solve( eq1 , eq2  , eq3 , X , Z , t ,...
"ReturnConditions", true, "Real", true);
toc
X = double(S.X(1))
Z = double(S.Z(1))
t = double(S.t(1))

resultados del primer método:

X =  316190;
Z =  234060;
t = -2.9280;
Elapsed time is 0.770429 seconds.

Método dos (usando "fsolve"):

coeffs = [a,b,x1,x2,z1,z2];       % Known parameters
x0     = [ x2 ; z2 ; 1 ].";       % Initial values for iterations
f_d = @(x0) myfunc(x0,coeffs);    % f_d considers x0 as variables
options = optimoptions("fsolve","Display","none");
tic
M = fsolve(f_d,x0,options);
toc

Resultados del método dos:

 X =  316190; % X = M(1)
Z =  234060; % Z = M(2)
t = -2.9280; % t = M(3)
Elapsed time is 0.014 seconds.

Aunque, el segundo método es más rápido, pero aún debe mejorarse. Por favor, avíseme si tiene una mejor solución para eso. Gracias


* información extra: Si te interesa saber cuales son esos 3.Las ecuaciones son, las dos primeras son ecuaciones de una línea en 2D y la tercera ecuación es una ecuación de elipse. Necesito encontrar la intersección de la línea con la elipse. Obviamente, tenemos dos puntos como resultado. Pero, olvidemos la segunda respuesta para la simplicidad.

Respuestas

1 para la respuesta № 1

Mi sugerencia es utilizar el segundo approce, que es el recomendado por matlab para el sistema de ecuaciones no lineales. Declara una función M

function Y=mysistem(X)
%X(1) = X
%X(2) = t
%X(3) = Z
a  =  42 ;
b  =  12 ;
x1 =  316190;
z1 =  234070;
x2 =  316190;
z2 =  234070;
Y(1,1) = x1 + (x1 - x2) * X(2) - X(1);
Y(2,1) = z1 + (z1 - z2) * X(2) - X(3);
Y(3,1) = ((X-x1)/a)^2 + ((Z-z1)/b)^2 - 1;
end

Entonces para resolver el uso

x0     = [ x2 , z2 , 1 ];
M = fsolve(@mysistem,x0,options);

Si desea reducir la precisión predeterminada cambiando StepTolerance (por defecto 1e-6). También para más incre- rados, es posible que desee utilizar la matriz jacobiana para obtener mayores eficiencias. Para más referencia, eche un vistazo en la documentación oficial: fsolve Ecuaciones no lineales con jacobiano analítico.

Básicamente, al darle al solucionador la matriz jacobiana del sistema (y las opciones especiales) puede aumentar la eficacia del método.