马上加入,结交更多好友,共享更多资料,让你轻松玩转电力研学社区!
您需要 登录 才可以下载或查看,没有账号?立即加入
×
附件前半部分和本文相同,后半部分为部分代码,在原网站上能找得到,只是综合了一下。
% O2 I% O8 R- P' k- a( o& m& b% k
) C" Z3 r9 |% C4 C
/ S" u/ {& N' |# m5 T& Z* F
在PSSE中使用Python脚本:简要介绍 translated by Jackain
7 ]2 Y# p# a) D9 G6 N( |. f5 x, a ( R9 A! M7 o' f: a
PSSE30 提供了 Python 的 API 接口,使在 PSSE中使用Python脚本语言 成为了可能,这不仅使 PSSE 批量运行,同时可以根据你的 Python 代码,使处理功能更强大,更灵活。 ( N- M" b$ h! W* a/ ^; t) q6 Z
我没有找到很好的关于在 PSSE 中使用 Pyhton 的资料,我把我能找到的东西写在这里供初学者入门。 8 e! n. H- X2 t) P& ]
前面的一些资料能在使用说明书 USERS.pdf 的第 12 章找到,其他资料是通过 API.pdf 和 IPLAN.pdf 综合而来的,可以从中找到。
( g- M" P9 D3 r" y3 x( j7 h$ @ 我发现使用 Adobe 的搜索功能非常有用,你可以根据一个关键词同时搜索在一个文件夹下面的所有的 pdf 文件,这样寻找某个函数的 IPLAN 和 API 的描述遍得很简单。 IPLAN 的描述一般在查找详细描述“某些传递数据的参数”的解释时非常有用。 IPLAN 函数的名称同 API 文档中 Python 的那些函数相同,只是后者是大写字母而已。 ' r) l" h# {8 T
我使用的是 30 版本的 PSSE ,和 2.3 版的 Pyhton ,这篇文章的前提是你了解一些基本的 Python , Mack Lutz 和 David Ascher 写的《 Learning Pyhon 》非常不错。
b2 j8 M: u, n) M- s) H' n Python 0 m' a3 g2 v5 `* s9 K- B! H8 Y6 `
Python.org homepage
) b1 N- S; ]! E, Y: u. q PSSE & q% D! L$ f6 n" o9 `! a
Power System Simulator for Engineering. * y R- d8 R1 E( ]3 o. ^# \9 x) F
8 \# O3 N8 o2 y3 n& Y 在 PSSE 中使用 Python 简介
; I" `5 c+ ~" E' g9 M( O b PSSE 说明文档说:根据你在 PSSE 中的操作可以生成 Python 代码。这花了我一段时间才理解,因为我是 PSSE 和 Python 的初学者。根据以下步骤,可以生成你的第一个 python 代码,用来进行潮流计算分析。前提是你有一个包含有网络信息的 .raw 文件,格式符合 PSSE30 要求。
4 v% X3 N, r k0 W- Z( [% G 1、; Z4 {0 P" q5 M1 l! W2 m1 F
打开 PSSE 。 9 ]% y" g- F- X" _. e6 C
2、
( f# e9 S- i6 f) ` 选择“ I/O Control ”中的“ Start Recording ”菜单,输入一个 PSSE 写入的文件名。 PSSE 会自动地添加 .py 后缀。 4 b$ k! m! |1 R+ z' R, G G3 g. \- r
3、
; F) a) M5 R! t 使用“ File ”菜单中的“ Open ”按钮,读入网络信息。将文件类型设定为 .raw 告诉 PSSE 你在给他的是 raw 文件(不知道是原文傻还是我翻译的傻 :’()
. Q3 ^$ a7 V8 r# @ 4、8 n$ n# s- B% \2 Q! `7 p* k k
选择“ Power Flow ”中“ Solution ”,选择“ Solve ”,运行潮流计算。选择所需要的设置模式,点击“ Solve ”按钮。
1 ^6 g1 W, W- U. P$ D0 U 5、* M9 q! U( s7 a8 Q5 u! o( O
选择“ File ”菜单中的“ Save or Show ”保存运算结果。选择“ Power Flow Raw Data ”选项卡,点击“ Data File ”单选按钮,并在旁边的文本框中输入文件名。点击 OK 按钮。 # h* Z9 i, ?0 B
使用你最喜欢的 python 浏览器查看生成的 python 代码。 & y& V9 W" O3 n5 r4 v# Q+ p
# File:"C:\Documents and Settings\jbo\MySensibleFolderName\pssetest.py", generated on TUE, FEB 08 2005 14:11 psspy.read(0,r"""C:\Documents and Settings\jbo\MySensibleFolderName\testCase_30EV30test.raw""") 1 }! D! Z I0 r/ i
psspy.fdns([0,0,0,1,1,0,99,0]) 8 j3 I! k; g) ^! T$ k: ~& ?
psspy.rawd(0,1,[1,1,1,0,0,0],0,r"""C:\Documents and Settings\jbo\MySensibleFolderName\SOLVEDtestCase_30EV30test.raw""")
注意,所有的方法都是通过一个叫做 psspy 的对象调用的。这个对象包括所有可用的方法和对象。他们看起来只不过是通过一个列表来组织的。我还没有写任何接口对象来组织和调用 psspy 方法时,就是这么想的。(瞎翻译的)
) X; w/ ^0 r% B5 Q: ?$ d( P 注意声称路径字符串的方法,这不是 python 提倡的格式,下面的写法更好:
5 C0 b$ N; I* j3 E5 \ I "C:\\Documents and Settings\\jbo\\MySensibleFolderName\\testCase_30EV30test.raw".
: W( F) R% ~( M: ^+ v y
怎样来运行 python 代码
# L7 Y, s) S6 j5 [ 我试过三种方式 * Q9 \- ^2 R4 v9 C. A0 }/ e
1、; j+ Z, i8 a& b8 ~! y, M1 D
在 PSSE 中打开命令输入窗口( command line input, CLI )任务。 9 x" L7 s' _4 [! U
2、
) z0 A- W9 n: N0 m& T 在 PSSE 中选择“ Run Automation File ”按钮运行一个 python 文件。
+ Z2 R8 W) D; o 3、6 @3 \' t. X+ Q9 y
在 PSSE30 中 python 文件作为一个命令行变量。你可以指定图形界面只有在完成之后才出现。这可以为机器节省内存。在这种情况下,你可以指定仿真的母线数量。可以参照 PSSE Users Manual 中的 PSSE Overview 。
, _& ~# |$ i( y5 f9 o: d8 A 在 PSSE 中打开 CLI ! m s3 ~& n6 q2 @* i1 Z9 z
1、4 w% S8 R& V- Q# u
在“ I/O Control ”菜单中选择“ Begin command line input session ”。
# J* U& F8 f6 G& _$ O. r0 }& J 2、4 |9 {# ^) W) y3 l% s$ q: a
使用“ Command Language ”选择框将语言更改为 python 。 + ~ S+ p0 F( J: K3 {
3、
* v0 Y" g( U. a( x m2 p6 ? 选择“ RunAuto ”按钮并选择一个 python 文件, PSSE 会运行那个文件。 ! f$ ^3 j8 P: H7 I* e
注意 python 命令可以直接在控制台输入。控制台动作同编译 python 的交互式平台不同,它不自动显示调用方法所返回的结果。要想显示的话必须使用 python 的 print 命令,例如: print(psspy.aMethod(myParameters)) 。 / \/ p- N, k. U& W
一个重要的点是所有列出的方法都是 psspy 方法。所以使用要使用 totbus 方法返回母线数量时,输入 CLI 时不能使用 ival=totbus() ,而应该使用 ival=psspy.totbus() 。在 CLI 中使用 print(ival) 来显示 ival 。 Python 语法也可以使其简化,如: from psspy import * 。采用何种编程风格由用户决定。
& R# O, ]4 y# J+ T. r 6 W- m9 r. y/ g3 n& \9 j
在 IDLE 编译平台测试 python 代码 5 j( ~: w: k6 C& I* L
我花了让人崩溃的长时间来寻找下面这个加入到 python 路径的方法。
7 [2 _; P E4 t2 N- L 当你想将自己写的一个模块导入 python ,或者要把一个处在其他文件夹下的模块加入到 python 文件中去,那么下面的方法就大有用啦:
j- ?: S: q! ]% d7 `; H* L3 x 1、% Y$ p% C: p" |
创建一个扩展名为 .pth 的文件。我们起个很漂亮比尔盖茨又很喜欢的名字 myconfig.pth 。当你在使用记事本之类的编辑器时就要小心了,不要保存成 myconfig.pth.txt 哦。 * \9 b" X; U6 {7 t/ P' z2 q1 z7 n
2、
/ M' Q* x9 o; n( g3 e 把这个文件放到 python 根目录下面去,比如我的就是 C:\Python23 。 6 ^8 x9 t$ a8 v9 {+ g" h2 T" S
3、
* T' p8 T+ r5 s7 z$ o: J& W 把每个你想加入 PYTHONPATH 的文件夹全路径,单独一行的加入到这个文件中去。例如,第一行可能就是: C:\aFolder\work\Python 。 4 U3 t% {2 t6 p9 A1 F0 y
这样可以解决下面的错误,当你导入 Spam 这个模块的时候就不会出现: ImportError: No module named Spam. ' W; e% U9 r7 H4 L9 L
9 v; I0 Y9 f1 P& S 获取和设置网络数据 5 T7 B% B* j% p+ W0 W5 Z
直接获取数据是很费力费时的事情。在网络中的每个部分都有几个不同的参量,比如负荷。每个参量均必须分别通过函数调用来访问。所以如果要找出每个母线的电压,那么必须对每个母线通过 psspy 对象调用方法 busdat 。它的参数通过一个字符串来解释,就如一开始所说的,这些参数可以在 IPLAN 说明书里找到,同 Python 里的命令名字相同。
- J; _, }7 e7 c' b2 m 生成
# G* T- K2 \- Q+ U: t 字符 / 文件
% b( s- U! G5 F& c* F' o 格式的报告是可以的,我曾经试图寻找转存这些变量的方法,这样就可以不通过文件系统直接可以通过 python 代码来访问了,但是没找到。如果有谁找到了这种方法请告诉我。如果西门子能改进一下 API 的话这将变得很简单,但是我们现在只能根据已有的东西来做。 3 o v% W" }# E2 ]4 t" K% L. D6 i
反过来,也令人郁闷的是,要设置数据,每个部分的所有参量都要提供出来。幸运的是,有默认的对象 _i 和 _f ,当你不想改变某个值时,插入这些对象即可。当运行和导入我自己的主模块时,我把这些对象存储在 psspy 对象中,这样每当 psspy 对象使用的时候,他们就能使用。对于整形和浮点数参数分别有个默认值(对象),我想他们与各自能取到的最大值相等。 0 s) P+ J4 o& T) C
# X# X. H$ |! }( u1 H9 V# S
在 Python 中组织 PSSE 数据 3 D$ N. e! C. k
当使用 Python 扩展 PSSE 时,经常没有必要抽取所有的 PSSE 使用的数据。我创建了两个主要的类,一个与一个母线有关,叫做 Bus ,另一个与两条母线有关,叫做 Branch 。我所使用的所有层次如下所示: 5 i' }% ~& G: }6 `% a7 e# n& q
o* z5 v! F$ t' b' [
Machine
·5 r! P \- y1 ~4 Y! Q
Branch
o
8 d$ t' I# P; c Transformer
我把这些对象做一个列表来标识整个的网络。 Python 在快速和简化处理对象列表方面非常擅长。选择或者增加方法可以用于大批 bus 和 branch 类,这些类包含有用于对象中所有参量的处理方法。这样可以提供一种便利:一个部分的任何参量,通过大量的方法均可以对其他部分可见。可是呢,我正在有目的的在我的工作中避免出现这种情况。
7 I, m$ d) B1 \/ h) B$ l: ^ 注意当在 Python 中创建一个 PSSE 模型的拷贝时,这些拷贝还处于同步状态。因为潮流计算的原因,一些参数会改变而其他参数不会,例如,改变线路参数并重新计算,貌似改变了复杂(复数)的母线电压,但是不改变负荷。这样必须把从 PSSE 模型里观察到的数据同存储在 python 模型中但是在 PSSE 模型中使用的数据区分开来。 4 _7 z$ o o" x$ b5 [# R7 T: N
) F7 z$ h s( ?
编译更复杂的 Python 程序 & b% ^% j( o) M: M, l( {# W8 M
我保留了一个叫做 PSSPYStub.py 的 python 文件,它包含一个仿冒的 psspy 类,其中对应于每个所使用的 psspy 方法均创建一个短小的仿冒方法。这样当我进行简单测试编译 python 代码时把这个 PSSPYStub 类代替 psspy 类,这样就避免了开启 PSSE ,可以允许 python 调试工具的简单使用。
$ S e, o( F. U7 @5 e 这个短小的仿冒方法对于 psspy 函数来说是微不足道的,但是在使用一些函数时需要注意,例如 nxtbus 函数,这个函数用来返回 & N# w& z6 \& ~. u: J9 Q. K
调用 inibus 函数之后还没有输出的下一个载入 PSSE 的母线节点号。为在这个仿冒方法中实现这个函数,需要在 inibus 函数中创建一个 count 变量,并且在 nxtbus 函数中对这个变量进行递减,并返回一个母线节点号直到其达到 0 。
/ |0 o% l' y- K8 ]/ x 注意!更难的 python 内容
- B8 _% n& Q0 o' I, V$ z! N; D 调试过后的代码如果能在 PSSE 中运行同样可以使用 IDLE 界面。打开 PSSE 和 CLI 界面并且输入并运行 Runldle.py ,不出意外地话会打开 IDLE 编程环境。通过打开这个调试器运行你的 python 代码。
% ~9 A; P7 @+ e; T. e i' | 使用这个方法有点不同,当你使用 import 命令时,主要的 psspy 对象和伴随的 _i 和 _f 将在你运行中的模块中不能访问。在 PSSE 中的“ Run Auto ”按钮不同于标准 python 中的 import 命令。“”按钮允许运行一个 python 模块时把 psspy 作为一个全局变量。但是在你得到的 IDLE 解释器中的 import 命令不会把 psspy 作为导入模块的全局变量。在 python 中一个全局变量只能在本模块中可见。 . T6 H/ Z5 D1 j9 \- a7 @
为了解决这个问题,我在本应在“ Run Auto ”按钮运行的代码之外创建了一个类, __init__ 的定义会将psspy对象作为一个参数分配到一个类变量中。这样他在整个类中都会可见。 # Q5 b. ^+ N5 j; }0 m# ~
包含这个类的模块被导入后,一个这种类的对象会被创建,这样这个类的所有函数都能被调用。例如,这个类可能包含如下的函数: / T2 ]3 V. T; P! M, G
·
, t5 z7 B4 o. i loadRawFile 装载一个 raw 文件到 PSSE 中 .
·% [% F8 B/ V: G* [' e
parseDataFile ; |9 P% k# W2 i6 B; _2 D9 H
装载额外的仿真参数 .
·4 J: f! f/ Y+ R Z
runSimulation & j% a/ n: X3 u" j+ e) k' \/ X
运行一个潮流计算 .
·
9 W3 |4 m, r; ~2 y2 H- X saveResults
8 Z9 H& i0 l9 Q' s3 b" s 存储重要的数据到文件中 .
你可以从Python解释器中手动调用这些函数。
, M0 x9 R& ?) D! P# J( F 同样的,你可以使用__init__ s/ P; ?# Z8 ]/ N* Z
函数仅按顺序包含所有你想执行的脚本。这些命令就像是初始化 PSSE 和你想使用的任何 Python 对象。最终这些命令会使 PSSE 进行一些例如潮流的计算。 7 K* [9 c. n9 x& k) |' a
2 I* U, o# ?, c# G
处理数组
+ L4 y" C9 K6 P/ e3 W 我逐渐能熟练处理数组和数字矩阵了。不在重复强调使用列表类型,而使用数字类型,这样会比使用列表快的多,而且你的程序读起来也更直观。它同在 MATLAB 里面使用一样方便,数字类型不仅仅是一个 Python 模块,也与最优化并且与编译的矩阵运算代码相关。
/ O9 D) C# ^' ~* G% J' U 与数字类型相关的信息可以在 这里 找到
4 x. L" }' l5 o/ n' r 在导入数字类型(Numeric)之前必须进行安装。使用在Python中导入模块的标准方法 进行导入,你可以通过dir(Numeric)命令观察可用的方法及类结构。
! `3 R6 V2 x) _6 W0 [8 l. I 我使用的最多的方法是:
+ ]1 K9 y1 r7 m; F! F9 L9 @ X Array ! J% u" D, E# o2 a2 r$ `3 ]
使用这种方法从一个列表里创建数组可以包含一个数字或者一列数字。加些参数就可以使数组包含浮点数等等。例如:Numeric.array([1,2,3],'f')可以返回一个包含有浮点数1,2和3的数组。 * k/ x. m/ Y( R; i* E( E: \
Arrange . b# q V4 x: i. y/ g. U% ~, C4 \& t/ _
这个方法根据你的描述来产生一个范围的等差数字,例如:Numeric.arange(0,0.5,0.1) 返回
* h$ O; P1 S( f/ I" H array([ 0. , 0.1, 0.2, 0.3, 0.4]) . 注意数组中不包括最终值。
0 |; V4 y0 N% C* ? Transpose 4 t4 Y, Y! C X# _( K
给定 a=array([array([0,1,2]),array([3,4,5])]) , 那么 transpose(a) 可以返回: 7 I/ K; w: @/ w6 ^, v+ A
% ^* }3 e, Q; e( [
# D4 E, S" r s3 B% o3 P. X$ j
: ^) A: K8 Z' T' f3 s( Y4 s array([[0, 3],! y3 E$ z1 K8 a, S! s- W/ o
& M! B* A' t [# A; i5 C- B [1, 4],
6 D+ Q8 o7 i+ ]- M, l [2, 5]])数字数组中最有用的功能是数字定义了标准的操作如何执行例如加法,乘法和逻辑运算。 保存数据以便在MATLAB中使用 导入数据到MATLAB中有多种方法,广义来说主要有以下三种: l
( p! W5 z* r. x$ ?/ X% j- K MATLAB 格式.mat文件 l
3 |* W* o5 \, p1 y7 _+ D ASCII 编码数据文件 l
9 [8 z9 o; C# d4 j# C( l; E 文本文件 MATLAB 格式.mat文件 这个格式需要各种文件头。我不知道有没有pythond的模块可以执行保存为.mat文件,但是在这个文件中细节描述了这种格式。 ASCII 编码数据文件 就我所注意到的,这些文件只能存储数字信息。这些值按照行列来组织,每一行的列数必须相等。列之间可以使用各种字符隔开,比较常用的选择就是使用tab建或者空格键键入的空格。行使用转行分开,这样他们在文本编辑器中显示新的一行。 下面是一个例子: from Numeric import * m = array([1,10,2,20]) m = reshape(m,(2,2)) f = open('test.dat','w') for r in m:
, T. v% i. f$ j8 m3 _& m. P for c in r:1 ~% K; ~/ }8 h4 ^& }9 Q" Q7 H
f.write("%i ")7 x8 ?# }, W5 |. r2 `! I
f.write("\n")f.close()
在MATLAB里面,下面的语句就可以装载test.dat文件并把它作为一个变量test。 文本文件 最强大的,看起来可以被容易执行的方法,就是生成一个文本字符串,当执行的时候可以生成需要的对象或者在MATLAB中的对象。但是我想这可能不是最有效的办法。 例如,设想一个bus类含有fields, voltage, load 和 generation over time,如下所示: class Bus:
7 |, }+ L3 p; o) h' e, F2 ]9 _ number=None
2 f7 i* S+ ?' }# M0 n Pgen=[]% v: p- ^3 J" A1 Y
Pload=[]
) K. ` x$ Z0 z5 B V=[]2 K! }1 R6 X: _1 u J9 I b
def __init__(self,number):
" @3 i# O. ?: i' C q! X
2 z0 z2 w/ U& }6 }, ` G self.number = number ) {( |# J" c, r0 K1 s# J
def storeStepData(self,g,l,v):. T @7 H6 g' S! S" `
/ R" f+ E( n3 S
self.Pgen.append(g)
& [# T% Z( X, h. C self.Pload.append(l)) G- T* h5 s$ o2 v1 I
self.V.append(v)
在类的定义中加入一种方法,这个方法可以产生适用于MATLAB的自我解释的字符串描述。 1 E2 [0 a* z* n8 Y6 W: i$ S
def matlabString(self): / ^& Q7 k( K' O; K1 k( B/ r
s1="bus%i.Pgen=%s"%(self.number,str(self.Pgen))
1 S- Z5 _+ S) X" K* V0 j s2="bus%i.Pload=%s"%(self.number,str(self.Pload))
4 k. t) B6 ^/ D, j) T) e s3="bus%i.V=%s"%(self.number,str(self.V))6 `* V2 p. @: @# @) |7 o, O) O
return("%s;%s;%s;")%(s1,s2,s3)
在 Python 中,在主程序中插入退出字符来建立包含变量的字符串。 紧接着一个包含需要插入主程序的值的 tuple( 元组 ) 。最后一样连接三个其他的字符串,并在每个字符串后面放置“ ; ”字符,这同时把三个命令分开,并能组织 MATLAB 输出这些结构内容。
$ a2 O: ?5 Z, o4 p 下面的测试代码在 Python 中运行会产生一个示例保存文件。
9 L) ^3 S6 G, {, |- s b=Bus(10) b.storeStepData(1,2,3) b.storeStepData(1.5,2.3,3.1) f=open('test.dat','w') f.write(b.matlabString()) f.close()
: I" d8 h( t0 X2 z6 _0 h
下面一段 MATLAB 中的代码可以产生一个结构,包含有从 bus 工程中保存下来的数据
1 D V) m" d4 J4 l fhandle=fopen('test.dat') fstring=fscanf(fhandle,'%s') eval(fstring)
结构“ bus10 ”现在可以在键入的 matlab 代码中起到作用。其中“ 10 ”部分是根据 bus 和母线节点号在 matlabSring() 函数中生成的。 1 v8 c. B# `0 \0 ~: f4 H
/ \* U) n) K$ Z8 l$ Q5 |
异常处理 , X4 O; J8 p. _6 ?8 |7 F0 s5 ^
异常处理,是现代编程语言中使用的一种错误处理和诊断的方法。例如,没有必要在其他返回值再增加一个错误代码,而是如果有错误发生的话直接引发一个异常。这样做的好处是,错误不会被默认忽略。如果不检查错误代码的话,这个方法的失败就可能不被发现,可能会造成跟踪程序错误的困难。 $ h( F3 `5 ^6 C% t; s5 A5 q$ E
在 python.org有一个异常处理的手册 ,它同样包含有用户自定义异常。
* M; o% m7 f, f/ x& Z8 Q! ~
$ J/ t* }% m! U' y. l* b+ Z 但是 PSSE 提供的 API 接口不适用异常处理,这样你在每次调用 API 时,都要严格检查错误代码变得很重要。我建立了一个与 PSSE 交互的特殊类来解决这个问题,所有 API 的调用都要适用这些类。每个 API 调用的时候都跟随错误代码检查。如果错误代码只是的是失败,则就引发一个异常,根据具体的错误代码使用合适的,定制的异常和信息。 8 C X% ~6 ?3 S Y+ o7 D1 ?
) @/ U$ J4 A+ U- O9 y3 J' u( G 使用 Python 模块 random
( P2 X; ]# C+ \- n2 n t Random模块 可以根据不同的分布状态产生随机数,并允许控制产生的状态。使用在 Python 中引入 模块的标准方法 ,导入 random 。你可以通过 dir(random) 函数查看可用的方法和类的构造。
) ~# ~# B* V8 w. W. k w4 \$ F 我用的最多的方法是:
. b" T6 X/ J2 u& d( D: x Getstate / X% c7 M3 S/ K" H0 ?
这个方法返回产生随机数的当前状态。这个状态可以保存并在稍后用来设置模块的状态回到以前状态,具体方法可以查看下面的 setstate ,例如: savedState = random.getstate() .
" v3 X: O" d5 Q( t6 s Jumpahead ) b0 o- T; s7 O- i
这个方法用来改变当前状态,只要模块不会产生一系列数字覆盖在执行 jumping ahead 命令之前的状态。例如 random.jumpahead(42) 0 P& z5 c/ I# H. m0 A2 {$ P
normalvariate 和 uniform B9 d5 J$ u: g- c
这些方法是少数返回随即数的方法的两个,他们分别返回符合正态分布和平均分布的随机数。方法 mormalvariate 需要平均值和标准偏差两个参数,方法 uniform 需要最大值最小值得范围 rang[min, max) 。 ! K* u0 [0 g, h, q" }
例如: random.normalvariate(0,1) 和random.normalvariate(0,10) . ! V' y$ a4 ]8 n7 c/ g [
Seed " E% x* k7 x' S; f& l2 O
这种方法可以使用任何不规则格式设置随机数产生器的状态,例如字符串。这样,不必要首先在文件系统中存储一个状态类就可以设置状态了。例如: random.seed("My! I do like coding, it's such fun!") . % _1 R, ?0 _; ~$ k. ?+ c) S
Setstate + S6 j8 j1 O# I& E
这种方法使随机数产生器的状态设置为之前使用 getstate 保存的状态,例如: random.setstate(saveState) 。
g$ D3 S! c2 w/ ~6 X) E0 z' \5 Y 我发现在使用 random 模块时创建自己的类是十分有用的,在其中,产生随机数的方法保证了 random 模块的状态不发生变化。这可能被忽略了,但是一次只有一个 random 模块导入。那样我就可以创建多个自定义的 random 模块来产生随机数字,没有必要干涉每个产生器的状态。 # M/ {* j1 u+ F/ m* _
7 X1 ]; I5 W- e) N$ n# {, G* s0 b
其他注意事项
' Q; W8 |$ r% R& T l
( p$ @& t0 u# N* p. ~% w9 |# z- s 我也写了一些实现以下功能的 python 代码:
/ N+ o& N% I3 D/ W/ ? ²
9 {2 U) r8 z, [& M2 ? 潮流运算和获取网络所有的数据。
: M0 w, j6 R/ S4 b) ~ ²
4 J X7 U( D9 u! H @2 i 基本的低 / 高 / 带通滤波器。
3 S( U% U+ q& I0 W ²
7 ?1 p- }3 y& S8 f( Y2 E 梯形三角形模糊逻辑 9 M9 J5 W3 s; p- ]
²+ }# j5 F0 y) ?! y0 B% ~
如下所说的我不能使用 scipy ,基本的插补类 - K( B# W- f( ?- \, f
l- ^9 r1 |3 Q; \* k" O4 B
我在 PSSE CLI 或者在 CLI 运行代码时,使用 import scipy 时出现了问题,当我从 Fortran machine 里导入时,出现了浮点数溢出的现象,所以我尝试了很多次重建 wheel 因为我不能使用。
* h" x4 T ^ m. O( V% Y l
V) J( f4 `! q) { 我又碰到浮点数溢出的现象了,这次是当我把自己的模糊逻辑模块应应用为 PSSE 扩展脚本的一部分时出现的,我想这是甚至因为我再 scipy 只引入了 interp 部分造成的。如果只在 python 解释器下测试的话就不会出现这个问题。 / s$ C% ^) T2 a8 S6 H0 T. h! \% z5 e
l; ~' ?7 P8 ? w" D
我碰到了一个 Fortran 的错误,可能是由 Python 引起的。我忘记了它是不是被零除过,还是因为我试图当作一个 list 来读取数字,或者这两个方面都有。这里的课程可能会在 Python 没有抛出异常的地方出现问题,结果造成了不良的运行时错误,但是原因可能很简单而且错误能确定。
/ f1 a5 n; e% y& A( L4 M6 ]. N l
1 b+ q2 S* ?1 | R( P* Z: D 在潮流运行完毕之后需要使用 solved ()来检验潮流是不是收敛了。如果潮流没有收敛,一些网络可能从步参数比默认参数小 100 或者更多( -_- )受益。当先减小补偿时,代数限制应该也要放宽。
8 C+ L3 o, X2 N; d6 D5 K0 N! {8 X l" |6 x5 z" \) x1 ^. I9 M! T
读一下说明书。他有不同求解方法的正面和反面介绍。 8 ?3 h2 V6 n o0 p2 t
l/ G2 Q0 u/ w/ v; ^0 k9 a+ t
在我的版本中 GSLV 会让电脑崩溃,更郁闷的是他在我的工程里运行比在 MSLV 中运行的好,而我只能呢个使用 MSLV 进行扩展仿真。
K6 k. l/ h3 E2 w7 h l* D! s' |# Z+ j7 |
警告。逐步备份你的 .raw 文件。 PSSE 有个坏习惯,覆盖的时候没有警告,即使那个模式已经关掉。 PSSE 还可能把不能自动调节的变压器,做成能自动调节的变压器模型。我不确定什么时候会发生这种情况,但是我已经被这个问题浪费了一些时间了。
) e0 O9 J3 X4 s5 @ l& e5 ?1 N8 N9 j0 M0 L4 ~5 M: `
一个不错的网站 ,关于 Python 的。
' M9 y9 p* D" }( z! O5 Z2 q
* `- }8 K$ d) B7 s 建议和评论
h1 }) z2 f+ R9 r, u 如果有任何建议或者改进欢迎发 Email 给我,我可以分别把具体的 PSSE 功能性的使用和详细地执行信息联系起来。 Email jbo at ee ed ac uk 。
( N! G: x% \' {! K5 Z f6 Q 发邮件给我的任何问题或者在 AQ网页 里的问题我都会回答的。 5 `8 W! m0 \0 Y% Q
6 F, M# G$ {) G" q/ o* x2 } Q" t! ]+ e0 p6 T) N
[ 本帖最后由 dsyljh 于 2007-9-24 16:27 编辑 ]
使用Python扩展PSSE.rar
21.65 KB, 下载次数: 106, 下载积分: 威望 -2 点, 学分 -5 点
介绍在PSSE中使用Python脚本语言的初级入门方法和一些代码
评分
查看全部评分
楼主热帖