在SpiceSharp仿真中处理开路开关
我们正在开发一个用于仿真电路的工具,并以SpiceSharp作为实现。
我们需要检测在电路中出现本质上处于浮动状态的岛屿的情况,即某些节点两边的开关都处于打开状态。
我需要找到一种方法来检测这部分电路中的节点是否彼此不连通。我知道在其他基于Spice的电路仿真器中已经解决过这个问题,我也很想了解它们是如何实现的。
目前,我通过让节点通过电阻连接回一个 -1000V的参考轨,这样当它们实际上处于浮动状态时,电位大致在 -1000V附近(两侧留有一个小幅度的容差)。到目前为止,这看起来符合我们的预期,但我很感激如果你能就这种做法是否可接受给出见解。
解决方案
一般思路是使用 图遍历 来发现那些没有连通的“岛屿”。这假设你能将电路描述成一个图。
实现的一个示例是用深度优先搜索来找出一个岛屿中的所有节点,然后对所有未访问的节点重复同样的过程。一个通用的实现可能看起来像这样:
public static Dictionary<T, int> LabelIslands<T>(
IEnumerable<T> allNodes,
Func<T, IEnumerable<T>> nodeToNeighbors)
{
int currentLabel = 0;
Dictionary<T, int> nodeToLabel = new();
foreach (var node in allNodes)
{
if (nodeToLabel.ContainsKey(node)) continue;
currentLabel++;
foreach (var n in GetNodesInIsland(node, nodeToNeighbors))
{
nodeToLabel.Add(n, currentLabel);
}
}
return nodeToLabel;
}
public static HashSet<T> GetNodesInIsland<T>(T self, Func<T, IEnumerable<T>> nodeToNeighbors)
{
var stack = new Stack<T>();
var visited = new HashSet<T>();
stack.Push(self);
while (stack.Count > 0)
{
var current = stack.Pop();
if(!visited.Add(current)) continue;
foreach (var child in nodeToNeighbors(current))
{
if (!visited.Contains(child))
{
stack.Push(child);
}
}
}
return visited;
}
其中nodeToNeighbors将一个节点映射到所有相邻的节点。结果是一个字典,将每个节点映射到它所属岛屿的标签。
请注意,这假设图中没有单向边。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。