Autor Beitrag
Tastaro
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 414
Erhaltene Danke: 23



BeitragVerfasst: Mi 05.03.14 15:48 
Hallo,

ich möchte den elektrischen Widerstand einer Schaltung "Black box" mit zwei Anschlüssen berechnen.
Vorgabe:
Innerhalb der Box In der Schaltung befinden sich zwischen den beiden Anschlüssen Widerstände, die in beliebiger Anordnung und Kombination parallel oder seriell miteinander verbunden sein können.

Was ich schon habe:
Eine Datenstruktur, die das Netzwerk beschreibt:
(Einfaches) Beispiel:
ausblenden Quelltext
1:
Anschluss1 - Leitung - Verbindungspunkt - Widerstand1 - Verbindungspunkt - Leitung - Verbindungspunkt - Widerstand2 - Verbindungspunkt - Leitung - Anschluss2					


Mit dieser Struktur kann ich auch die verschiedenen möglichen Pfaden zwischen den beiden Anschlüssen ermitteln.
Beispiel:
ausblenden Quelltext
1:
2:
Anschluss1 - Leitung - V.Punkt - Widerstand1 - V.Punkt - Leitung - V.Punkt - Widerstand2 - V.Punkt - Leitung - Anschluss2
                           \   - Widerstand3 -   /


Ich kann ermitteln:
ausblenden Quelltext
1:
Anschluss1 - Widerstand1 - Widerstand2 - Anschluss2					

und
ausblenden Quelltext
1:
Anschluss1 - Widerstand3 - Widerstand2 - Anschluss2					


Nutzt mir leider für die Berechnung des Gesamtwiderstands nicht so richtig viel.

Kennt jemand Codebeispiele für solche Berechnungen (am liebsten in Delphi)?

Für ein paar Denkanstöße wäre ich aber auch dankbar.

Beste Grüße


Zuletzt bearbeitet von Tastaro am Mi 05.03.14 16:20, insgesamt 1-mal bearbeitet
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 05.03.14 16:13 
Irgendwas verstehe ich an deinem Problem wohl nicht so ganz. Du hast also eine Blackbox: eine Kiste, aus der zwei Kabel herausragen und in die du nicht hineinschauen kannst. Dennoch scheinst du genau zu wissen, was in dieser Kiste verdrahtet ist? Denn so kommt deine Anfrage bei mir an. Um eine Berechnung des Gesamtwiderstands von seriell und parallel geschalteten Widerständen durchführen zu können, mußt du jedoch die genaue Verdrahtung kennen. Was könnte dann mit der Bezeichnung "Blackbox" gemeint sein?

Nehmen wir einmal an, es handle sich nicht um eine Blackbox und du kannst die Verdrahtung sowie die Werte auf den Widerständen genau erkennen. Wo liegt dann das Problem? Bei zwei Widerständen in Reihe (seriell) geschaltet ergibt sich der Gesamtwiderstand aus der Summe, bei zwei parallel verdrahteten Widerständen aus dem Durchschnitt beider Werte ((Wert1 + Wert2) / 2).
Tastaro Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 414
Erhaltene Danke: 23



BeitragVerfasst: Mi 05.03.14 16:19 
Hallo,

Du hast Recht. Meine Beschreibung ist nicht korrekt. Ich kann in die Box hineinsehen und weiß was drin ist und wie es verdrahtet ist.

Ich wollte verdeutlichen, dass sich eine beliebige Anzahl von Widerständen in beliebiger Anordnung in der Schaltung befinden kann.

Entschuldigung für die Verwirrung.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 05.03.14 16:20 
Hallo!

Das mit der Blackbox habe ich auch nicht verstanden ;-)

Davon abgesehen wird sich die Berechnung stark danach richten, wie Deine Datenstruktur realisiert ist. In C# würde ich das zum Beispiel mal so machen:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
  // Interface, welches von Einzelwiderständen und Widerstandsgruppen implementiert werden muss
  public interface IResistor
  {
    double GetResistance();
  }

  // Basisklasse für verknüfte Widerstände, egal ob Parallel oder Seriell
  public abstract class ResistorGroup : IResistor
  {
    protected List<IResistor> resistors = new List<IResistor>();

    // Leere Gruppe erzeugen
    public ResistorGroup() { }

    // Gruppe aus Array erzeugen, ist praktischer fürs "Zusammenbauen"
    public ResistorGroup(params IResistor[] resistors) {
      this.resistors.AddRange(resistors);
    }

    // IResistor hinzufügen, kann ein einzelner Widerstand oder eine Gruppe sein
    public void AddResistor(IResistor resistor)
    {
      resistors.Add(resistor);
    }

    // Das muss in abgeleiteten Klassen implementiert werden
    public abstract double GetResistance();
  }


  // Parallelschaltung
  public class ParallelResistors : ResistorGroup
  {
    // Konstruktoren der Basisklasse aufrufen
    public ParallelResistors() : base() { }
    public ParallelResistors(params IResistor[] resistors) : base(resistors) { }

    // Widerstand aus Unterwiderständen berechnen
    public override double GetResistance()
    {
      double result = 0;
      foreach (var resistor in resistors)
        result += 1 / resistor.GetResistance();
      return result;
    }
  }

  // Serienschaltung
  public class SerialResistors : ResistorGroup
  {
    // Konstruktoren der Basisklasse aufrufen
    public SerialResistors() : base() { }
    public SerialResistors(params IResistor[] resistors) : base(resistors) { }

    // Widerstand aus Unterwiderständen berechnen
    public override double GetResistance()
    {
      double result = 0;
      foreach (var resistor in resistors)
        result += resistor.GetResistance();
      return result;
    }    
  }

  // Einzelner Widerstand
  public class Resisitor : IResistor
  {
    private double resistance;

    public Resisitor(double resistance)
    {
      this.resistance = resistance;
    }

    public double GetResistance()
    {
      return resistance;
    }
  }


    public class Program
    {
        static void Main(string[] args)
        {
      var box = new SerialResistors(
        new Resisitor(3.0),
        new ParallelResistors(
          new Resisitor(1.0),
          new SerialResistors(
            new Resisitor(1.0),
            new Resisitor(1.0)
          )
        )
      );

      Console.WriteLine(box.GetResistance());
      Console.ReadLine();
        }
    }


Das funktioniert natürlich nur, wenn es wirklich nur Parallel- und Serienschaltungen sind. Komplizierte Netze sind damit nicht möglich.

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".

Für diesen Beitrag haben gedankt: Tastaro
Tastaro Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 414
Erhaltene Danke: 23



BeitragVerfasst: Mi 05.03.14 16:25 
Hallo Christian,

in Deinem Fall wird die Datenstruktur für die Schaltung Stück für Stück aufgebaut und dabei berechnet.
Ich stehe vor dem Problem, dass ich eine fertig vorgegebene Schaltung habe, darin die Wege zwischen Anschlüssen finden und den Widerstand berechnen will.
Beim Aufbau kann ich leider nicht berechnen, da die Bauteile in beliebiger Reihenfolge "reinkommen".
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 05.03.14 16:27 
Du benötigst ein Objekt, das die Anordnung der Widerstände abbildet. Vielleicht wäre OpenWire etwas für dich?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 05.03.14 16:31 
Hm, irgendwie habe ich das nicht ganz verstanden. :gruebel: In welcher Weise ist die Schaltung denn vorgegeben, also wie kommt sie in Dein Programm rein?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Tastaro Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 414
Erhaltene Danke: 23



BeitragVerfasst: Mi 05.03.14 16:45 
Ich habe eine Schaltung. In dieser befinden sich Leitungen, Widerstände, Dioden, Relais, Schalter, usw.

Die Beschreibung dieser Schaltung liegt in Form einer Textdatei vor.

Ich lese diese Datei aus und baue daraus folgendes auf:

Eine Liste von Verbindungspunkten = "Pins"
Jeder dieser Pins hat einen Namen und eine Liste mit den Bauteilen die daran angeschlossen sind. Diese Liste ist eine Liste von Referenzen zu:

Mehrere Listen von Bauteilen (sortiert nach Bauteilart):
a) Liste aller Widerstände
b) Liste aller Kondensatoren
c) Liste aller Schalter
usw.

Jedes der Bauteile in der Liste hat neben seinen elektrischen Werten eine Namen sowie Referenzen zu den beiden Pins zwischen denen es liegt.

Damit kann ich mich nun super an Pfaden "entlanghangeln" und z.B. einen Stromlaufplan daraus zeichnen (anbei ein Beispiel ohne Widerstände).

Was ich nun aber auch tun möchte: Zwei Pins aus der Schaltung nehmen und den Widerstand dazwischen berechen. Natürlich nur dann, wenn sich zwischen den beiden Pins nichts anderes als Widerstände, Leitungen und geschlossene Kontakte befinden.
Das ist der Punkt, an dem ich gerade hänge. Ich hoffe, dass ich es nun verständlich erklärt habe.
Einloggen, um Attachments anzusehen!
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 05.03.14 16:50 
Kannst du denn anhand deiner Textdatei feststellen, was sich zwischen zwei Pins befindet? Wenn ja, wo ist dann das Problem?
Tastaro Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 414
Erhaltene Danke: 23



BeitragVerfasst: Mi 05.03.14 16:53 
Klar kann ich das erkennen. Ich habe sogar die exakte Topologie.
Was mir fehlt ist ein Algorithmus, der diese Struktur so durchläuft, dass die Widerstände korrekt berechnet werden.
Das ist mein Problem.
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 05.03.14 16:57 
Du mußt doch nicht alle Widerstände berechnen, sondern nur den Widerstand zwischen den zwei Pins, die du auswählst. Oder willst du tatsächlich alle Widerstände zwischen allen Pin-Kombinationen berechnen?

1. Du prüfst, ob zwischen den beiden ausgewählten Pins noch was anderes liegt als Widerstände.

2. War die Prüfung erfolgreich, berechnest du den Gesamtwiderstand. Wie deine Textdatei aussieht und woran man Reihen- und Parallelschaltung erkennt, entzieht sich leider meiner Kenntnis.
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Mi 05.03.14 21:00 
user profile iconPerlsau hat folgendes geschrieben Zum zitierten Posting springen:

2. War die Prüfung erfolgreich, berechnest du den Gesamtwiderstand. Wie deine Textdatei aussieht und woran man Reihen- und Parallelschaltung erkennt, entzieht sich leider meiner Kenntnis.


Aber genau das dürfte das eigentliche Problem sein: Erkennen, was eine Reihen- und was eine Parallelschaltung ist und wie diese wiederum miteinander verschaltet sind.

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.

Für diesen Beitrag haben gedankt: Tastaro
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 05.03.14 21:23 
Wie bereits erwähnt ist es so gut wie unmöglich zu erklären, wie eine Parallel-Schaltung von einer Serienschaltung unterschieden werden kann, wenn man die zugrundeliegende Textdatei nicht kennt. Wenn du es dennoch weißt, wäre es doch sicher viel einfacher, dein Wissen hier mitzuteilen, statt mich auf Offensichtliches hinzuweisen. Ich frage ja ständig: Wo ist denn das eigentliche Problem? Eine Antwort habe ich darauf jedoch noch nicht erhalten.

Wenn man im Text erkennen kann, daß an einem Pin mehrere Komponenten hängen, dann kann man sicher auch untersuchen, ob es sich dabei ausschließlich um Widerstände handeld. Ist das der Fall, dann hat man eine Parallelschaltung ausgemacht.

Wenn man ebenso erkennen kann, daß an einem Widerstand noch weitere Widerstände hängen, hat man eine Serienschaltung lokalisiert. Und jetzt frage ich wieder: Wo ist denn das eigentliche Problem? Weißt du etwa, wo abseits von "dürfte" das eigentliche Problem des Fragestellers ist?

Vielleicht besteht das eigentliche Problem ja auch darin, daß der Fragesteller nicht wirklich programmieren kann? Wer weiß ...
gerd8888
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 205
Erhaltene Danke: 3

Win7
Delphi 10.1 Starter (kostenlos) Lazarus
BeitragVerfasst: Mi 05.03.14 21:49 
Hallo,

Du musst das 1. und das 2. Kirchhoffsche Gesetz anwenden.
Du willst den Gesamtwiderstand berechnen.
Zuerst die Parallelschaltung und dann die Reihenschaltung berechnen.
Wenn Du noch einen Kondensator oder eine Spule hast, wird es etwas komplizierter.
Einen source code kann ich leider nicht anbieten.

Die Berechnung stelle ich mir jetzt nicht so schwer vor, da man bei der Parallelschaltung >1 Punkte hat, bei der Reihenschaltung nur 1 Punkt.
Tastaro Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 414
Erhaltene Danke: 23



BeitragVerfasst: Do 06.03.14 08:23 
@OlafSt: Jepp, das ist der Punkt. Ich hatte schon befürchtet, dass ich mich total unverständlich ausgedrückt habe.

@Gerd: Die physikalischen Gesetzte kenne ich. Ich rede auch nicht von einer Serien- oder Parallelschaltung zweier Widerstände, sondern von beliebigen Netzwerken. Das berechnen an sich ist trivial. Das Problem ist die Erkennung wie die Widerstände zusammenhängen.

@Perlsau: Auch wenn die Kenntnis des Formats der Textdatei in diesem Fall nichts hilft, hier ein ungefähres Beispiel:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Leitung1 Pin1   R1.1
Leitung4 R2.2   Pin2
Leitung5 R3.2   Pin2
Leitung6 Pin2   Pin3
Leitung2 R1.2   R2.1  
Leitung3 R1.2   R3.1
R1       R1.1   R1.2   100Ohm
R2       R2.1   R2.2   200Ohm
R3       R3.1   R3.2   300Ohm

Der Algorithmus soll nun den Widerstand zwischen Pin1 und Pin3 berechnen. Und die Lösung zu meinem Problem ist jetzt nicht 1/(1/R2 + 1/R3) + R1.
Übrigens ist es nicht richtig, dass Du die Antwort auf die Frage nach dem Problem nicht erhalten hast. Du hast sie nur nicht verstanden.
Und zur Frage nach meinen Programmierkenntnissen: Die sind nicht das Problem.

Beste Grüße
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Fr 07.03.14 00:54 
Sowohl Perlsau als auch ich haben da recht - nur formuliert es Perlsau wesentlich bissiger ;)

Perlsau hat das Problem erkannt, nur ist es für ihn keines. Ich hab das Problem auch erkannt und bis zur Ansicht der Datei auch keinen Plan, wie das zu lösen wäre.

Anhand der Datei sehe ich nun eine Möglichkeit. Charakteristisch für eine Parallelschaltung ist doch, das sich mindestens zwei Bauteile an einem Punkt "treffen". Dies sieht man in der Datei sogar sehr deutlich in Zeile 5+6 - hier gehen zwei verschiedene Bauteile von ein und demselben Punkt ab. Mit diesem Wissen könnte man eine Rekursion basteln, die nun die einzelnen Zweige weiter untersucht und weitere Parallelschaltungen erkennt.

So wie ich das sehe, haben wir im Beispiel einen R1, in Serie mit einer Parallelschaltung von R2 und R3.

Vielleicht hilft dir das weiter ;)

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Fr 07.03.14 01:18 
user profile iconPerlsau hat folgendes geschrieben Zum zitierten Posting springen:
Ist das der Fall, dann hat man eine Parallelschaltung ausgemacht.
Wenn man ebenso erkennen kann, daß an einem Widerstand noch weitere Widerstände hängen, hat man eine Serienschaltung lokalisiert.


Ein Problem liegt zum Beispiel darin, dass sich beliebige Netzwerke im allgemeinen eben nicht durch Serien und Reihenschaltungen reduzieren lassen. Die Messbrücke ist wohl das einfachste und bekannteste Beispiel für ein nicht-reduzierbares Netzwerk.

Zum Thema: Lese die Datei ein und forme einen Graph daraus. Die Kanten sind deine Widerstände/Leitungen(aka 0 Ohm Widerstände) und die Knoten sind die Pins.
Jetzt eventuell vereinfachen - das macht den ganzen Nachfolgenden Kram etwas schneller. Gerade Pins, von denen nur Leitungen abgehen, kannst du hier eliminieren. Oder auch einfache Reihenschaltungen.
Dann die Kirchhoffschen Regeln aufstellen. Die Knotenregel ist trivial. Für die Maschenregel sollte dir dieses hier weiterhelfen:

Zitat:
To solve this problem, we must generate a basis for the cycle space of our network. To
do this, we first create a spanning tree using a breadth-first search of the network from
the starting node (any spanning tree will work, but this is a convenient way to construct
one). Each edge not in this spanning tree will be part of a distinct cycle in the network. To
generate the full loop from one of these edges, we start at the two endpoints (nodes) of that
edge, and follow the edges going to parent nodes from our spanning tree until we reach a
common ancestor node. Since we used a breadth first search to create the tree, we know the
depth of all the nodes in our network (the minimum number of edges traversed to reach that
node from the starting node), and we know that all the edges not in the spanning tree have
endpoints with depths that differ by no more than one. This means that to find the nearest
common ancestor in the tree, we only need to compare the pairs of equal depth ancestors
of the two nodes until we find the same ancestor. This algorithm does not necessarily find
the smallest loops, but it does guarantee that none of the loops found will be combinations
of previously found loops, and that there will be no other loops in the network that are
not combinations of found loops.

Zitat entnommen aus: Efficient Methods for Calculating Equivalent Resistance Between Nodes of a Highly Symmetric Resistor Network, Jeremy T. Moody, 29. März 2013 (www.wpi.edu/Pubs/E-p...ricted/networks.pdf)

Für diesen Beitrag haben gedankt: Tastaro