【问题标题】:What algorithm do I use to calculate voltage across a combination circuit?我使用什么算法来计算组合电路上的电压?
【发布时间】:2015-06-03 07:17:13
【问题描述】:

我正在尝试以编程方式计算一个非常大的电路上的电压变化。

*这个问题似乎是针对电子产品的,但它是 更多关于在一组数据上应用算法。

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

我最初只知道电池电压和电阻:

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

一些公式:

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

When resistors are in series:
<strong>Rtotal = R1 + R2 + R3 ... + Rn</strong>

欧姆定律:

<strong>V = IR</strong>
<strong>I = V/R</strong>
<strong>R = V/I</strong>

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

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

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

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

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

所以对于上面的例子,如果我运行遍历,我会得到一个这样的路径列表:

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

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


电路的某些部分很可能是复合的,而这些复合部分可能会发现自己与其他复合部分并联或串联。

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

【问题讨论】:

  • 你的电路是并联还是串联?或者它可以包含桥电路?
  • 你可能想查一下基尔霍夫定律:en.wikipedia.org/wiki/Kirchhoff%27s_circuit_laws 它可以用来导出一组线性方程来求解。
  • @PhamTrung 好问题。没有桥梁。纯并行和串联。
  • 您的大型电路有多大?您是在说数千、数百万或数十亿个电阻器吗?您是否考虑过使用递归将电路分解成更小、更易于管理的部分?

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


【解决方案1】:

有些电路甚至无法从串联和并联的角度进行分析,例如包含edges of a cube 的电路(该网页底部的一些代码可能会有所帮助;我还没看过) .另一个无法分析成串联/并联的例子是五边形/五角星形状。

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

  1. 您需要为每个线性部分中的电流设置变量 的电路。
  2. 将基尔霍夫电流定律 (KCL) 应用于节点 线性部分相遇。
  3. 将基尔霍夫电压定律 (KVL) 应用于尽可能多的 循环,你可以找到。
  4. 使用高斯消元法求解 得到的线性方程组。

棘手的部分是识别周期。在您给出的示例中,有三个循环:通过电池和左电阻,电池和右电阻,以及通过左右电阻。对于平面电路,找到一套完整的循环并不难;对于三维电路,这可能很难。

您实际上并不需要所有周期。在上面的示例中,两个就足够了(对应于电路将平面划分成的两个有界区域)。然后你有三个变量(电路三个线性部分的电流)和三个方程(三个线性段相遇的顶部节点的电流总和,以及两个周期左右的电压下降)。这足以通过高斯消元法求解电流系统,然后您可以根据电流计算电压。

如果您输入太多方程(例如,示例中两个节点的电流,以及三个周期而不是两个周期的电压),事情仍然会解决:高斯消除只会消除冗余,您仍然会得到唯一的,正确的答案。真正的问题是方程是否太少。例如,如果您在示例中的两个节点上使用 KCL,并且仅在一个周期左右使用 KVL,您将拥有三个方程,但其中一个是多余的,因此您实际上只有两个独立的方程,这还不够。所以我想说把你能找到的每一个方程都扔进去,然后用高斯消元法来解决它。

希望您可以限制为平面电路,因为它很容易找到一组不错的循环。否则,您将需要一个图循环枚举算法。如果你需要,我相信你可以找到它。

【讨论】:

【解决方案2】:

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

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

您假装遇到水流问题(嗯,实际上是水流问题)。你必须计算每一段的水流(电流)。然后,您可以轻松计算每个电阻器上的电压降(水压)。

【讨论】:

  • 这不是真的,maxflow 算法不同,因为没有考虑跨顶点的电压降,因此边缘的容量是固定的,但在电路中,边缘的容量会随着电压降而变化。电导本身并不能定义边缘的容量,但随着电压降,它可以为您提供边缘中的精确流量。你能给出一个约简并证明它与最大流量问题相同吗?
【解决方案3】:

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

  1. 将所有路径分成相同长度的组。
  2. 如果有多个组,请选择长度最大的组,并且:
    2a。找到两个有一项差异的路径。
    2b。将它们“合并”到长度小一的路径中 - 合并取决于不同的实际项目。
    2c。将新路径添加到相关组中。
    2d。如果只有路径具有不止一项差异,请合并不同的项,以便路径之间只有一项不同的项。
    2e。当只剩下一个项目时,从“较低”(=长度更小)中找到差异最小的项目,并合并项目以匹配。
  3. 当剩下一组有多个项目时,继续执行#2,直到剩下一组有一个项目。
  4. 直接计算该项目的价值。

这是非常初步的,但我认为主要思想很清楚。
欢迎任何改进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 2014-10-06
    • 2015-11-15
    • 1970-01-01
    • 2023-03-15
    • 2013-07-25
    相关资源
    最近更新 更多