2014.10.2

前へ
次へ
ホームページトップへ戻る

MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!


[第45回]


●チェビシェフの多項式(2)

前回の続きです。
前回はチェビシェフの多項式について説明しました。
一般式をもとにして高次の多項式を低次のものから順に算出することができます。
計算方法は単純ですが、うっかりすると間違えてしまいます。
前回の計算式は T(x)の式をうっかり間違えてしまいました。
翌朝になってからそのことに気付いて訂正いたしました。

Tnのnの値が大きくなってくると項数も増えて計算もだんだんと複雑になってきますから、そのようについ間違えてしまうことも出てきてしまいます。
チェビシェフの多項式についてネットを検索していましたら、プログラムを作ってn=50まで求めたというサイトをみつけました。
こちらのサイト(http://www.ne.jp/asahi/music/marinkyo/js/chebyshev-polinomo.html.ja)です。
この方はJavaScriptを使って計算されたようです。

おお。
そうでした。
プログラムを書いて計算させれば、高次であっても平気でありました。
さっそく書いてみることにしました。
私はいつものごとくBorland C++を使いました。
プログラムならオーバーフローしない限り、いくらnが大きくても正しく表示させられますが、そんなに沢山表示させてみても仕方がありませんから、適当なところでn=20までとしました。

/// chebychef polynomials
/// 14/10/1 10/2
//
#include <stdio.h>
//
void main()
{
// i---> Ti(x)
// j---> x^j
// x[i][j]---> 'keisu' of x
        int x[21][21];
        int i,j;
        for (i=0;i<=20;i++){
                for(j=0;j<=20;j++){
                        x[i][j]=0;
                        }
                }
        x[0][0]=1;// T0
        x[1][1]=1;// T1
// keisan
        for(i=2;i<=20;i++){
                for(j=i;j>=2;j--){
                        x[i][j]=x[i-1][j-1]*2-x[i-2][j];
                        }
                x[i][1]=x[i-1][0]*2-x[i-2][1];//1次の項
                x[i][0]=-x[i-2][0];//定数項
                }
// print
        printf("T0(x)=1\n");
        printf("T1(x)=x\n");
        for(i=2;i<=20;i++){
                printf("T%d(x)=",i);//左辺
                for(j=20;j>1;j--){
                        if(x[i][j]>1&&i==j)printf("%dx^%d",x[i][j],j);//第1項(符号を省く)
                        else if(x[i][j]>1)printf("+%dx^%d",x[i][j],j);//符号
                        else if(x[i][j]<-1)printf("%dx^%d",x[i][j],j);//符号
                        }
                if(x[i][1]>1)printf("+%dx",x[i][j]);//1次の項&符号
                else if(x[i][1]<-1)printf("%dx",x[i][j]);//1次の項&符号
                if(x[i][0]==0)printf("\n");//定数項なし
                else if(x[i][0]==1)printf("+1\n");//定数項
                else if(x[i][0]==-1)printf("-1\n");//定数項
                }
return;
}
//

なんだかややこしいようですが、実際に計算しているのは//keisanのfor文の数行だけです。
nが大きくなるにつれて大きくなる係数値とxの次数と項数を2次元の配列を使ってさばきました。
x[i][j]にはxの係数が入ります。
iはTnのnの値で、jはxの次数です。

下は実行結果です。

T0(x)=1
T1(x)=x
T2(x)=2x^2-1
T3(x)=4x^3-3x
T4(x)=8x^4-8x^2+1
T5(x)=16x^5-20x^3+5x
T6(x)=32x^6-48x^4+18x^2-1
T7(x)=64x^7-112x^5+56x^3-7x
T8(x)=128x^8-256x^6+160x^4-32x^2+1
T9(x)=256x^9-576x^7+432x^5-120x^3+9x
T10(x)=512x^10-1280x^8+1120x^6-400x^4+50x^2-1
T11(x)=1024x^11-2816x^9+2816x^7-1232x^5+220x^3-11x
T12(x)=2048x^12-6144x^10+6912x^8-3584x^6+840x^4-72x^2+1
T13(x)=4096x^13-13312x^11+16640x^9-9984x^7+2912x^5-364x^3+13x
T14(x)=8192x^14-28672x^12+39424x^10-26880x^8+9408x^6-1568x^4+98x^2-1
T15(x)=16384x^15-61440x^13+92160x^11-70400x^9+28800x^7-6048x^5+560x^3-15x
T16(x)=32768x^16-131072x^14+212992x^12-180224x^10+84480x^8-21504x^6+2688x^4-128x^2+1
T17(x)=65536x^17-278528x^15+487424x^13-452608x^11+239360x^9-71808x^7+11424x^5-816x^3+17x
T18(x)=131072x^18-589824x^16+1105920x^14-1118208x^12+658944x^10-228096x^8+44352x^6-4320x^4+162x^2-1
T19(x)=262144x^19-1245184x^17+2490368x^15-2723840x^13+1770496x^11-695552x^9+160512x^7-20064x^5+1140x^3-19x
T20(x)=524288x^20-2621440x^18+5570560x^16-6553600x^14+4659200x^12-2050048x^10+549120x^8-84480x^6+6600x^4-200x^2+1

MYCPU80でCP/Mを![第45回]
2014.10.2upload

前へ
次へ
ホームページトップへ戻る