Programy w języku BASIC dla głównych szeregów

Następujące programy w języku BASIC zostały tutaj dołączone, ponieważ są one dobrą ilustracją sposobu używania wielomianów Czebyszewa do utworzenia przybliżeń funkcji SIN, EXP, LN i ATN.

 

Generator szeregów:

Ten podprogram jest wywoływany przez wszystkie programy 'funkcji'.

500 REM GENERATOR SZEREGOW, WEJSCIE
510 REM Z LICZNIKIEM BREG
520 REM I ARRAY-A PRZECHOWUJACYMI
530 REM STALE.
540 REM PIERWSZA WARTOSC W Z.
550 LET M0=2*Z
560 LET M2=0
570 LET T=0
580 FOR I=BREG TO 1 STEP -1
590 LET M1=M2
600 LET U=T*M0-M2+A(BREG+1-I)
610 LET M2=T
620 LET T=U
630 NEXT I
640 LET T=T-M1
650 RETURN
660 REM OSTATNIA WARTOSC W T.

 

W powyższym programie zmienne posiadają następujące znaczenia:

Z - wartość wejściowa.
T - wartość wyjściowa.
M0 - mem-0
M1 - mem-1
M2 - mem-2
I - licznik dla BREG.
U - wartość tymczasowa dla T.
A(1) do A(BREG) - stałe.
BREG - liczba stałych, które należy użyć.

 

Aby zobaczyć, jak są tworzone wielomiany Czebyszewa, zapisz na papierze wartości U, M1, M2 i T w liniach od 550 do 630, przebiegając je, powiedzmy, 6 razy w pętli mi utrzymując wyrażenia algebraiczne dla A(1) do A(6) bez zastępowania ich wartościami liczbowymi. Następnie zapisz T-M1. Mnożniki stałych A(1) do A(6) staną się wtedy pożądanymi wielomianami Czebyszewa. Dokładniej, mnożnik A(1) będzie miał wartość 2*T5(Z), mnożnik A(2) będzie 2*T4(Z) i tak dalej do 2*T1(Z) dla A(5), a na końcu T0(Z) dla A(6).

Zauważ, że T0(Z)=1, T1(Z)=Z i dla n>=2, Tn(Z)=2*Z*Tn-1(Z)-Tn-2(Z).

 

SIN X:

 10 REM DEMONSTRACJA DLA SIN X
 20 REM PRZY UZYCIU 'GENERATORA SZEREGOW'
 30 DIM A(6)
 40 LET A(1)=-.000000003
 50 LET A(2)=0.000000592
 60 LET A(3)=-.000068294
 70 LET A(4)=0.004559008
 80 LET A(5)=-.142630785
 90 LET A(6)=1.276278962
100 PRINT
110 PRINT "WPROWADZ WARTOSC STARTOWA W STOPNIACH"
120 INPUT C
130 CLS
140 LET C=C-10
150 PRINT "PROGRAM BASIC","PROGRAM Z ROM"
160 PRINT "-------------","-------------"
170 PRINT
180 FOR J=1 TO 4
190 LET C=C+10
200 LET Y=C/360-INT (C/360+.5)
210 LET W=4*Y
220 IF W > 1 THEN LET W=2-W
230 IF W < -1 THEN LET W=-W-2
240 LET Z=2*W*W-1
250 LET BREG=6
260 REM UZYJ 'GENERATORA SZEREGOW'
270 GO SUB 550
280 PRINT TAB 6; "SIN ";C;" STOPNI"
290 PRINT
300 PRINT T*W,SIN (PI*C/180)
310 PRINT
320 NEXT J
330 GO TO 100
500 REM GENERATOR SZEREGOW, WEJSCIE
510 REM Z LICZNIKIEM BREG
520 REM I ARRAY-A PRZECHOWUJACYMI
530 REM STALE.
540 REM PIERWSZA WARTOSC W Z.
550 LET M0=2*Z
560 LET M2=0
570 LET T=0
580 FOR I=BREG TO 1 STEP -1
590 LET M1=M2
600 LET U=T*M0-M2+A(BREG+1-I)
610 LET M2=T
620 LET T=U
630 NEXT I
640 LET T=T-M1
650 RETURN
660 REM OSTATNIA WARTOSC W T.

UWAGI:

i. Gdy zostanie wprowadzona wartość C, program ten wylicza i wyświetla SIN C stopni,  SIN (C+10) stopni, SIN (C+20) stopni oraz SIN (C+30) stopni. Wyświetla również wartości otrzymane przez wykorzystanie programu z ROM. Aby otrzymać próbki wyników, spróbuj wprowadzić te wartości w stopniach: 0; 5; 100; -80; -260; 3600; -7200.
ii. Stałe od A(1) do A(6) w wierszach 40 do 90 są podane (z wyjątkiem współczynnika 1/2) w Podręczniku Funkcji Matematycznych Abramowitza i Steguna (Dover 1965) na stronie 76. Można je sprawdzić całkując (SIN (PI*X/2))/X w przedziale U=0 do PI, przemnażając najpierw przez COS (N*U) dla każdej stałej (tj. N=1,2,...,6) i odejmując COS U=2*X*X-1. Każdy wynik powinien następnie być podzielony przez PI. (Całkowanie można wykonać metodą przybliżoną, np. metodą Simpsona, jeśli ma się do dyspozycji jakiś komputer lub kalkulator).

 

EXP X:

 10 REM DEMONSTRACJA DLA EXP X
 20 REM PRZY UZYCIU 'GENERATORA SZEREGOW'
 30 LET T=0
 40 DIM A(8)
 50 LET A(1)=0.000000001
 60 LET A(2)=0.000000053
 70 LET A(3)=0.000001851
 80 LET A(4)=0.000053453
 90 LET A(5)=0.001235714
100 LET A(6)=0.021446556
110 LET A(7)=0.248762434
120 LET A(8)=1.456999875
130 PRINT
140 PRINT "PODAJ WARTOSC STARTOWA"
150 INPUT C
160 CLS
170 LET C=C-10
180 PRINT "PROGRAM BASIC","PROGRAM Z ROM"
190 PRINT "-------------","-------------"
200 PRINT
210 FOR J=1 TO 4
220 LET C=C+10
230 LET D=C*1.442695041
240 LET N=INT D
250 LET Z=D-N
260 LET Z=2*Z-1
270 LET BREG=8
280 REM UZYJ 'GENERATORA SZEREGOW'
290 GO SUB 550
300 LET V=PEEK 23627+256*PEEK 23628+1
310 LET N=N+PEEK V
320 IF N > 255 THEN STOP
330 IF N < 0 THEN GO TO 360
340 POKE V,N
350 GO TO 370
360 LET T=0
370 PRINT TAB 11;"EXP ";C
380 PRINT
390 PRINT T,EXP C
400 PRINT
410 NEXT J
420 GO TO 130
500 REM GENERATOR SZEREGOW, WEJSCIE
510 REM Z LICZNIKIEM BREG
520 REM I ARRAY-A PRZECHOWUJACYMI
530 REM STALE.
540 REM PIERWSZA WARTOSC W Z.
550 LET M0=2*Z
560 LET M2=0
570 LET T=0
580 FOR I=BREG TO 1 STEP -1
590 LET M1=M2
600 LET U=T*M0-M2+A(BREG+1-I)
610 LET M2=T
620 LET T=U
630 NEXT I
640 LET T=T-M1
650 RETURN
660 REM OSTATNIA WARTOSC W T. 

UWAGI:

i. Gdy zostanie wprowadzona wartość C, program ten wylicza i wyświetla EXP C, EXP (C+10), EXP (C+20) i EXP (C+30). Wyświetla również wartości otrzymane przez wykorzystanie programu z ROM. Aby otrzymać próbki wyników, spróbuj wprowadzić te wartości: 0; 15; 65 (z przepełnieniem na końcu); -100; -40.
ii. Wykładnik jest testowany na przepełnienie oraz wynik zero w wierszach 320 i 330. Testy te są prostsze w języku BASIC niż w kodzie maszynowym, ponieważ zmienna N, w przeciwieństwie do rejestru A, nie ogranicza się do jednego bajtu.
iii. Stałe od A(1) do A(8) w wierszach od 50 do 120 można otrzymać przez scałkowanie  2X na przedziale od U=0 do PI, po pomnożeniu najpierw przez COS (N*U) dla każdej stałej (tj. dla N=1,2,...,8) i odjęciu COS U = 2*X-1. Każdy wynik powinien następnie być podzielony przez PI.

 

LN X:

 10 REM DEMONSTRACJA DLA LN X
 20 REM PRZY UZYCIU 'GENERATORA SZEREGOW'
 30 LET D=0
 40 DIM A(12)
 50 LET A(1)= -.0000000003
 60 LET A(2)=0.0000000020
 70 LET A(3)= -.0000000127
 80 LET A(4)=-0.0000000823
 90 LET A(5)= -.0000005389
100 LET A(6)=0.0000035828
110 LET A(7)= -.0000243013
120 LET A(8)=0.0001693953
130 LET A(9)= -.0012282837
140 LET A(10)=0.0094766116
150 LET A(11)= -.0818414567
160 LET A(12)=0.9302292213
170 PRINT
180 PRINT "PODAJ WARTOSC STARTOWA"
190 INPUT C
200 CLS
210 PRINT "PROGRAM BASIC","PROGRAM Z ROM"
220 PRINT "-------------","-------------"
230 PRINT
240 LET C=SQR C
250 FOR J=1 TO 4
260 LET C=C*C
270 IF C=0 THEN STOP
280 LET D=C
290 LET V=PEEK 23627+256*PEEK 23628+1
300 LET N=PEEK V-128
310 POKE V,128
320 IF D<=0.8 THEN GO TO 360
330 LET S=D-1
340 LET Z=2.5*D-3
350 GO TO 390
360 LET N=N-1
370 LET S=2*D-1
380 LET Z=5*D-3
390 LET R=N*0.6931471806
400 LET BREG=12
410 REM UZYJ 'GENERATORA SZEREGOW'
420 GO SUB 550
430 PRINT TAB 8;"LN ";C
440 PRINT
450 PRINT S*T+R,LN C
460 PRINT
470 NEXT J
480 GO TO 170
500 REM GENERATOR SZEREGOW, WEJSCIE
510 REM Z LICZNIKIEM BREG
520 REM I ARRAY-A PRZECHOWUJACYMI
530 REM STALE.
540 REM PIERWSZA WARTOSC W Z.
550 LET M0=2*Z
560 LET M2=0
570 LET T=0
580 FOR I=BREG TO 1 STEP -1
590 LET M1=M2
600 LET U=T*M0-M2+A(BREG+1-I)
610 LET M2=T
620 LET T=U
630 NEXT I
640 LET T=T-M1
650 RETURN
660 REM OSTATNIA WARTOSC W T. 

UWAGI:

i. Gdy zostanie wprowadzona wartość C, program ten wylicza i wyświetla LN C, LN (C**2), LN (C**4) i LN (C**8). Wyświetla również wartości otrzymane przez wykorzystanie programu z ROM. Aby otrzymać próbki wyników, spróbuj wprowadzić te wartości: 1.1; 0.9; 300; 0.004; 1E5 (dla przepełnienia) oraz 1E-5 (STOP jest 'niepoprawnym argumentem').
ii. Stałe od A(1) do A(12) w wierszach od 50 do 160 można otrzymać przez scałkowanie 5*LN (4* (X+1)/5)/(4*X-1) w przedziale od U=0 do PI, po pomnożeniu najpierw przez COS (N*U) dla każdej stałej (tj. for N=1,2,...,12) i odjęciu COS U=2*X-1. Każdy wynik powinien następnie być podzielony przez PI.

 

ATN X:

 10 REM DEMONSTRACJA DLA ATN X
 20 REM PRZY UZYCIU 'GENERATORA SZEREGOW'
 30 DIM A(12)
 40 LET A(1)= -.0000000002
 50 LET A(2)=0.0000000010
 60 LET A(3)= -.0000000066
 70 LET A(4)=0.0000000432
 80 LET A(5)= -.0000002850
 90 LET A(6)=0.0000019105
100 LET A(7)= -.0000131076
110 LET A(8)=0.0000928715
120 LET A(9)= -.0006905975
130 LET A(10)=0.0055679210
140 LET A(11)= -.0529464623
150 LET A(12)=0.8813735870
160 PRINT
170 PRINT "PODAJ WARTOSC STARTOWA"
180 INPUT C
190 CLS
200 PRINT "PROGRAM BASIC","PROGRAM Z ROM"
210 PRINT "-------------","-------------"
220 PRINT
230 FOR J=1 TO 4
240 LET B=J*C
250 LET D=B
260 IF ABS B>=1 THEN LET D= -1/B
270 LET Z=2*D*D-1
280 LET BREG=12
290 REM UZYJ 'GENERATORA SZEREGOW'
300 GO SUB 550
310 LET T=D*T
320 IF B > =1 THEN LET T=T+PI/2
330 IF B < =-1 THEN LET T=T-PI/2
340 PRINT TAB 8;"ATN ";B
350 PRINT
360 PRINT T,ATN B
370 NEXT J
380 GO TO 160
500 REM GENERATOR SZEREGOW, WEJSCIE
510 REM Z LICZNIKIEM BREG
520 REM I ARRAY-A PRZECHOWUJACYMI
530 REM STALE.
540 REM PIERWSZA WARTOSC W Z.
550 LET M0=2*Z
560 LET M2=0
570 LET T=0
580 FOR I=BREG TO 1 STEP -1
590 LET M1=M2
600 LET U=T*M0-M2+A(BREG+1-I)
610 LET M2=T
620 LET T=U
630 NEXT I
640 LET T=T-M1
650 RETURN
660 REM OSTATNIA WARTOSC W T.

UWAGI:

i. Gdy zostanie wprowadzona wartość C, program ten wylicza i wyświetla ATN C, ATN (C*2), ATN (C*3) i ATN (C*4). Wyświetla również wartości otrzymane przez wykorzystanie programu z ROM. Aby otrzymać próbki wyników, spróbuj wprowadzić te wartości: 0.2; -1; 10 i -100. Wyniki mogą być bardziej interesujące, jeśli dokona się ich zamiany na stopnie, mnożąc je w wierszu 360 przez 180/PI.
ii. Stałe od A(1) do A(12) w wierszach od 40 do 150 są podane (za wyjątkiem współczynnika 1/2) w Podręczniku Funkcji Matematycznych Abramowitza i Steguna (Dover 1965) na stronie 82. Można je sprawdzić przez scałkowanie ATN X/X w przedziale U=0 do PI po przemnożeniu przez COS (N*U) dla każdego parametru (tj. dla n=1,2,...,12) i zamianie COS U=2*X*X-1. Każdy wynik powinien następnie być podzielony przez PI.

Alternatywny podprogram dla SIN X:
Bezpośrednio tworzy się pełne rozwinięcie wielomianów Chebyszewa, co można zapisać w wierszu języka BASIC w sposób następujący:

550 LET T =(32*Z*Z*Z*Z*Z-40*Z*Z*Z+10*Z)*A(1)
+(16*Z*Z*Z*Z-16*Z*Z+2)*A(2)
+(8*Z*Z*Z-6*Z)*A(3)
+(4*Z*Z-2)*A(4)
+2*Z *A(5)
+A(6)
560 RETURN

Podprogram ten jest wywoływany zamiast GENERATORA SZEREGÓW i posiada podobną dokładność.

Alternatywny podprogram dla EXP X:
Pełne rozwinięcie EXP X:

550 LET T =(128*Z*Z*Z*Z*Z*Z*Z-224*Z*Z*Z*Z*Z+112*Z*Z*Z-14*Z)*A(1)
+(64*Z*Z*Z*Z*Z*Z-96*Z*Z*Z*Z+36*Z*Z-2)*A(2)
+(32*Z*Z*Z*Z*Z-40*Z*Z*Z+10*Z)*A(3)
+(16*Z*Z*Z*Z-16*Z*Z+2)*A(4)
+(8*Z*Z*Z-6*Z)*A(5)
+(4*Z*Z-2)*A(6)
+2*Z*A(7)
+A(8)
560 RETURN

Rozwinięcie dla LN X i A TN X podane algebraicznie będzie następujące:
(2048z11-5632z9+5632z7-2464z5+440z3-22z) * A (1)
+ (1024z10-2560z8+2240z6-800z4+100z2-2) * A(2)
+ (512z9-1152z7+864z5-240z3+18z) * A(3)
+ (256z8-512z6+320z4-64z2+2) * A(4)
+ (128z7-224z5+112z3-14z) * A(5)
+ (64z6-96z4+36z2-2) * A(6)
+ (32z5-40z3+10z) * A(7)
+ (16z4-16z2+2) * A(8)
+ (8z3-6z) * A(9)
+ (4z2-2) * A(10)
+ (2z) * A(11)
+ A(12)

 

Algorytm DRAW

Poniższy program ilustruje istotne części operacji DRAW, z których korzysta się przy tworzeniu linii prostej. W tej postaci program pozwala rysować jedynie linie, gdzie X > Y.

 

 10 REM PROGRAM DRAW 255,175
 20 REM USTAW POCZATEK
 30 LET PLOTx=0: LET PLOTy=0
 40 REM USTAW GRANICE
 50 LET X=255: LET Y=175
 60 REM USTAW PRZYROST,i
 70 LET i=X/2
 80 REM WEJDZ DO PETLI
 90 FOR B=X TO 1 STEP -1
100 LET A=Y+i
110 IF X> A THEN GO TO 160
120 REM PIKSEL W GORE W TYM OBIEGU
130 LET A=A-X
140 LET PLOTy=PLOTy+1
150 REM RESETUJ PRZYROST,i
160 LET i=A
170 REM ZAWSZE WZDLUZ O JEDEN PIKSEL
180 LET PLOTx=PLOTx+1
190 REM TERAZ POSTAW PIKSEL
200 PLOT PLOTx,PLOTy
210 NEXT B

 

Pełny algorytm należy zaimplementować w kolejnym programie, gdzie procedura rysowania linii ma ją narysować od ostatniego punktu do pozycji X,Y.

 

Algorytm CIRCLE

 

Poniższy program w języku BASIC ilustruje, w jaki sposób rozkaz CIRCLE tworzy koła.

Na początku jest wyliczana liczba niezbędnych łuków. Następnie zostaje przygotowany zestaw parametrów w 'obszarze pamięci' oraz na 'stosie kalkulatora'.

Wtedy są rysowane łuki przez powtarzane wywołania procedury rysującej linie, która przy każdym wywołaniu rysuje pojedynczą linię od 'ostatniej pozycji' do pozycji 'X,Y'.

Uwaga: w programie z ROM występuje ostateczna linia 'zamykająca', lecz tej opcji nie uwzględniono tutaj.

 

 10 REM PROGRAM RYSOWANIA KOLA
 20 LET X=127: LET Y=87: LET Z=87
 30 REM Ile lukow?
 40 LET Arcs=4*INT (INT (ABS (PI*SQR Z)+0.5)/4)+4
 50 REM Ustaw obszar pamieci; M0-M5
 60 LET M0=X+Z
 70 LET M1=0
 80 LET M2=2*Z*SIN (PI/Arcs)
 90 LET M3=1-2*(SIN (PI/Arcs)) ^ 2
100 LET M4=SIN (2*PI/Arcs)
110 LET M5=2*PI
120 REM Ustaw stos; Sa-Sd
130 LET Sa=X+Z
140 LET Sb=Y-Z*SIN (PI/Arcs)
150 LET Sc=Sa
160 LET Sd-Sb
170 REM Inicjuj COORDS
180 POKE 23677,Sa: POKE 23678,Sb
190 LET M0=Sd
200 REM 'RYSUJ LUKI'
210 LET M0=M0+M2
220 LET Sc=Sc+M1
230 LET X=Sc-PEEK 23677
240 LET Y=M0-PEEK 23678
250 GO SUB 510
260 LET Arcs=Arcs-1: IF Arcs=0 THEN STOP
270 LET MM1=M1
280 LET M1=M1*M3-M2*M4
290 LET M2=MM1*M4+M2*M3
300 GO TO 210
500 REM 'RYSUJ LINIE' od ostatniej pozycji do X,Y
510 LET PLOTx=PEEK 23677: LET PLOTy=PEEK 23678
520 LET dx=SGN X: LET dy=SGN Y
530 LET X=ABS X: LET Y=ABS Y
540 IF X> =Y THEN GO TO 580
550 LET L=X: LET B=Y
560 LET ddx=0: LET ddy=dy
570 GO TO 610
580 IF X+Y=0 THEN STOP
590 LET L=Y: LET B=X
600 LET ddx=dx: LET ddy=0
610 LET H=B
620 LET i=INT (B/2)
630 FOR N=B TO 1 STEP -1
640 LET i=i+L
650 IF i < H THEN GO TO 690
660 LET i=i-H
670 LET ix=dx: LET iy=dy
680 GO TO 700
690 LET ix=ddx: LET iy=ddy
700 LET PLOTy=PLOTy+iy
710 IF PLOTy <0 OR PLOTy > 175 THEN STOP
720 LET PLOTx=PLOTx+ix
730 IF PLOTx <0 OR PLOTx > 255 THEN STOP
740 PLOT PLOTx,PLOTy
750 NEXT N
760 RETURN

 



List do administratora Serwisu Edukacyjnego Nauczycieli I LO

Twój email: (jeśli chcesz otrzymać odpowiedź)
Temat:
Uwaga: ← tutaj wpisz wyraz  ilo , inaczej list zostanie zignorowany

Poniżej wpisz swoje uwagi lub pytania dotyczące tego rozdziału (max. 2048 znaków).

Liczba znaków do wykorzystania: 2048

 

W związku z dużą liczbą listów do naszego serwisu edukacyjnego nie będziemy udzielać odpowiedzi na prośby rozwiązywania zadań, pisania programów zaliczeniowych, przesyłania materiałów czy też tłumaczenia zagadnień szeroko opisywanych w podręcznikach.



   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2017 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.