打印

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

[复制链接]
12029|48
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
去年,king5555发了个5段RC均衡器,经分析,解析计算不太可能,目前没找到。因此转向数值分析。电路图如下

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

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



使用特权

评论回复
评论
不奇怪 2021-10-1 10:11 回复TA
@叶春勇 :OP里面有这么一说么? 
不奇怪 2021-10-1 10:10 回复TA
@不奇怪 :另外,“电感 电容可以或略”? 
不奇怪 2021-10-1 10:01 回复TA
哈哈哈,你的意思不就是"求值器是个线性运算",ac也是线性运算,所以“你没说错”呗。 
不奇怪 2021-10-1 10:00 回复TA
@叶春勇 :哈哈哈,你的意思不就是"求值器是个线性运算",也是线性运算,所以“你没说错”呗。 
叶春勇 2021-10-1 09:42 回复TA
@不奇怪 :ac分析,spice分析有很多种,瞬态分析是个ode,op分析也是个线性代数求值器,电容电感可以忽略 
不奇怪 2021-10-1 08:13 回复TA
哈哈哈,你这个不过是一个稳态计算,跟spice根本不沾边,仿真不是这么做的。 

相关帖子

沙发
叶春勇|  楼主 | 2021-8-14 15:21 | 只看该作者
本帖最后由 叶春勇 于 2021-8-14 15:24 编辑

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

使用特权

评论回复
板凳
叶春勇|  楼主 | 2021-8-14 15:31 | 只看该作者
本帖最后由 叶春勇 于 2021-8-14 15:41 编辑

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

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

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

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

##建立Y元件导纳矩阵
def get_y_matrix(cir):
    Y=[]
    for i in range(1,12):
        YL=[]
        for j in range(1,12,1):
            YL.append(get_y(cir,i,j))
        Y.append(YL)
    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

最终得到一个正方形二维表。

使用特权

评论回复
5
叶春勇|  楼主 | 2021-8-14 15:45 | 只看该作者
三,根据符号矩阵,查数值,建立数值复导纳矩阵。
大致工作流程就是把符号矩阵中的元件的复导纳加起来,然后自电导为正,互电导为取负,需要给定参数频率。

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

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

##从元件导纳矩阵获得数值导纳矩阵   
def get_y_value_matrix(Y,f):
    YV=[]
    for i in range(1,12):
        YVL=[]
        for j in range(1,12,1):
            #自电导为正,邱关源《电路》P69
            if(i==j):
                v=get_y_value_from_elements(Y[i-1][j-1],f)
            #互电导为负
            else:
                v=-1*get_y_value_from_elements(Y[i-1][j-1],f)
            YVL.append(v)
        YV.append(YVL)
    return YV


使用特权

评论回复
6
叶春勇|  楼主 | 2021-8-14 15:50 | 只看该作者
四、最后计算5段均衡器的节点电压。
用了numpy的库,非常简单,其中1/(1.5e3)是将幅度为1V电压源转化成电流源(诺顿定理)
##king5555的5段均衡器数值传递函数
def get_hjw(cir,f):
    Y=get_y_matrix(cir)
    display_y_syms(Y)
    YM=numpy.mat(get_y_value_matrix(Y,f))
    I=numpy.mat([[1/(1.5e3)],
                 [0],
                 [0],
                 [0],
                 [0],
                 [0],
                 [0],
                 [0],
                 [0],
                 [0],
                 [0]])
    ##print(YM)
    V=YM.I*I
    return V
至此,完成电路从符号表到求值。通过给定频率,计算某个节点的压,让计算机检查是否符合要求。

使用特权

评论回复
7
叶春勇|  楼主 | 2021-8-14 15:56 | 只看该作者
程序输出结果:
[[0.86937316]
[0.40459092]
[0.43641139]
[0.44254197]
[0.44322551]
[0.44375548]
[0.01829224]
[0.35758804]
[0.30048658]
[0.22958955]
[0.15727944]]
与lt-spice比对,AC分析,一个点100Hz

计算结果一样

使用特权

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

使用特权

评论回复
9
叶春勇|  楼主 | 2021-8-14 16:10 | 只看该作者
本帖最后由 叶春勇 于 2021-8-14 16:13 编辑

补,king5555的5段均衡器导纳矩阵表,其中电流源会被程序忽略,我就不编辑了。R7为电路图中RL
1 1 ['R01', 'R11', 'R21', 'R31', 'R41', 'R51', 'I01']
1 2 ['R11']
1 3 ['R21']
1 4 ['R31']
1 5 ['R41']
1 6 ['R51']
1 7 []
1 8 []
1 9 []
1 10 []
1 11 []
2 1 ['R11']
2 2 ['R03', 'R11', 'R12']
2 3 []
2 4 []
2 5 []
2 6 []
2 7 ['R12']
2 8 ['R03']
2 9 []
2 10 []
2 11 []
3 1 ['R21']
3 2 []
3 3 ['R21', 'R22', 'C01']
3 4 []
3 5 []
3 6 []
3 7 ['R22']
3 8 ['C01']
3 9 []
3 10 []
3 11 []
4 1 ['R31']
4 2 []
4 3 []
4 4 ['R31', 'R32', 'C02']
4 5 []
4 6 []
4 7 ['R32']
4 8 []
4 9 ['C02']
4 10 []
4 11 []
5 1 ['R41']
5 2 []
5 3 []
5 4 []
5 5 ['R41', 'R42', 'C03']
5 6 []
5 7 ['R42']
5 8 []
5 9 []
5 10 ['C03']
5 11 []
6 1 ['R51']
6 2 []
6 3 []
6 4 []
6 5 []
6 6 ['R51', 'R52', 'C04']
6 7 ['R52']
6 8 []
6 9 []
6 10 []
6 11 ['C04']
7 1 []
7 2 ['R12']
7 3 ['R22']
7 4 ['R32']
7 5 ['R42']
7 6 ['R52']
7 7 ['R02', 'R12', 'R22', 'R32', 'R42', 'R52']
7 8 []
7 9 []
7 10 []
7 11 []
8 1 []
8 2 ['R03']
8 3 ['C01']
8 4 []
8 5 []
8 6 []
8 7 []
8 8 ['R03', 'R04', 'C01', 'C05']
8 9 ['R04']
8 10 []
8 11 []
9 1 []
9 2 []
9 3 []
9 4 ['C02']
9 5 []
9 6 []
9 7 []
9 8 ['R04']
9 9 ['R04', 'R05', 'C02', 'C06']
9 10 ['R05']
9 11 []
10 1 []
10 2 []
10 3 []
10 4 []
10 5 ['C03']
10 6 []
10 7 []
10 8 []
10 9 ['R05']
10 10 ['R05', 'R06', 'C03', 'C07']
10 11 ['R06']
11 1 []
11 2 []
11 3 []
11 4 []
11 5 []
11 6 ['C04']
11 7 []
11 8 []
11 9 []
11 10 ['R06']
11 11 ['R06', 'R07', 'C04', 'C08']


使用特权

评论回复
10
ELECTRODUMMY| | 2021-8-14 16:15 | 只看该作者
你是跟着假孵蛋叫兽学瓜了?
这电路明显有重复的结构网络,想到用网络参数矩阵分割重复的单元写个程序也要有意义点。你这方法吃饱了撑了,没想过用脑子……

使用特权

评论回复
11
叶春勇|  楼主 | 2021-8-14 16:16 | 只看该作者
这个是完整的python程序。



minispice.zip

1.24 KB

使用特权

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

如果你有更好的方法,可以发帖,让我看看。这个电路代数分析过,不太可能。只能编个程序让计算机去猜。
这只是某个程序的一部分。
软件好见分晓。 show me the code!

使用特权

评论回复
13
xukun978| | 2021-8-14 19:13 | 只看该作者
spice仿真器都烂大街了,还有人编代码验证节点法/网孔法,真会玩。

使用特权

评论回复
14
叶春勇|  楼主 | 2021-8-14 20:07 | 只看该作者
xukun978 发表于 2021-8-14 19:13
spice仿真器都烂大街了,还有人编代码验证节点法/网孔法,真会玩。

我需要自编程序,自动搜索。所以得自己去求职,如果借助spice需写spice的输出结果文件的分析脚本。我感觉难度差不多。但是自编程序有优化空间

使用特权

评论回复
15
xukun978| | 2021-8-14 20:14 | 只看该作者
本帖最后由 xukun978 于 2021-8-14 20:16 编辑
叶春勇 发表于 2021-8-14 20:07
我需要自编程序,自动搜索。所以得自己去求职,如果借助spice需写spice的输出结果文件的分析脚本。我感觉 ...



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

如果找硬件方面的工作,免费spice遍地开花,没有哪个公司会要找人用python求解电路的。仿真器都烂大街了,还找人去开发?

使用特权

评论回复
16
叶春勇|  楼主 | 2021-8-14 20:37 | 只看该作者
我以前说过,软件为阳,多写软件,水平就上去了。学硬件的同时,软件水平也锻炼了,这是学习方法。学python主要写一次性软件,或labview等人机软件不好写的东西。

使用特权

评论回复
17
xukun978| | 2021-8-14 21:43 | 只看该作者
本帖最后由 xukun978 于 2021-8-14 21:46 编辑
叶春勇 发表于 2021-8-14 20:37
我以前说过,软件为阳,多写软件,水平就上去了。学硬件的同时,软件水平也锻炼了,这是学习方法。学python ...


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

不过你可以模仿本坛的某元老,玩田忌赛马战术,碰到软件工程师,给他show硬件水平;碰到硬件工程师,给他show编程技术。

使用特权

评论回复
18
叶春勇|  楼主 | 2021-8-14 22:01 | 只看该作者
xukun978 发表于 2021-8-14 21:43
你这是四不像!
什么都懂一点,但是全都不精通。
如果是大学生,这没问题,进入公司再走专业路线。

大企业我都进过了。我以前不是说过,电厂仪表专责,dcs工程师,外企电气工程师。

使用特权

评论回复
19
叶春勇|  楼主 | 2021-8-15 13:43 | 只看该作者
king5555 发表于 2021-8-15 12:13
你的经历跟本大师很像,他也是发电厂工程师,后然到私企。他也用软件编程去解硬件,同样地x大也数落过他 ...

本大师曾经说过一个电容电阻见真功夫,我在照做,你这个电路让我在学院派和现实之间反复思考了很久。

使用特权

评论回复
20
修理Y的| | 2021-8-16 13:25 | 只看该作者
这个电路有没啥好点方法手工分析?一般方法貌似都不太好用呀

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

151

主题

4809

帖子

50

粉丝