交流回路解析

 投稿者:石橋屋メール  投稿日:2011年 3月11日(金)11時29分14秒
  初めての投稿です.よろしくお願い致します.リタイアした電気系エンジニアです.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
 

Re: 交流回路解析

 投稿者:白石 和夫  投稿日:2011年 3月11日(金)12時05分29秒
  > No.1499[元記事へ]

数学を使う諸科学での応用が広まることを期待しています。

Full BASIC規格の範囲には線の太さを変える命令はありませんが,独自拡張で
SET LINE WIDTH
命令を用意しています。引数は,標準の太さに対する倍率(整数に限る)です。

Full BASICをObject Pascalに変換するBASICAccも複素数をサポートしています。
Lazarusの新バージョンの公開を待ってBASICAccも次バージョンを出します。
複素数は倍精度数のペアで表現します。完全に同一ではありませんが,十進BASICの複素数演算の移植です。次バージョンでは,プログラムを解析して自動的に実数型と複素数型の変数に振り分けることで現在のBASICAccよりも複素数を使うプログラムを高速化します。


 

Re: 交流回路解析

 投稿者:石橋屋メール  投稿日:2011年 3月11日(金)12時15分52秒
  > No.1500[元記事へ]

白石 和夫さんへのお返事です。
早速のご返事ありがとうございます、

> 数学を使う諸科学での応用が広まることを期待しています。
⇒同感です
> Full BASIC規格の範囲には線の太さを変える命令はありませんが,独自拡張で
> SET LINE WIDTH
> 命令を用意しています。引数は,標準の太さに対する倍率(整数に限る)です。
⇒SET LINE Widthは確認しました.贅沢を言うようですがSET DOT WIDTHみたいな
命令はありますか?
 

Re: 交流回路解析

 投稿者:白石 和夫  投稿日:2011年 3月11日(金)12時35分26秒
  > No.1501[元記事へ]

点の大きさを変える命令は用意していません。
プリンタやメタファイルでの利用を考えるとその種の命令もほしい気はします。
 

Re: 交流回路解析

 投稿者:白石和夫  投稿日:2011年 3月12日(土)07時45分44秒
  > No.1502[元記事へ]

POINT STYLEを追加します。
ただし,追加されたPOINT STYLEにJISとの互換性はありません。
(JISと矛盾することはありません)
 

Re: 交流回路解析

 投稿者:石橋屋  投稿日:2011年 3月14日(月)10時29分26秒
  > No.1503[元記事へ]

白石和夫さんへのお返事です。
ver 7.5.0をダウンロードしました.poin styleは使えるのですが、
ヘルプが使えません. 「 Web ページへのナビゲーションは取り消されました 」
と表示されるだけで、肝心のヘルプが表示されません.
どうすれば回復するのでしょうか?
SET POINT STYLE 2とするとえらく太い線になります.SET POINT STYLE 1だと
ひ弱な表示になります、中間はないのでしょうか.
 

Re: 交流回路解析

 投稿者:白石和夫  投稿日:2011年 3月14日(月)16時18分49秒
  > No.1505[元記事へ]

ヘルプが見れないのは,次が原因ではないでしょうか。
以下の手順で見れるようになれば,セキュリティが原因です。
方法 1
.chm ファイルをダブルクリックします。
[開いているファイル - セキュリティの警告] ダイアログ ボックスで、[この種類のファイルであれば常に警告する] チェック ボックスをオフにします。
[開く] をクリックします。
方法 2
.chm ファイルを右クリックし、[プロパティ] をクリックします。
[ブロックの解除] をクリックします。
.chm ファイルをダブルクリックして開きます。

なお,追加されたPoint Styleは6と7です。
Point Styleの詳細は,サンプルプログラムの
STATEMEN\POINTSTY.BAS
を実行してみてください。



 

Re: 交流回路解析

 投稿者:石橋屋  投稿日:2011年 3月14日(月)16時37分34秒
  > No.1506[元記事へ]

白石和夫さんへのお返事です。
回答をありがとうございます.
残念ながら、問題は解決していません.  .chmファイルというのは
コンパイルされたhelp fileというファイルですね?ご指示のように操作しましたが、
下記のようなう反応はしませんでした.
ちなみに、OSはWindows 7 Home premiumです.
旧バージョンのダウンロードと全く同じ操作をしたつもりですが、
どこでどう間違ったのでしょうか.

> ヘルプが見れないのは,次が原因ではないでしょうか。
> 以下の手順で見れるようになれば,セキュリティが原因です。
> 方法 1
> .chm ファイルをダブルクリックします。
> [開いているファイル - セキュリティの警告] ダイアログ ボックスで、[この種類のファイルであれば常に警告する] チェック ボックスをオフにします。
> [開く] をクリックします。
> 方法 2
> .chm ファイルを右クリックし、[プロパティ] をクリックします。
> [ブロックの解除] をクリックします。
> .chm ファイルをダブルクリックして開きます。
>
> なお,追加されたPoint Styleは6と7です。
> Point Styleの詳細は,サンプルプログラムの
> STATEMEN\POINTSTY.BAS
> を実行してみてください。
>
>
>
>
 

Re: 交流回路解析

 投稿者:白石和夫  投稿日:2011年 3月14日(月)17時04分2秒
  > No.1507[元記事へ]

Windows 7だとしたら,IEのセキュリティで間違いないと思います。
「WEBページへのナビゲーションは取り消されました」 で
検索してみると,たとえば,次のようなページが見つかります。
また,インストール先を変えると効果があるという記事もあります。
もし,BASIC750.zipを展開して実行しているのであれば,
展開先をUSBメモリに変えてみたり,
BASIC750setup.exeを利用してみるなど,試みてください。
以下の画像は,Winodws Vistaで実行してみたものです。
 

Re: 交流回路解析

 投稿者:SECOND  投稿日:2011年 3月15日(火)04時44分22秒
  石橋屋さんへのお返事です。

!太い線で曲線を描く場合にも、plot lines を使う方が、程よい太さで、
!サンプリング間隔も拘束されず、高速で遥かに安定した太さを維持できます。
!それから、U$()の添え字の下限には、負数も使えます。m,μ・・

OPTION ARITHMETIC COMPLEX
DIM U$(-2 TO 4), ybak(4)
!
MAT READ U$
DATA "u", "m", "", "k", "M", "G", "T"!
LET L=LOG10( 0.03E-3 )
LET H=LOG10(   30E+4 )
SET WINDOW L,H,-42,42
SET TEXT FONT "Century Gothic BOLD ITALIC",12
SET TEXT JUSTIFY "center","top"
!
!---- 横軸 対数目盛
SET LINE COLOR 15
FOR i=INT(L) TO H
   SET COLOR MIX(15) .7,.7,.7
   FOR j=2 TO 9
      PLOT LINES :LOG10(j*10^i),-42; LOG10(j*10^i),42
   NEXT j
   SET COLOR MIX(15) .4,.4,.4
   PLOT LINES :i,-42; i,42
   !
   !---- 数値と補助単位シンボル
   LET x=INT(i/3)
   PLOT TEXT ,AT i,0 :STR$(10^(i-3*x))& u$(x)
NEXT i
!
!---- dB の横軸
FOR i=-40 TO 40 STEP 10
   IF i<>0 THEN PLOT LINES :L,i; H,i
NEXT i
!---- 0 dB の横軸
SET LINE COLOR 1
PLOT LINES :L,0; H,0
!
SET LINE width 2
LET f=1E-3
DO
   LET Lf=LOG10(f)
   LET Zt=100/COMPLEX(1,f)   !sample L.P.F( Cutoff=1Hz  6dB/Oct. Gain=40dB)
   CALL PutDot(1, 20*LOG10( re(Zt)), "green")
   CALL PutDot(2, 20*LOG10(-im(Zt)), "cyan" )
   CALL PutDot(3, 20*LOG10(ABS(Zt)), "blue" )
   CALL PutDot(4, arg(Zt)*40/PI    , "red"  )
   LET Lfbak=Lf
   LET f=f*1.1
LOOP UNTIL 10E3< f

SUB PutDot(n,y,c$)
   IF Lfbak<>0 THEN
      SET LINE COLOR c$
      PLOT LINES: Lfbak,ybak(n); Lf,y
   END IF
   LET ybak(n)=y
END SUB

END
 

戻る