|
初めての投稿です.よろしくお願い致します.リタイアした電気系エンジニアです.Basic09,QBasicからVisual Basic5,6を経由し、Delphi6,7 Turbo Delphiを道具として、回路計算を行ってきました.PCにプログラミング言語が同梱されなくなったせいか、自分でモデルを作り、計算式を立て、計算をするという風潮が見られなくなってから久しいように思います.設計現場へのプログラミング言語導入に努力してきましたが、導入費用、ライセンスの観点から、現在はlazarusを推奨しています.Delphiで作った回路計算用コンポーネントをlazarusに移植し、一応の環境を作り上げました.しかし、プログラミングの経験のない人にはlazarusは取っ付きにくいようで、入門用の言語を探していました.そんな折も折、5日前に十進Basicに遭遇しました.名前を見た限り、失礼ながら「おもちゃっぽい」枠組みだろうな、とタカをくくっていたのですが、ダウンロードして、いざ動かしてみるとそのしっかりした仕組に驚かされました.何よりも嬉しかったのは、複素数が普通にサポートされている点です.Delphiも複素数をサポートしていますがライブラリーにバグがあり、技術系さんには当たり前の10^-6程度の小さな値が使えません.仕方が無いので、小さなパッチを当てて使ったものです.lazarusuの複素数サポートは実用的には問題がありません.十進BASIC習熟のため、この掲示板を見ながらいくつかのプログラムを作っています.この掲示板では数学問題に興味をお持ちの方が多いようで、回路問題はあまり論じておられなくて残念に思いました.しかし、「複素数」といえば回路計算、ということで早速簡単なプログラムを作って確認しました.このプログラムは複素数の行列演算が可能かどうかを確認するためのものです.期待通りの結果が出てとても喜んでいます.もう少し習熟してから、昔の職場への普及を図りたいと考えています.それにしても、このように美しいソフトが、PCにバインドされれば、エンジニアのマインドも少しは改善されるでしょうに.
回路計算への応用に興味ある方がおられるようでしたら、いくつかの例をご紹介したいと考えております.
今回のプログラムのリストです.回路モデルと基本の計算式は添付ファイルを参照してください.回路方程式は、いわゆる節点解析をベースにしています.
使ってみての感想ですが.Graphicで描画される線や点のサイズが小さい(細い)ので表示された結果が良く見えません.今回は稚拙な方法で大きなドットを作って見やすくしたつもりです.もう少しスマートで汎用的な方法はないでしょうか?
OPTION ARITHMETIC COMPLEX
OPTION BASE 0
SUB PutDot(i,x)
ASK WINDOW w,H,LL,RR
LET sw=w/641*1
LET sh=h/641*10
PLOT AREA:i,x;i-sw,x;i+sw,x;i,x+sh;i,x-sh
END SUB
SUB DrawLog(L,H)
SET WINDOW L,H,-42,42
ASK LINE STYLE s
ASK LINE COLOR col
SET LINE COLOR 15
SET TEXT COLOR 1
SET TEXT FONT "Century Gothic BOLD ITALIC",12
FOR i=L TO H STEP 1
SET LINE STYLE 2
PLOT LINES :i,-42;i,42
LET k=10^i
CALL un(k,uni$)
SET TEXT JUSTIFY "LEFT","BASE"
PLOT TEXT ,AT i,0:STR$(k)&uni$
SET LINE STYLE 3
FOR j=2 TO 9
PLOT LINES :LOG10(j*10^i),-42;LOG10(j*10^i),42
NEXT j
NEXT i
FOR j=-40 TO 40 STEP 10
IF J=0 THEN
SET LINE STYLE 0
ELSE
SET LINE STYLE 3
END if
SET TEXT FONT "Century Gothic BOLD ITALIC",12
SET TEXT COLOR "blue"
SET TEXT JUSTIFY "LEFT","half"
PLOT TEXT ,AT LOG10(1.2*FL),j:STR$(J)&"db"
IF j>=-20 AND j<=20 THEN
SET text COLOR "RED"
SET TEXT JUSTIFY "RIGHT","half"
SET TEXT FONT "MS 明朝",12
PLOT TEXT ,AT H,j:STR$(J*9)&"°"
END if
PLOT LINES :L,j;H,j
NEXT j
SET LINE STYLE s
SET LINE COLOR col
END SUB
SUB UN(n,uni$)
LET x=INT(INT(LOG10(n/1000))/3)+1
IF x<0 THEN
LET x=0
ELSE
LET n=n/1000^x
END IF
LET uni$=u$(x)
END SUB
DEF db(x)=20*LOG10(ABS(x))
DEF SINH(x)=(EXP(x)-EXP(-x))/2
DEF COSH(x)=(exp(x)+exp(-x))/2
DATA "","k","M","G","T"
DIM U$(5)
FOR j=0 TO 4
READ U$(j)
NEXT j
LET fl=10E3 ! fmin
LET fh=1200E3 ! fmax
CALL DrawLog(LOG10(fl),LOG10(fh))
LET f0=1E6 ! Band width of OP AMP
LET G0=1E5 ! DC Gain of OP AMP
LET w0=2*PI*f0
LET g1=1/20E3 ! 1/R1
LET g2=1/30E3 ! 1/R2
LET g3=1/12E3 ! 1/R3
LET gout=1/2000 ! 1/Rout
LET C1=330E-12
LET C2=33E-12
SET POINT STYLE 1
LET f=fl
DIM Ak(0 TO 1,0 TO 1)
DIM ax(0 TO 1)
DIM b(0 TO 1)
DIM AkI(2,2)
LET b(0)=g1
LET b(1)=0
DIM Bk(0 TO 2,0 TO 2)
DIM Bx(0 TO 2)
DIM Bb(0 TO 2)
DIM BkI(3,3)
LET Bb(0)=g1
LET Bb(1)=0
LET Bb(2)=0
DO
LET w=2*PI*f
LET Gop=G0/COMPLEX(1,w*G0/w0) !OP AMPのゲイン
LET YC1=COMPLEX(0,w*C1)
LET YC2=COMPLEX(0,w*C2)
LET Ak(0,0)=g1+g2+g3+YC1
LET Ak(0,1)=-g2
LET Ak(1,0)=g3
LET Ak(1,1)=YC2 !OP AMP のゲインを∞としたとき
MAT AkI=INV(Ak)
MAT ax=AkI*b
LET Glpf=AX(1)
!OP AMP のゲインをGopの場合
LET Ak(0,1)=-g2+g3/Gop
LET Ak(1,1)=YC2+(YC2+g3)/Gop
SET area COLOR "BLUE"
CALL putdot( LOG10(f),db(Glpf))
SET area COLOR "RED"
CALL putdot( LOG10(f),arg(Glpf)*20/PI)
MAT AkI=INV(Ak)
MAT ax=AkI*b
LET Glpf=AX(1)
SET area COLOR "MAGENTA"
CALL putdot( LOG10(f),db(Glpf))
SET area COLOR "GREEN"
CALL putdot( LOG10(f),arg(Glpf)*20/PI)
! Routを考慮すると
LET Bk(0,0)=g1+g2+g3+YC1
LET Bk(0,1)=g3/Gop
LET Bk(0,2)=-g2
LET Bk(1,0)=g3
LET Bk(1,1)=(g3+YC2)/Gop
LET Bk(1,2)=YC2
LET Bk(2,0)=-g2
LET Bk(2,1)=-gout+YC2/Gop
LET Bk(2,2)=gout+g2+YC2
MAT BkI=INV(Bk)
MAT bx=BkI*bb
LET Glpf=bx(2)
LET G=db(Glpf)
SET area COLOR "black"
CALL putdot( LOG10(f),db(Glpf))
SET area COLOR "black"
CALL putdot( LOG10(f),arg(Glpf)*20/PI)
LET f=f*1.01
LOOP UNTIL f>fh
END
|
|