Wir haben eine Aufgabe in der Parallelverarbeitungsklasse, das Ziel ist es, einen Solver für nichtlineare Gleichungen auf cuda basierend auf der Newton-Raphson-Methode zu implementieren und diesen Solver mit einer Anwendung zu verbinden, die sich mit nichtlinearen Gleichungssätzen befasst. Wir wollten unseren Solver mit Schaltungssimulatoren verbinden . Wir haben uns einen Open-Source-Simulator zugelegt und jedes Mal, wenn der Simulator eine DC-Arbeitspunktsimulation durchführt, ruft er unseren Cuda-Code auf. An dieser Stelle wollten wir die Leistung unseres Solvers mit Solvern vergleichen, die in anderen Schaltungssimulatoren implementiert sind, wie z
Und auch andere Software-Löser, zB die Matlab-Optimierungs-Toolbox
Wir haben diese Löser anhand einer Schaltung getestet [die auf einen riesigen Satz nichtlinearer Gleichungen abgebildet werden sollte].
Die Schaltungsnetzliste wird von einem Skript generiert, in dem die Anzahl der Knoten angegeben ist. Wir haben den Satz nichtlinearer Gleichungen, die die obige Schaltung bestimmen, wie folgt formuliert
Die Unbekannten x[i]
in diesem Satz von Gleichungen sind die Spannungsknoten und der Strom an jedem Widerstand
Wir haben es geschafft, dies als Matlab-Funktion zu schreiben, um diese Schaltung gegen nichtlineare Matlab-Solver-Algorithmen zu testen, die in der Optimierungs-Toolbox enthalten sind.
function F = non_linear_diode(X)
% Len(x) is always even 2*d
d = length(X)/2;
F = zeros(1, d*2);
i = 1e-3; % Current source magnitude
r = 50; % Resistors value
c1 = 1e-15; % Diodes I_s
c2 = 0.0258; % Diodes N*V_th
F(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);
for ii = 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);
end
F(d*2) = X(2*d) - c1*(exp(X(d+1)/c2) -1);
end
Wir haben auch ein Skript geschrieben, um eine Spice-Netzliste für dieses Problem zu generieren
def gen_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"
Wo DI1N4004
ist unser Diodenmodell in der Netzliste definiert? Beim Testen der obigen Löser gegen das Problem mit 70,000
Knoten, dh 140,000
Gleichungen und Unbekannten
Wir haben eigentlich keine Ahnung, wie Spice Solver es geschafft haben, dieses Speicherproblem zu vermeiden, und selbst wenn dieses Problem mit einer geringeren Anzahl von Unbekannten getestet wird, übertreffen zB 3,000
die Spice Solver immer Matlab und qucs. Wie in [1] [2] [3] erwähnt, verwendet Spice jedoch den gedämpften Newton-Raphson-Ansatz, um Schaltungen mit nichtlinearen Komponenten zu lösen, was derselbe ist wie bei allen oben genannten Lösern
Fsolve
: Dogleg-Methode [Newton + Trust-Region + steilster Abstieg] [4]Meine Fragen sind
Verweise
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
Wie hat Spice es geschafft, ein so riesiges System nichtlinearer Gleichungen schnell und ohne Speichermangel zu lösen?
Google Sparse-Matrix-Löser .
Ein gutes SPICE verwendet sehr wahrscheinlich einen Sparse-Matrix-Solver (oder weiß, wann er wechseln muss), da große Schaltungen typischerweise Sparse-Matrizen erzeugen (jeder Knoten ist nur mit einem kleinen Bruchteil der Zweige verbunden), wäre dies eine offensichtliche Optimierung zu verwenden (oder zu haben). verfügbar) ein Sparse-Matrix-Solver in einem SPICE. Sogar Nagels ursprünglicher Bericht (These?) von 1975 über SPICE diskutiert die Verwendung von Methoden mit dünnbesetzten Matrizen.
Matlab hat sicherlich einen Sparse-Matrix-Solver zur Verfügung, aber Sie müssen ihn wahrscheinlich explizit aufrufen.
Qucs verfügt möglicherweise nicht über diese Fähigkeit oder ist möglicherweise nicht besonders gut implementiert, da es sich um ein relativ rohes Open-Source-Projekt handelt und seine Entwickler möglicherweise noch nicht an dem Punkt angelangt sind, es an etwas Größerem als einem Spielzeugproblem zu testen.
(Huttipp an @jonk für den Link zum Nagel-Bericht)
Ist dieses Beispiel fair genug? Ich meine, müssen wir praktischere Schaltungen in Betracht ziehen?
Ich denke, Sie möchten Ihren Löser auf einer Vielzahl verschiedener Arten von Schaltungen demonstrieren. Sie möchten wahrscheinlich Schaltkreise in Betracht ziehen, von denen bekannt ist, dass sie schlecht konditionierte Matrizen erzeugen. Positive Rückkopplungsschaltungen bereiten auch häufig Schwierigkeiten für nichtlineare Löser.
und wenn ja, kann jemand ein Beispiel für eine oder mehrere Schaltungen geben, bei denen die DC-Arbeitspunktsimulation der Engpass der Simulationszeit sein könnte?
Ich würde erwarten, dass dies in jedem schlecht konditionierten Stromkreis üblich ist, wenn eine AC-Simulation eingerichtet wird.
Ist der DC-Betriebspunkt der Simulationstyp, den wir anstreben sollten? Ich meine, sollten wir uns darauf konzentrieren, unseren Löser mit anderen Arten von Simulationen zu verbinden, zB mit der transienten Analyse?
Die anderen Hauptsimulationstypen (ac und transient) erfordern nur lineare Solver. Bei der AC-Simulation geht es explizit um kleine Schwankungen um den Arbeitspunkt, sodass die Schaltung störungstheoretisch als linear angesehen werden kann. Der transiente Solver linearisiert die Schaltung bei jedem Zeitschritt, berechnet jedoch die lokale lineare Ersatzschaltung für jeden Zeitschritt neu. Wenn Sie also versuchen, einen nichtlinearen Solver zu demonstrieren, sollten Sie den DC-Solver demonstrieren.
fsolve
, dass dies ein Sparse-System ist. Nochmals vielen Dank für Ihre Antwort und für Ihre Zeit.
John D
Das Photon
Benutzer541686
Elbeherie