Serwis Edukacyjny w I-LO w Tarnowie Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej Autorzy: dr Ian Logan i dr Frank O'Hara |
©2024 mgr Jerzy Wałaszek |
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).
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).
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.
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.
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) |
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.
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 |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2024 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.