Nichtlineare Gleichungslöser in SPICE-Simulatoren

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

  • LTspice
  • Ngspice
  • Qucs

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].

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein

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 DI1N4004ist unser Diodenmodell in der Netzliste definiert? Beim Testen der obigen Löser gegen das Problem mit 70,000Knoten, dh 140,000Gleichungen und Unbekannten

  • Matlab hat keinen Speicher mehr
  • Qucs dauert ewig
  • Alle auf Gewürzen basierenden Löser haben dieses Problem irgendwie in weniger als 2 Sekunden gelöst

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,000die 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

  • Matlab Fsolve: Dogleg-Methode [Newton + Trust-Region + steilster Abstieg] [4]
  • Qucs: gedämpfter Newton-Raphson [5]

Meine Fragen sind

  • Wie hat Spice es geschafft, ein so riesiges System nichtlinearer Gleichungen schnell und ohne Speichermangel zu lösen? nutzt es die Schaltungsstruktur aus, indem es die wiederholten Elemente verwendet?
  • Ist dieses Beispiel fair genug? Ich meine, müssen wir praktischere Schaltungen in Betracht ziehen? 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?
  • In [6] erwähnten die Autoren ISCAS85-Benchmark-Schaltungen. Sollten wir diese Schaltungen in unseren Tests berücksichtigen?
  • 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?

Verweise

1 : http://www.ni.com/white-paper/5808/en/

2: http://www.ecircuitcenter.com/SpiceTopics/Overview/Overview.htm

3 : http://www.electronicdesign.com/boards/taking-peek-under-hood-your-spice-circuit-simulation-engine

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

Ich habe im Moment keine Zeit zu antworten, aber dieses Buch kann Ihnen eine gute Vorstellung davon geben, wie Schaltungssimulatoren ihre Magie vollbringen, ich kann es nur empfehlen: amazon.com/Circuit-Simulation-Farid-N-Najm/dp/ 0470538716/…
Sie könnten erwägen, (eine Teilmenge?) dieser Frage zur Computerwissenschaft zu stellen
Dies ist nicht wirklich eine Frage der Elektronik ... SPICE ist AFAIK nicht einmal nur auf die Elektronik beschränkt. Sollte es nicht auf Math.SE oder SciComp.SE oder CS.SE oder etwas anderem sein?
@Mehrdad Ich stimme ThePhoton vollkommen zu, nur ein Teil der Frage sollte auf cse.se gestellt werden, aber in Anbetracht der restlichen Fragen denke ich, dass dies der beste Ort ist, um sie zu stellen.

Antworten (1)

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.

Hut zurück an Sie, weil Sie eine Online-Version von Nagels Artikel gefunden haben. (Ich glaube, es war eine Abschlussarbeit, die sich dann aber in eine Art Memorandum der Abteilung verwandelt hat.)
@jonk, ich glaube, du hast mir vor ein paar Wochen (Monaten?) den Link dazu gegeben.
Ich glaube, ich habe die Referenz selbst angegeben, weil ich eine vollständige Kopie davon in Papierform habe, die ich vor weit mehr als einem Jahrzehnt direkt von Berkeley bekommen habe. Vielleicht warst du es nicht, der den Link gefunden hat. Aber ich erinnere mich definitiv, dass ich nichts von der Webversion wusste, bis ich sie hier am 20. Juni dieses Jahres veröffentlicht sah. (Natürlich geschnappt, da ich es mag, nach Wörtern suchen zu können.)
Heutzutage werden Sparse-Solver für fast alles verwendet, einschließlich dichter Matrizen. Wenn man sich jedoch den Schaltplan des OP ansieht, sind die Systemmatrizen wahrscheinlich mit einer sehr kleinen Bandbreite gebändert - möglicherweise sogar tridiagonal. Wenn Sie diese Tatsache in Ihrem Matlab-Code ignorieren, können Sie mit sehr geringem Aufwand Beschleunigungsfaktoren von 1000 oder mehr erwarten, selbst wenn Sie numerische Algorithmen aus den 1960er Jahren verwenden, nicht moderne, die schwerer zu verstehen sind!
@alephzero, soweit ich weiß, basiert LTSpice auf SPICE3, einer Codebasis aus den 1980er Jahren. Matlab basiert auch AFAIK auf einer ziemlich alten Codebasis, und wie ich in der Antwort sagte, werden Sie wahrscheinlich explizit nach einer Sparse-Matrix fragen, wenn Sie dies möchten.
Vielen Dank für diese großartige Antwort. Es stellt sich heraus, dass selbst der von uns verwendete Open-Source-CKT-Simulator die MNA-Matrix als Sparse-Matrix behandelt, wenn sie zu groß ist. Außerdem hatten wir fast die gleiche Leistung, als wir Matlab ausdrücklich sagten fsolve, dass dies ein Sparse-System ist. Nochmals vielen Dank für Ihre Antwort und für Ihre Zeit.
@Elbehery, um eine bessere Leistung von Matlab zu erzielen, müssen Sie möglicherweise sehr darauf achten, dass die Matrix niemals als dichte Matrix gespeichert oder zwischen dichten und spärlichen Darstellungen konvertiert wird. Leider weiß ich nicht genug über Matlab, um detailliertere Ratschläge zu geben.
„Der transiente Solver linearisiert die Schaltung bei jedem Zeitschritt, berechnet aber die lokale lineare Ersatzschaltung für jeden Zeitschritt neu“ ist nur ein Teil der Geschichte. SPICE passt die Vorrichtungs-Bias-Parameter für die leicht unterschiedlichen neuen Arbeitspunkte an, die vom linearen Solver gefunden werden. Dann wird es (teilweise) wieder linearisiert und wiederholt, bis die Fehler innerhalb der angegebenen Grenzen liegen.