节点电压法-自编的迷你spice资料整理

[复制链接]
 楼主| 叶春勇 发表于 2021-8-14 15:19 | 显示全部楼层 |阅读模式
去年,king5555发了个5段RC均衡器,经分析,解析计算不太可能,目前没找到。因此转向数值分析。电路图如下

即计算机根据给定的条件,计算机根据穷举或随机弄几个组合让计算机去猜(当时的想法),其中涉及到电路的求解。
这个minispice就是用于求解节点的电压。这个5段RC均衡器有很多节点,经推导代数式,失败。只好用数值分析。
节点电压法我就不码字了,就直接截图。《电路》邱关源第五版P70

规则为3:
1、自电导为正,即矩阵的对角线
2、互电导为负,即矩阵非对角线
3、注入电流等于流入和流出电流源的代数和



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评论

[url=home.php?mod=space&uid=2803420]@叶春勇[/url] :OP里面有这么一说么?  发表于 2021-10-1 10:11
[url=home.php?mod=space&uid=3032596]@不奇怪[/url] :另外,“电感 电容可以或略”?  发表于 2021-10-1 10:10
哈哈哈,你的意思不就是"求值器是个线性运算",ac也是线性运算,所以“你没说错”呗。  发表于 2021-10-1 10:01
[url=home.php?mod=space&uid=2803420]@叶春勇[/url] :哈哈哈,你的意思不就是"求值器是个线性运算",也是线性运算,所以“你没说错”呗。  发表于 2021-10-1 10:00
[url=home.php?mod=space&uid=3032596]@不奇怪[/url] :ac分析,spice分析有很多种,瞬态分析是个ode,op分析也是个线性代数求值器,电容电感可以忽略  发表于 2021-10-1 09:42
哈哈哈,你这个不过是一个稳态计算,跟spice根本不沾边,仿真不是这么做的。  发表于 2021-10-1 08:13
 楼主| 叶春勇 发表于 2021-8-14 15:21 | 显示全部楼层
本帖最后由 叶春勇 于 2021-8-14 15:24 编辑

一、电路的描述
参考spice的格式,电路图描述如下:['R01',1,0,1.5e3]
第一个为元件编号,第二个为起始节点,第三个结束节点,第四个为数值,暂时只支持I,R,L,C,无方向判断
  1. cir=[['R01',1,0,1.5e3],
  2.      ['R02',7,0,300],
  3.      ['R03',8,2,15e3],
  4.      ['R04',8,9,15e3],
  5.      ['R05',10,9,18e3],
  6.      ['R06',10,11,18e3],
  7.      ['R07',11,0,39e3],
  8.      ['R11',1,2,25e3],
  9.      ['R12',2,7,25e3],
  10.      ['R21',1,3,25e3],
  11.      ['R22',3,7,25e3],
  12.      ['R31',1,4,25e3],
  13.      ['R32',4,7,25e3],
  14.      ['R41',1,5,25e3],
  15.      ['R42',5,7,25e3],
  16.      ['R51',1,6,25e3],
  17.      ['R52',6,7,25e3],
  18.      ['C01',3,8,33e-9],
  19.      ['C02',4,9,10e-9],
  20.      ['C03',5,10,4.7e-9],
  21.      ['C04',6,11,1e-9],
  22.      ['C05',8,0,4.7e-9],
  23.      ['C06',9,0,6.8e-9],
  24.      ['C07',10,0,2.2e-9],
  25.      ['C08',11,0,1e-9],
  26.      ['I01',1,0,1]]

 楼主| 叶春勇 发表于 2021-8-14 15:31 | 显示全部楼层
本帖最后由 叶春勇 于 2021-8-14 15:41 编辑

二、电路表转化成复导纳矩阵
程序流程图如下

下面四个函数用于生成符号矩阵,此时的矩阵,只保存某个节点有什么元件。
  1. ##获得两个相同节点之间的所有元件,计算自电导用
  2. def get_y1(cir,n1,n2):
  3.     y=[]
  4.     for e in cir:
  5.         if(n1==e[1] or n2==e[2]):
  6.             y.append(e)
  7.     return y

  8. ##获得两个不同节点之间的所有元件,计算互电导用
  9. def get_y2(cir,n1,n2):
  10.     y=[]
  11.     a=max(n1,n2)
  12.     b=min(n1,n2)
  13.     for e in cir:
  14.         c=max(e[1],e[2])
  15.         d=min(e[1],e[2])
  16.         if(a==c and b==d):
  17.             y.append(e)
  18.     return y

  19. ##建立Y元件导纳矩阵子函数
  20. def get_y(cir,n1,n2):
  21.     if(n1==n2):
  22.         return get_y1(cir,n1,n2)
  23.     else:
  24.         return get_y2(cir,n1,n2)

  25. ##建立Y元件导纳矩阵
  26. def get_y_matrix(cir):
  27.     Y=[]
  28.     for i in range(1,12):
  29.         YL=[]
  30.         for j in range(1,12,1):
  31.             YL.append(get_y(cir,i,j))
  32.         Y.append(YL)
  33.     return Y



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 叶春勇 发表于 2021-8-14 15:40 | 显示全部楼层
此时的矩阵效果如下:
例如 矩阵的1-1号节点,把端点(起始节点点或结束节点)含有1的元件,放进一个数组
例如1 1 ['R01', 'R11', 'R21', 'R31', 'R41', 'R51', 'I1']
那么1号节点连接了6个电阻,一个电流源。

矩阵的1-2号节点,把一个端点为1,另一个端点为2的元件,放进一个数组
例如1 2 ['R11']
那么1和2节点之间有一个电阻R11

最终得到一个正方形二维表。
 楼主| 叶春勇 发表于 2021-8-14 15:45 | 显示全部楼层
三,根据符号矩阵,查数值,建立数值复导纳矩阵。
大致工作流程就是把符号矩阵中的元件的复导纳加起来,然后自电导为正,互电导为取负,需要给定参数频率。

  1. ##从元件获得复导纳值子函数,暂时只支持RLC,转化成数值导纳矩阵用
  2. def get_y_value_from_element(e,f):
  3.     s=1j*2*math.pi*f
  4.     if(e[0].startswith('R')):
  5.         y=1/e[3]
  6.     elif(e[0].startswith('C')):
  7.         y=(s*e[3])
  8.     elif(e[0].startswith('L')):
  9.         y=1/(s*e[3])
  10.     else:
  11.         y=0
  12.     ##print(e[0],e[3],y)
  13.     return y

  14. ##从一组元件求总导纳值,转化成数值导纳矩阵用   
  15. def get_y_value_from_elements(elements,f):
  16.     Y=0
  17.     for e in elements:
  18.         Y=Y+get_y_value_from_element(e,f)
  19.     return Y

  20. ##从元件导纳矩阵获得数值导纳矩阵   
  21. def get_y_value_matrix(Y,f):
  22.     YV=[]
  23.     for i in range(1,12):
  24.         YVL=[]
  25.         for j in range(1,12,1):
  26.             #自电导为正,邱关源《电路》P69
  27.             if(i==j):
  28.                 v=get_y_value_from_elements(Y[i-1][j-1],f)
  29.             #互电导为负
  30.             else:
  31.                 v=-1*get_y_value_from_elements(Y[i-1][j-1],f)
  32.             YVL.append(v)
  33.         YV.append(YVL)
  34.     return YV


 楼主| 叶春勇 发表于 2021-8-14 15:50 | 显示全部楼层
四、最后计算5段均衡器的节点电压。
用了numpy的库,非常简单,其中1/(1.5e3)是将幅度为1V电压源转化成电流源(诺顿定理)
  1. ##king5555的5段均衡器数值传递函数
  2. def get_hjw(cir,f):
  3.     Y=get_y_matrix(cir)
  4.     display_y_syms(Y)
  5.     YM=numpy.mat(get_y_value_matrix(Y,f))
  6.     I=numpy.mat([[1/(1.5e3)],
  7.                  [0],
  8.                  [0],
  9.                  [0],
  10.                  [0],
  11.                  [0],
  12.                  [0],
  13.                  [0],
  14.                  [0],
  15.                  [0],
  16.                  [0]])
  17.     ##print(YM)
  18.     V=YM.I*I
  19.     return V
至此,完成电路从符号表到求值。通过给定频率,计算某个节点的压,让计算机检查是否符合要求。
 楼主| 叶春勇 发表于 2021-8-14 15:56 | 显示全部楼层
程序输出结果:
  1. [[0.86937316]
  2. [0.40459092]
  3. [0.43641139]
  4. [0.44254197]
  5. [0.44322551]
  6. [0.44375548]
  7. [0.01829224]
  8. [0.35758804]
  9. [0.30048658]
  10. [0.22958955]
  11. [0.15727944]]
与lt-spice比对,AC分析,一个点100Hz

计算结果一样

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 叶春勇 发表于 2021-8-14 16:05 | 显示全部楼层
总结:
king5555的5段均衡网络,代数式非常非常的长,代数分析基本很困难。这是在这种背景下搞出来的。
节点电压法对于复杂电阻网络是非常好的一般方法。规则简单。当然spice软件用的节点电压法是改进过的。比这个复杂。
此程序可用于复杂RLC网络的计算,如果简单那肯定是求解析式为最佳。
 楼主| 叶春勇 发表于 2021-8-14 16:10 | 显示全部楼层
本帖最后由 叶春勇 于 2021-8-14 16:13 编辑

补,king5555的5段均衡器导纳矩阵表,其中电流源会被程序忽略,我就不编辑了。R7为电路图中RL
  1. 1 1 ['R01', 'R11', 'R21', 'R31', 'R41', 'R51', 'I01']
  2. 1 2 ['R11']
  3. 1 3 ['R21']
  4. 1 4 ['R31']
  5. 1 5 ['R41']
  6. 1 6 ['R51']
  7. 1 7 []
  8. 1 8 []
  9. 1 9 []
  10. 1 10 []
  11. 1 11 []
  12. 2 1 ['R11']
  13. 2 2 ['R03', 'R11', 'R12']
  14. 2 3 []
  15. 2 4 []
  16. 2 5 []
  17. 2 6 []
  18. 2 7 ['R12']
  19. 2 8 ['R03']
  20. 2 9 []
  21. 2 10 []
  22. 2 11 []
  23. 3 1 ['R21']
  24. 3 2 []
  25. 3 3 ['R21', 'R22', 'C01']
  26. 3 4 []
  27. 3 5 []
  28. 3 6 []
  29. 3 7 ['R22']
  30. 3 8 ['C01']
  31. 3 9 []
  32. 3 10 []
  33. 3 11 []
  34. 4 1 ['R31']
  35. 4 2 []
  36. 4 3 []
  37. 4 4 ['R31', 'R32', 'C02']
  38. 4 5 []
  39. 4 6 []
  40. 4 7 ['R32']
  41. 4 8 []
  42. 4 9 ['C02']
  43. 4 10 []
  44. 4 11 []
  45. 5 1 ['R41']
  46. 5 2 []
  47. 5 3 []
  48. 5 4 []
  49. 5 5 ['R41', 'R42', 'C03']
  50. 5 6 []
  51. 5 7 ['R42']
  52. 5 8 []
  53. 5 9 []
  54. 5 10 ['C03']
  55. 5 11 []
  56. 6 1 ['R51']
  57. 6 2 []
  58. 6 3 []
  59. 6 4 []
  60. 6 5 []
  61. 6 6 ['R51', 'R52', 'C04']
  62. 6 7 ['R52']
  63. 6 8 []
  64. 6 9 []
  65. 6 10 []
  66. 6 11 ['C04']
  67. 7 1 []
  68. 7 2 ['R12']
  69. 7 3 ['R22']
  70. 7 4 ['R32']
  71. 7 5 ['R42']
  72. 7 6 ['R52']
  73. 7 7 ['R02', 'R12', 'R22', 'R32', 'R42', 'R52']
  74. 7 8 []
  75. 7 9 []
  76. 7 10 []
  77. 7 11 []
  78. 8 1 []
  79. 8 2 ['R03']
  80. 8 3 ['C01']
  81. 8 4 []
  82. 8 5 []
  83. 8 6 []
  84. 8 7 []
  85. 8 8 ['R03', 'R04', 'C01', 'C05']
  86. 8 9 ['R04']
  87. 8 10 []
  88. 8 11 []
  89. 9 1 []
  90. 9 2 []
  91. 9 3 []
  92. 9 4 ['C02']
  93. 9 5 []
  94. 9 6 []
  95. 9 7 []
  96. 9 8 ['R04']
  97. 9 9 ['R04', 'R05', 'C02', 'C06']
  98. 9 10 ['R05']
  99. 9 11 []
  100. 10 1 []
  101. 10 2 []
  102. 10 3 []
  103. 10 4 []
  104. 10 5 ['C03']
  105. 10 6 []
  106. 10 7 []
  107. 10 8 []
  108. 10 9 ['R05']
  109. 10 10 ['R05', 'R06', 'C03', 'C07']
  110. 10 11 ['R06']
  111. 11 1 []
  112. 11 2 []
  113. 11 3 []
  114. 11 4 []
  115. 11 5 []
  116. 11 6 ['C04']
  117. 11 7 []
  118. 11 8 []
  119. 11 9 []
  120. 11 10 ['R06']
  121. 11 11 ['R06', 'R07', 'C04', 'C08']


ELECTRODUMMY 发表于 2021-8-14 16:15 | 显示全部楼层
你是跟着假孵蛋叫兽学瓜了?
这电路明显有重复的结构网络,想到用网络参数矩阵分割重复的单元写个程序也要有意义点。你这方法吃饱了撑了,没想过用脑子……
 楼主| 叶春勇 发表于 2021-8-14 16:16 | 显示全部楼层
这个是完整的python程序。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 叶春勇 发表于 2021-8-14 16:18 | 显示全部楼层
本帖最后由 叶春勇 于 2021-8-14 16:19 编辑
ELECTRODUMMY 发表于 2021-8-14 16:15
你是跟着假孵蛋叫兽学瓜了?
这电路明显有重复的结构网络,想到用网络参数矩阵分割重复的单元写个程序也要 ...

如果你有更好的方法,可以发帖,让我看看。这个电路代数分析过,不太可能。只能编个程序让计算机去猜。
这只是某个程序的一部分。
软件好见分晓。 show me the code!
xukun978 发表于 2021-8-14 19:13 | 显示全部楼层
spice仿真器都烂大街了,还有人编代码验证节点法/网孔法,真会玩。
 楼主| 叶春勇 发表于 2021-8-14 20:07 来自手机 | 显示全部楼层
xukun978 发表于 2021-8-14 19:13
spice仿真器都烂大街了,还有人编代码验证节点法/网孔法,真会玩。

我需要自编程序,自动搜索。所以得自己去求职,如果借助spice需写spice的输出结果文件的分析脚本。我感觉难度差不多。但是自编程序有优化空间
xukun978 发表于 2021-8-14 20:14 | 显示全部楼层
本帖最后由 xukun978 于 2021-8-14 20:16 编辑
叶春勇 发表于 2021-8-14 20:07
我需要自编程序,自动搜索。所以得自己去求职,如果借助spice需写spice的输出结果文件的分析脚本。我感觉 ...



如果找软件方面的工作,python太初级了,我估计不好找。

如果找硬件方面的工作,免费spice遍地开花,没有哪个公司会要找人用python求解电路的。仿真器都烂大街了,还找人去开发?
 楼主| 叶春勇 发表于 2021-8-14 20:37 来自手机 | 显示全部楼层
我以前说过,软件为阳,多写软件,水平就上去了。学硬件的同时,软件水平也锻炼了,这是学习方法。学python主要写一次性软件,或labview等人机软件不好写的东西。
xukun978 发表于 2021-8-14 21:43 | 显示全部楼层
本帖最后由 xukun978 于 2021-8-14 21:46 编辑
叶春勇 发表于 2021-8-14 20:37
我以前说过,软件为阳,多写软件,水平就上去了。学硬件的同时,软件水平也锻炼了,这是学习方法。学python ...


你这是四不像!
什么都懂一点,但是全都不精通。
如果是大学生,这没问题,进入公司再走专业路线。
如果是40岁老工,通过社招途径,很难进专业的大公司,面试过不了两轮,学历和经验都欠缺。

不过你可以模仿本坛的某元老,玩田忌赛马战术,碰到软件工程师,给他show硬件水平;碰到硬件工程师,给他show编程技术。
 楼主| 叶春勇 发表于 2021-8-14 22:01 | 显示全部楼层
xukun978 发表于 2021-8-14 21:43
你这是四不像!
什么都懂一点,但是全都不精通。
如果是大学生,这没问题,进入公司再走专业路线。

大企业我都进过了。我以前不是说过,电厂仪表专责,dcs工程师,外企电气工程师。
 楼主| 叶春勇 发表于 2021-8-15 13:43 来自手机 | 显示全部楼层
king5555 发表于 2021-8-15 12:13
你的经历跟本大师很像,他也是发电厂工程师,后然到私企。他也用软件编程去解硬件,同样地x大也数落过他 ...

本大师曾经说过一个电容电阻见真功夫,我在照做,你这个电路让我在学院派和现实之间反复思考了很久。
修理Y的 发表于 2021-8-16 13:25 | 显示全部楼层
这个电路有没啥好点方法手工分析?一般方法貌似都不太好用呀
您需要登录后才可以回帖 登录 | 注册

本版积分规则

151

主题

4810

帖子

50

粉丝
快速回复 在线客服 返回列表 返回顶部