Tenemos una asignación en la clase de procesamiento Paralelo, el objetivo es implementar un Solucionador de ecuaciones no lineales en cuda basado en método de Newton Raphson e interconecta este solucionador con una aplicación que trata con un conjunto de ecuaciones no lineales. Queríamos conectar nuestro solver con simuladores de circuito . Hemos seleccionado un simulador de código abierto y cada vez que el simulador realiza una simulación de punto de operación de CC, invocará nuestro código cuda. En este punto, queríamos comparar el rendimiento de nuestro solucionador con los solucionadores implementados en otros simuladores de circuito, como
- LTspice
- Ngspice
- Qucs
Y también otros solucionadores de software, por ejemplo, Caja de herramientas de optimización de Matlab
Hemos probado estos solucionadores contra un circuito [que debería corresponder a un gran conjunto de ecuaciones no lineales.]
Lalistadeconexionesdelcircuitosegeneramedianteunasecuenciadecomandosdondeseproporcionaelnúmerodenodos.Hemosformuladoelconjuntodeecuacionesnolinealesquerigenelcircuitoanteriorcomosigue:
Lasincógnitasx[i]
enesteconjuntodeecuacionessonlosnodosdevoltajeylacorrienteencadaresistencia
Hemoslogradoescribirestocomounafunciónmatlabparaprobarestecircuitocontralosalgoritmosdesoluciónnolinealmatlabqueaparecenenlacajadeherramientasdeoptimización.
functionF=non_linear_diode(X)%Len(x)isalwayseven2*dd=length(X)/2;F=zeros(1,d*2);i=1e-3;%Currentsourcemagnituder=50;%Resistorsvaluec1=1e-15;%DiodesI_sc2=0.0258;%DiodesN*V_thF(1)=X(1)-X(2)-i*r;F(d)=X(d)-X(d+1)-X(2*d)*r;F(d+1)=i-c1*(exp(X(2)/c2)-1)-X(d+2);forii=2:(d-1)F(ii)=X(ii)-X(ii+1)-X(ii+d)*r;F(ii+d)=X(ii+d)-c1*(exp(X(ii+1)/c2)-1)-X(ii+d+1);endF(d*2)=X(2*d)-c1*(exp(X(d+1)/c2)-1);end
TambiénhemosescritounscriptparagenerarlalistaderedesdeSpiceparaesteproblema
defgen_ckt(num):ret=""
for i in range(1, num):
ret += 'R'+str(i)+" "+str(i)+" "+str(i+1)+" 50\n"
ret += 'D'+str(i)+" "+str(i+1)+" 0 DI1N4004\n"
Donde DI1N4004
es nuestro modelo de diodo definido en la lista de redes. Al probar los solucionadores anteriores contra el problema con 70,000
nodos, es decir, 140,000
ecuaciones y incógnitas
- Matlab se queda sin memoria
- Qucs toma para siempre
- Todos los solucionadores basados en especias resolvieron de alguna manera este problema en menos de 2 segundos
En realidad no tenemos idea de cómo los solucionadores de especias lograron evitar este problema de memoria, e incluso cuando probamos este problema con un número menor de incógnitas, por ejemplo. 3,000
los solucionadores de especias siempre superan a matlab y qucs. Aunque como se menciona en [1] [2] [3] spice utiliza el enfoque de Newton-Raphson amortiguado para resolver circuitos con componentes no lineales que es el mismo que todos los solucionadores mencionados anteriormente
- Matlab
Fsolve
: método de dogleg [Newton + Trust-region + más decente] [4] - Qucs: amortiguado Newton-Raphson [5]
Mis preguntas son
- ¿Cómo logró Spice resolver un sistema tan grande de ecuaciones no lineales de forma rápida y sin quedarse sin memoria? ¿Está explotando la estructura del circuito haciendo uso de los elementos repetidos?
- ¿Este ejemplo es suficientemente justo? Quiero decir, ¿necesitamos considerar circuitos más prácticos? y si es así, ¿alguien puede dar un ejemplo de un circuito (s) donde la simulación del punto de operación de CC podría ser el cuello de botella del tiempo de simulación?
- En [6] los autores mencionaron circuitos de referencia ISCAS85 ¿deberíamos considerar estos circuitos en nuestras pruebas?
- ¿El punto de operación de CC es el tipo de simulación al que debemos dirigirnos? Quiero decir, deberíamos enfocarnos para conectar nuestro solucionador con otros tipos de simulaciones, por ejemplo. ¿El análisis transitorio?
Referencias
1: http://www.ni.com/white-paper/5808/en/
2: http://www.ecircuitcenter.com/SpiceTopics/Overview/Overview.htm
4: https://www.mathworks.com/help/optim/ug/fsolve.html
5: http://qucs.sourceforge.net/tech/node16.html
6: http://www.mos-ak.org/bucharest/presetnations/Lannutti_MOS -AK_Bucharest.pdf