こんな実験して見ました

 投稿者:lark12_long  投稿日:2014年 8月29日(金)14時34分34秒
  '
'   汎用シミュレータ.bas
'
'     マウス左クリック保持で一時停止
'     マウス右クリックで打ち切り終了
'
'     H26-08-29 lark12
'
'
width= 1100
height=660
SET BITMAP SIZE width, height

gx=width
gy=2

'左端,右端,下端,上端
set window  -gx/20-50,gx,-gy,gy

'描画エリアの背景色着色範囲設定
set area color 1 !'黒
plot area : -gx,-gy;-gx,gy;gx,gy;gx,-gy

'座標描画
  draw axes (50,0.1)
  draw grid(50,0.1)
'------------------------------------------------------------

n=20                              '出力信号数
dim p(n)                          '出力信号
dim po(n)                         '前回出力信号
dim p$(n)                         '出力信号名

dt=0.01                           '計算ピッチ
dtx=dt*100                        '表示ピッチ:1/100単位
'---------------------------------------------
do
  '計算式記述subコール
   call cal1                       '一時遅れ
  'call cal2                       '連立方程式
  'call cal3                       'sin^2+cos^2=1に成る様子

'---------------------------------------------
   call draw
   t=t+dt
   mouse poll xm,ym,left,right
   if right=1 then stop             '終了

   do while left=1                  'ポーズ
     mouse poll xm,ym,left,right
   loop

loop
'-----------------------------------------------
'計算式記述

sub cal1
  '1次遅れ
  ta=1                   '時定数
  k=1                    'ゲイン
  x=1                    '入力信号
  y=y+( k*x-y)/ta*dt     '一時遅れ出力
  z=0.63                 '63%値

  p(0)=x    :p$(0)="x"
  p(1)=y    :p$(1)="y"
  p(2)=z    :p$(2)="z"

end sub
'----------------------------------------------------
sub cal2
'連立方程式
'解は a=0.1:b=0.2:c=0.3:d=0.4
'5*a+3*b-4*c+2*d=0.7
'4*a-3*b+4*c-2*d=0.2
'5*a+4*b+5*c-5*d=0.8
'2*a+10*b+10*c+9*d=8.8

'原始式を、下記の様に一時遅れの形に変形し、
'繰り返し計算し収束した値が解となる
  a=a+( (0.7-(3*b-4*c+2*d) )/5  -a)*dt
  b=b+( (0.2-(4*a+4*c-2*d) )/(-3) -b)*dt
  c=c+( (0.8-(5*a+4*b-5*d) )/5-c)*dt
  d=d+( (8.8-(2*a+10*b+10*c) )/9-d)*dt

  p(0)=a      :p$(0)="a"
  p(1)=b      :p$(1)="b"
  p(2)=c      :p$(2)="c"
  p(3)=d      :p$(3)="d"

end sub
'----------------------------------------------------
sub cal3
  a=sin(t*2)
  b=cos(t*2)
  c=a^2+b^2   'が1になる様子

  p(0)=a      :p$(0)="a"
  p(1)=b      :p$(1)="b"
  p(2)=c      :p$(2)="c"

end sub
'----------------------------------------------------
sub draw
   '出力信号グラフ、信号名の表示
   local xd1,yd1,xd2,yd2
  '表示記述
   set draw mode hidden
   set line width 2

   '変数名表示エリアクリア
   xd1=-100:yd1=-2
   xd2=xd1+60:yd2=2
   line(xd1,yd1)-(xd2,yd2),1,bf

   '左端に出力信号名を、その値の大きさ位置に表示
   for i=0 to n-1
     col=mod(i,6)+3
     line( tx-dtx,po(i))-(tx,p(i)),col
     po(i)=p(i)

     xd1=-100:yd1=p(i)
     set text color col
     set text font "MS 明朝",20
     plot text,at xd1,yd1:p$(i)
   next i
   set text font "MS 明朝",11

   tx=tx+dtx

   'グラフが画面右端まで到達したら、画面更新
   if tx>1100 then
     '描画エリアの背景色着色範囲設定
      set area color 1 !'黒
      plot area : -gx,-gy;-gx,gy;gx,gy;gx,-gy

     '座標軸描画
      draw axes (50,0.1)
      draw grid(50,0.1)
      tx=0
   end if

   set text color 5
   set text font "MS 明朝",20
   plot text,at 850,-1.7:"横軸=         sec"
   plot text,at 850+80,-1.7,using"##.###":0.1

   set draw mode explicit

end sub
'-------------------------------------------
 

戻る