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) CALL SINEX(MIN(F*2,MAXLEVEL),COSA,SINA,COSB,SINB,SINE) PRINT "SIN(";STR$(F);"X)="; CALL DISPLAYSIN(F,SINE) 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) !●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) 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 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θ") MAT P00=P99 !次へ MAT Q00=Q99 NEXT w END なお、sin、cosのn倍角の公式は加法定理を使って、 2変数(sinθ、cosθ)の多項式で導出できます。 |