我使用什么算法来计算组合电路的电压?

时间:2015-06-03 07:17:13

标签: algorithm graph tree graph-algorithm graph-traversal

我试图以编程方式计算非常大的电路上的电压变化。

  

*这个问题可能看起来适合电子产品,但它是   更多关于在一组数据上应用算法的信息。

为了简单起见, 这是一个完整的电路,已计算出电压:

enter image description here

我最初只给出了电池电压和电阻:

enter image description here

我遇到的问题是并联和串联电路的电压计算方式不同 A somewhat similar question asked on SO.

一些公式:

When resistors are in parallel:
Rtotal = 1/(1/R1 + 1/R2 + 1/R3 ... + 1/Rn)

When resistors are in series:
Rtotal = R1 + R2 + R3 ... + Rn

欧姆定律:

V = IR
I = V/R
R = V/I

V is voltage (volts)
I is current (amps)
R is resistance (ohms)

我在互联网上找到的每个教程都包括人们在概念上将并联电路组合在一起以获得总电阻,然后使用该电阻来计算串联电阻。

enter image description here

对于小例子来说这很好,但是对于大规模电路来说很难从中推导出算法。

我的问题:
给定所有完整路径的矩阵,
我有办法计算所有电压降吗?

我目前将系统作为图形数据结构 所有节点都表示(并且可以通过查找)id号。

因此,对于上面的示例,如果我运行遍历,我将返回这样的路径列表:

[[0,1,2,4,0]
,[0,1,3,4,0]]

每个数字可用于导出实际节点及其对应的数据。我需要对这组数据执行什么样的转换/算法?

很可能电路的某些部分是复合的,并且那些复合部分可能发现它们与其他化合物部分并联或串联。

我认为我的问题与此类似:
http://en.wikipedia.org/wiki/Series-parallel_partial_order

3 个答案:

答案 0 :(得分:4)

某些电路甚至无法用串联和并联方式进行分析,例如包含edges of a cube的电路(该网页底部的某些代码可能会有所帮助;我还有& #39; t看着它)。另一个无法分析成串联/平行的例子是五边形/五角星形状。

比考虑系列和并行的更强大的解决方案是使用Kirchhoff's laws

  1. 您需要为每个线性部分中的电流创建变量 电路。
  2. 将Kirchhoff的现行法律(KCL)应用于其中的节点 线性部分相遇。
  3. 将Kirchhoff的电压定律(KVL)应用于尽可能多的 你可以找到周期。
  4. 使用高斯消元法求解 得到线性方程组。
  5. 棘手的部分是确定周期。在您给出的示例中,有三个周期:通过电池和左电阻,电池和右电阻,以及左右电阻。对于平面电路,找到一整套循环并不困难;对于三维电路,它可能很难。

    你实际上并不需要所有的周期。在上面的例子中,两个就足够了(对应于电路划分平面的两个有界区域)。然后你有三个变量(电路的三个线性部分的电流)和三个方程(顶部节点的电流之和,其中三个线性段相遇,电压下降大约两个周期)。这足以通过高斯消除来解决系统的电流,然后您可以从电流计算电压。

    如果你输入太多的方程式(例如,你的例子中两个节点的电流,以及三个周期而不是两个电压的电压),事情仍然可以解决:高斯消除只会消除冗余,你就可以了仍然得到独特,正确的答案。真正的问题是如果你的方程太少了。例如,如果在示例中的两个节点上使用KCL,而在一个周期内使用KVL,那么您将有三个等式,但是一个是冗余的,因此您只有两个独立的等式,即不够。所以我会说你可以找到你能找到的每个方程式,然后让高斯消除它。

    希望你可以限制平面电路,为此很容易找到一组很好的周期。否则,您将需要图循环枚举算法。如果您需要,我确定您可以找到它。

答案 1 :(得分:2)

使用最大流量算法(Dijkstra是你的朋友)。

http://www.cs.princeton.edu/courses/archive/spr04/cos226/lectures/maxflow.4up.pdf

你假装在水流问题面前(好吧,实际上这是一个流动问题)。您必须计算每个段上的水流量(当前值)。然后,您可以轻松计算每个电阻上的电压降(水压)。

答案 2 :(得分:0)

我认为去这里的方式是这样的:

  1. 将所有路径分组为相同长度的组。
  2. 虽然有多个组,但请选择长度最大的组和:
    2A。找到两个具有一个项目差异的路径 2B。将它们“合并”到长度小一的路径中 - 合并取决于不同的实际项目 2C。将新路径添加到相关组中 2D。如果只有具有多个项目差异的路径,请合并不同的项目,以便路径之间只有一个不同的项目 2E。当只剩下一个项目时,从“较低”(=长度较小)中找到一个具有最小差异的项目,并合并要匹配的项目。
  3. 如果剩下一个组有多个项目,请继续执行#2,直到有一个组留下一个项目。
  4. 直接计算该项目的值。
  5. 这是非常初步的,但我认为主要观点是明确的 欢迎任何改进。