For~ Next のカウンターのステップ精度

 投稿者:SECOND  投稿日:2010年 8月24日(火)17時58分24秒
  !For~ Next のカウンターのステップを、整数から実数にすると、
!3桁も、精度が落ちました。正常域内でしょうか?
!
!※試験部分の呼出しに、島村さんのプログラムを、無断ながら使用しています。
LET N=8
LET D=1.432
LET L=5e-3
LET wd=0.3e-3
LET ws=L/(N-1)

DEF y1(x,h)=SQR(h^2+(D*SIN(x/2))^2)
DEF y2(x,h)=SQR((ws-h)^2+(D*SIN(x/2))^2)
DEF f_(x,h)=1/y1(x,h)-1/y2(x,h)
!
!     /2π
!p(h)=| {1/y1(x,h)-1/y2(x,h)}*dx
!     /0

PRINT "計算開始、しばらくかかります。"
!
LET ndiv=200000      !計算分割数( 偶数であること。)
LET dx=2*PI/ndiv
!-----------------------------------------
LET t00=TIME
!----
LET V1=p1(wd/2)
LET V2=p1(ws-wd/2)
LET Capa=1/(V1-V2)
PRINT
PRINT "V1=";V1,"V2=";V2
PRINT "計算分割数=";ndiv,"Capa=";Capa
!----
PRINT TIME-t00;"秒"
!------------------------------------------
LET t00=TIME
!----
LET V1=p2(wd/2)
LET V2=p2(ws-wd/2)
LET Capa=1/(V1-V2)
PRINT
PRINT "V1=";V1,"V2=";V2
PRINT "計算分割数=";ndiv,"Capa=";Capa
!----
PRINT TIME-t00;"秒"
!------------------------------------------
LET t00=TIME
!----
LET V1=p3(wd/2)
LET V2=p3(ws-wd/2)
LET Capa=1/(V1-V2)
PRINT
PRINT "V1=";V1,"V2=";V2
PRINT "計算分割数=";ndiv,"Capa=";Capa
!----
PRINT TIME-t00;"秒"

! シンプソン法
!-------------------------------------------------
! 10 桁 まで、一致。
!
!V1= 3.70090979803183    V2=-3.70090979803183
!計算分割数= 200000      Capa= .135101914741587
! 28.18 秒( P3_500M)
!-------------------------------------------------
FUNCTION p1(h)
   LET sum=4*f_(2*PI-dx,h)                 ! 4*f(xn-1)
   FOR i=1 TO ndiv-2.99 STEP 2
      LET x=i*dx
      LET sum=sum+4*f_(x,h)+2*f_(x+dx,h)   ! 4*f(x1)+2*f(x2)+..+4*f(xn-3)+2*f(xn-2)
   NEXT i
   LET p1=(f_(0,h)+sum+f_(2*PI,h))*dx/3    ! +f(x0) +f(xn)
END FUNCTION


!-------------------------------------------------
!これは、7 桁 までしか一致しないが、上の p1() と同じ。
! step の 精度が、原因のようで、不明?
!
!V1= 3.70090910142236    V2=-3.70090910142236
!計算分割数= 200000      Capa= .135101940171359
! 27.79 秒( P3_500M)
!-------------------------------------------------
FUNCTION p2(h)
   LET sum=4*f_(2*PI-dx,h)                 ! 4*f(xn-1)
   FOR x=dx TO 2*PI-2.99*dx STEP 2*dx
      LET sum=sum+4*f_(x,h)+2*f_(x+dx,h)   ! 4*f(x1)+2*f(x2)+..+4*f(xn-3)+2*f(xn-2)
   NEXT x
   LET p2=(f_(0,h)+sum+f_(2*PI,h))*dx/3    ! +f(x0) +f(xn)
END FUNCTION


!--------------------------------------------------
!これは、山中さんの積算方法の模倣で 10 桁 まで一致。
!
!V1= 3.70090979803014    V2=-3.70090979803014
!計算分割数= 200000      Capa= .135101914741649
! 27.73 秒( P3_500M)
!--------------------------------------------------
FUNCTION p3(h)
   LET sum4=0
   LET sum2=0
   FOR i=1 TO ndiv-2.99 STEP 2
      LET x=i*dx
      LET sum4=sum4+f_(x,h)                ! f(x1) + f(x3)+ .. +f(xn-3)
      LET sum2=sum2+f_(x+dx,h)             !    f(x2) + f(x4)+ .. +f(xn-2)
   NEXT i
   LET x=i*dx
   LET sum4=sum4+f_(x,h)                              ! +f(xn-1)
   LET p3=(f_(0,h) +4*sum4 +2*sum2 +f_(2*PI,h))*dx/3
END FUNCTION

END
 

戻る