新しく発言する  EXIT  インデックスへ
SIN,COS倍角式

  SIN,COS倍角式 しばっち 2008/02/08 20:45:02 
  EXTERNALSUBSINEX(F,COSA(),SINA(,),COSB()... しばっち 2008/02/08 20:45:37 
  │└!チェビシェフの多項式Tn(x)からn倍角の公... 山中和義 2008/02/09 15:09:21 
  │ └山中和義さんご返事ありがとうございます。 しばっち 2008/02/10 17:34:35  (修正1回)
  !tanのn倍角の公式 山中和義 2008/02/10 17:34:41  (修正1回)
   └つづき 山中和義 2008/02/10 17:35:22  (修正1回)

  SIN,COS倍角式 しばっち 2008/02/08 20:45:02   ツリーへ

SIN,COS倍角式  返事を書く  ノートメニュー
しばっち <dihjvcfsyu> 2008/02/08 20:45:02
SIN(X+Y)=SIN(X)*COS(Y)+COS(X)*SIN(Y)
COS(X+Y)=COS(X)*COS(Y)-SIN(X)*SIN(Y)
を使っています

PUBLIC NUMERIC MAXLEVEL
OPTION BASE 0
LET MAXLEVEL=20
DIM COSA(MAXLEVEL),COSB(MAXLEVEL),SINA(MAXLEVEL,MAXLEVEL),SINB(MAXLEVEL,MAXLEVEL)
DIM COSINE(MAXLEVEL),SINE(MAXLEVEL,MAXLEVEL)
LET COSA(1)=1
LET SINA(1,0)=1
LET COSB(1)=1
LET SINB(1,0)=1
FOR F=2 TO MAXLEVEL
CALL COSINEX(MIN(F*2,MAXLEVEL),COSA,SINA,COSB,SINB,COSINE)
PRINT "COS(";STR$(F);"X)=";
CALL DISPLAYCOS(F,COSINE)
PRINT
CALL SINEX(MIN(F*2,MAXLEVEL),COSA,SINA,COSB,SINB,SINE)
PRINT "SIN(";STR$(F);"X)=";
CALL DISPLAYSIN(F,SINE)
PRINT
FOR I=0 TO F
LET COSB(I)=COSINE(I)
LET COSINE(I)=0
FOR J=0 TO F
LET SINB(I,J)=SINE(I,J)
LET SINE(I,J)=0
NEXT J
NEXT I
NEXT F
END

EXTERNAL SUB DISPLAYSIN(F,SINE(,))
FOR I=F TO 0 STEP -1
FOR J=F TO 0 STEP -1
IF SINE(I,J)<>0 THEN
IF FL=1 THEN
IF SINE(I,J)<0 THEN PRINT "-"; ELSE PRINT "+";
END IF
IF FL=0 THEN
IF SINE(I,J)<0 THEN PRINT "-";
LET FL=1
END IF
IF I>1 THEN
PRINT STR$(ABS(SINE(I,J)));"*SIN(X)^";STR$(I);
ELSEIF I=1 THEN
PRINT STR$(ABS(SINE(I,J)));"*SIN(X)";
END IF
IF J>1 THEN
PRINT "*COS(X)^";STR$(J);
ELSEIF J=1 THEN
PRINT "*COS(X)";
END IF
END IF
NEXT J
NEXT I
END SUB

EXTERNAL SUB DISPLAYCOS(K,COSINE())
PRINT STR$(COSINE(K));"*COS(X)^";STR$(K);
FOR I=K-1 TO 1 STEP -1
IF COSINE(I)<>0 THEN
IF COSINE(I)<0 THEN PRINT "-"; ELSE PRINT "+";
IF I>1 THEN
PRINT STR$(ABS(COSINE(I)));"*COS(X)^";STR$(I);
ELSE
PRINT STR$(ABS(COSINE(I)));"*COS(X)";
END IF
END IF
NEXT I
IF COSINE(0)<>0 THEN
IF COSINE(0)<0 THEN PRINT "-"; ELSE PRINT "+";
PRINT STR$(ABS(COSINE(0)));
END IF
END SUB

EXTERNAL SUB COSINEX(F,COSA(),SINA(,),COSB(),SINB(,),COSINE())
OPTION BASE 0
DIM SINE(MAXLEVEL,MAXLEVEL),C(2)
LET C(2)=-1
LET C(0)=1
FOR I=0 TO F
FOR J=0 TO F-I
LET COSINE(I+J)=COSINE(I+J)+COSA(I)*COSB(J)
NEXT J
NEXT I
FOR M=0 TO F
FOR N=0 TO F-M
FOR I=0 TO F
FOR J=0 TO F-I
LET SINE(M+N,I+J)=SINE(M+N,I+J)+SINA(M,I)*SINB(N,J)
NEXT J
NEXT I
NEXT N
NEXT M
FOR L=F TO 2 STEP -2
FOR I=0 TO F-2
FOR J=0 TO 2
LET SINE(L-2,I+J)=SINE(L-2,I+J)+SINE(L,I)*C(J)
NEXT J
NEXT I
NEXT L
FOR K=0 TO F
LET COSINE(K)=COSINE(K)-SINE(0,K)
NEXT K
END SUB

  EXTERNALSUBSINEX(F,COSA(),SINA(,),COSB()... しばっち 2008/02/08 20:45:37   ツリーへ

Re: SIN,COS倍角式  返事を書く  ノートメニュー
しばっち <dihjvcfsyu> 2008/02/08 20:45:37
EXTERNAL SUB SINEX(F,COSA(),SINA(,),COSB(),SINB(,),SINE(,))
OPTION BASE 0
DIM S(2)
LET S(2)=-1
LET S(0)=1
FOR M=0 TO F
FOR I=0 TO F
FOR J=0 TO F-I
LET SINE(M,I+J)=SINE(M,I+J)+SINA(M,I)*COSB(J)+COSA(J)*SINB(M,I)
NEXT J
NEXT I
NEXT M
FOR L=F TO 2 STEP -1
FOR I=0 TO F-2
FOR J=0 TO 2
LET SINE(I+J,L-2)=SINE(I+J,L-2)+SINE(I,L)*S(J)
NEXT J
LET SINE(I,L)=0
NEXT I
NEXT L
END SUB

  │└!チェビシェフの多項式Tn(x)からn倍角の公... 山中和義 2008/02/09 15:09:21   ツリーへ

Re: EXTERNALSUBSINEX(F,COSA(),SINA(,),COSB()...  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/02/09 15:09:21
!チェビシェフの多項式Tn(x)からn倍角の公式を求める

!n倍角の公式
!http://www10.plala.or.jp/rascalhp/math.htm#5


!●cosの場合

!Tk(x)=cos(k*θ)、k=0,1,2,…
!x=cosθ

!漸化式 Tn+2 - 2*x*Tn+1 + Tn = 0
! 第1項 T0=1
! 第2項 T1=x
!が成立する


!漸化式 An+2 - 2*cosθ*An+1 + An = 0
! 第1項 A0=1
! 第2項 A1=cosθ
!となる
!
!A2=2*cosθ*A1-A0
! =2*cosθ*cosθ-1
!A3=2*cosθ*A2-A1
! =2*cosθ*(2*cosθ^2-1)-cosθ
! =4*cosθ^3-3*cosθ
!A4=2*cosθ*A3-A2
! =2*cosθ*(4*cosθ^3-3*cosθ)-(2*cosθ^2-1)
! =8cosθ^4-8cosθ^2+1
! :
! :

OPTION BASE 0

LET N=20 !次数
DIM c0(N),c1(N) !1変数多項式の次数nの係数

MAT c0=ZER !第1項
LET c0(0)=1 !1*cosθ^0

MAT c1=ZER !第2項
LET c1(1)=1 !1*cosθ

LET k=10 !第k項 ※1〜N

DIM c2(N)
FOR i=1 TO k-1 !An+2 = (2*cosθ)*An+1 - An
MAT c2=ZER
FOR J=N TO 1 STEP -1 !2*cosθ*A1
LET c2(J)=2*c1(J-1)
NEXT J
MAT c2=c2-c0 !-A0

MAT c0=c1 !次へ
MAT c1=c2
NEXT i

PRINT "cos k=";k
FOR i=N TO 1 STEP -1
IF c1(i)<>0 THEN PRINT c1(i);"* cosθ ^";i
NEXT i
IF c1(0)<>0 THEN PRINT c1(i)
PRINT





!●sinの場合

!sin(n*θ)=Sn*sinθ
!(Tn(x))'=n*Sn(x) ※チェビシェフの多項式Tn(x)

!T1(x)=x、S1(x)=1
!T2(x)=2*x^2-1、S2(x)=2*x
!T3(x)=4*x^3-3*x、S3(x)=4*x^2-1
!T4(x)=8*x^4-8*x^2+1、S4(x)=8*x^3-4*x

!sin2θ=S2*sinθ
! =(2cosθ)sinθ
!sin3θ=S3*sinθ
! =(4cosθ^2-1)sinθ ※cos優先
! =(4*(1-sinθ^2)-1)sinθ ※sin優先へ
! =-4sinθ^3+3sinθ
!sin4θ=S4*sinθ
! =(8cosθ^3-4cosθ)sinθ ※cos優先
! =(8(1-sinθ^2)cosθ-4cosθ)sinθ ※sin優先へ
! =-8sinθ^3cosθ+4sinθcosθ
! :
! :

DIM s(N)
MAT s=ZER

FOR i=1 TO N !Sn(x)=Tn(x)'/n
LET s(i-1)=c1(i)*i/k
NEXT i

PRINT "sin k=";k
FOR i=N TO 1 STEP -1
IF s(i)<>0 THEN PRINT s(i);"* cosθ ^";i;" * sinθ"
NEXT i
IF s(0)<>0 THEN PRINT s(i);" * sinθ"


END

  │ └山中和義さんご返事ありがとうございます。 しばっち 2008/02/10 17:34:35  (修正1回)  ツリーへ

Re: !チェビシェフの多項式Tn(x)からn倍角の公...  返事を書く  ノートメニュー
しばっち <dihjvcfsyu> 2008/02/10 17:34:35 ** この記事は1回修正されてます
山中和義さんご返事ありがとうございます。
大変参考になります。


TAN倍角を求めるプログラムをのせておきます。

OPTION BASE 0
PUBLIC NUMERIC MAXLEVEL
LET MAXLEVEL=20
DIM A(MAXLEVEL),B(MAXLEVEL),AA(MAXLEVEL),BB(MAXLEVEL),C(1),D(1)
!' B D
!' ---+---
!' A C C*B+A*D
!'---------- = ---------
!' B D A*C-B*D
!'1- ---*---
!' A C
LET C(0)=1
LET D(1)=1
LET B(1)=1
LET A(0)=1
FOR K=2 TO MAXLEVEL
FOR J=0 TO 1
FOR I=0 TO MAXLEVEL-J
LET AA(I+J)=AA(I+J)+A(I)*C(J)-B(I)*D(J)
LET BB(I+J)=BB(I+J)+B(I)*C(J)+A(I)*D(J)
NEXT I
NEXT J
FOR I=0 TO MAXLEVEL
LET A(I)=AA(I)
LET B(I)=BB(I)
LET AA(I)=0
LET BB(I)=0
NEXT I
PRINT "TAN(";STR$(K);"X)=";
CALL DISPLAY(B)
PRINT "/";
CALL DISPLAY(A)
PRINT
NEXT K
END

EXTERNAL SUB DISPLAY(B())
FOR JJ=MAXLEVEL TO 0 STEP -1
IF B(JJ)<>0 THEN EXIT FOR
NEXT JJ
PRINT "(";
IF ABS(B(JJ))<>1 AND JJ>1 THEN
PRINT STR$(B(JJ));"*TAN(X)^";STR$(JJ);
ELSEIF ABS(B(JJ))=1 AND JJ>1 THEN
IF B(JJ)<0 THEN PRINT "-";
PRINT "TAN(X)^";STR$(JJ);
END IF
FOR J=JJ-1 TO 2 STEP -1
IF B(J)<>0 THEN
IF B(J)<0 THEN PRINT "-"; ELSE PRINT "+";
IF B(J)<>1 THEN
PRINT STR$(ABS(B(J)));"*TAN(X)^";STR$(J);
ELSEIF B(J)=1 THEN
PRINT "TAN(X)^";STR$(J);
END IF
END IF
NEXT J
IF B(1)<>0 THEN
IF JJ>1 THEN
IF B(1)<0 THEN PRINT "-"; ELSE PRINT "+";
END IF
IF B(1)<>1 THEN
PRINT STR$(ABS(B(1)));"*TAN(X)";
ELSEIF B(1)=1 THEN
PRINT "TAN(X)";
END IF
END IF
IF B(0)<>0 THEN
IF B(0)<0 THEN PRINT "-"; ELSE PRINT "+";
PRINT STR$(ABS(B(0)));
END IF
PRINT ")";
END SUB

  !tanのn倍角の公式 山中和義 2008/02/10 17:34:41  (修正1回)  ツリーへ

Re: SIN,COS倍角式  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/02/10 17:34:41 ** この記事は1回修正されてます
!tanのn倍角の公式

!1変数Xの多項式(N次)のCi*X^iの係数を、配列C(i)=Ciで表す。

OPTION BASE 0

LET N=20 !次数

!演算関連
SUB poly_add(n,a(),b(), x()) !加算x=a+b
MAT x=a+b
END SUB
SUB poly_sub(n,a(),b(), x()) !減算x=a-b
MAT x=a-b
END SUB
SUB poly_mul(n,a(),b(), x()) !乗算x=a*b
DIM xx(100)
MAT xx=ZER(2*n)
FOR i=n TO 0 STEP -1
FOR j=n TO 0 STEP -1
LET xx(i+j)=xx(i+j)+a(i)*b(j) !分配する
NEXT j
NEXT i
MAT x=xx !copy it
END SUB

!表示関連
SUB disp_poly(n,a(),x$) !多項式を表示する a(X)=ΣAkX^k=AnX^n+An-1X^n-1+…+A1X+A0
CALL disp_mono(n,a(n),x$)
FOR i=n-1 TO 0 STEP -1 !次数の降順
IF a(i)>0 THEN PRINT "+";
CALL disp_mono(i,a(i),x$)
NEXT i
PRINT
END SUB
SUB disp_mono(k,ak,x$) !単項式を表示する AkX^k
IF ak=0 THEN !係数が0なら
ELSE
IF k<>0 THEN !x^nで
IF ak=1 THEN !係数が1なら
ELSEIF ak=-1 THEN !係数が−1なら
PRINT "-";
ELSE
PRINT STR$(ak);
END IF
END IF
IF k=0 THEN !次数が0なら
PRINT STR$(ak);
ELSEIF k=1 THEN !次数が1なら
PRINT x$;
ELSE
PRINT x$;"^";STR$(k);
END IF
END IF
END SUB

!その他
DIM c1(2*N)
LET c1(0)=1 !定数1
!------------------------------ ここまでがサブルーチン

   └つづき 山中和義 2008/02/10 17:35:22  (修正1回)  ツリーへ

Re: !tanのn倍角の公式  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/02/10 17:35:22 ** この記事は1回修正されてます
つづき



!2倍角の公式
!●tan2θ=(tanθ+tanθ)/(1-tanθtanθ)

!●tanθ=(tan0+tanθ)/(1-tan0tanθ)=t
!●tan2θ=(tanθ+tanθ)/(1-tanθtanθ)=2*t/(1-t^2)
!●tan3θ=(tan2θ+tanθ)/(1-tan2θtanθ)=(3*t-t^3)/(1-3*t^2)
!●tan4θ=(tan3θ+tanθ)/(1-tan3θtanθ)=(4*t-4*t^3)/(1-6*t^2+t^4)
!  :
!  :

DIM t(2*N)
LET t(1)=1 !tanθの定義


DIM P00(2*N),Q00(2*N) !1つ前の分子、分母 tan(w-1)θ=P/Q
LET P00(0)=0 !tan0
LET Q00(0)=1

DIM P99(2*N),Q99(2*N) !分子、分母
FOR w=1 TO N
PRINT "tan";w;"θ="

!分子の部
DIM T1(2*N)
CALL poly_mul(N,Q00,t, T1) !tan(w-1)θ+tanθ=P/Q+t=(P+Qt)/Q
CALL poly_add(N,T1,P00, P99) !通分して分子のみ ※分母は同じため約せる
CALL disp_poly(n,P99,"tanθ")

PRINT REPEAT$("-",w*7)

!分母の部
CALL poly_mul(N,P00,t, T1) !1-tan(w-1)θtanθ=1-P/Q*t=(Q-P*t)/Q
CALL poly_sub(N,Q00,T1, Q99)
CALL disp_poly(n,Q99,"tanθ")
PRINT


MAT P00=P99 !次へ
MAT Q00=Q99
NEXT w


END



なお、sin、cosのn倍角の公式は加法定理を使って、
2変数(sinθ、cosθ)の多項式で導出できます。


 インデックスへ  EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。