mBv2nav.1 TASWORD TWO
Matematický BASIC verze 2 - uživatelská příručka
**************************************************
(c) Jiří Pittner, 1988 mBASIC ( dále jen mB ) je rozšířením BF zaměřeným na numerické
výpočty potřebné zejména ve fyzice,teoretické chemii, v technic-
kých oborech atd.
Vzhledem k tomu že některé užitečné příkazy a funkce se již
vyskytují v nadstavbovém jazyce Basic-D ( dBASIC - dále jen dB )
byly tyto převzaty. Z důvodů kompatibility nahrávek programů
používajících tyto příkazy a fce z dB obsahuje mB tabulku všech
příkazů a fcí z dB. mB verze 2 umí nahrát a vylistovat každý
program napsaný v dB (na rozdíl od 1. verze i s funkcemi FN).
Při spuštění takového programu pak nepřevzaté příkazy a funce
způsobí ERR 31. Byly převzaty tyto příkazy a funkce:
erase escrn
error line
pop push
time$ while
wend ginit
outw inkey
pos color
point rcrt
inpw rdchr$ Dále byl doplněn příkaz TIME=čas analogický k TIME$= ... pro
nastavení vzestupného čítače ( = POKEW &7043,čas ).
Byte na adrese &8E8D určuje, zda při listingu bude první pís-
meno příkazu malé ( =0 ) nebo velké ( <>0 ).
Změněn byl příkaz DIM, aby šlo dimenzovat pole s některým
rozměrem degenerovaným : např DIM A(0),B(1,0).
Pro účely ladění a spolupráce s programy ve strojovém kódu
byla použita instrukce RST 30, která uloží všechny registry pro
fci REG(x) [x>3] , kde x má tento význam:
x= 0-3...jako v BF
4...AF 10...DE'
5...BC 11...HL'
6...DE 12...IX
7...HL 13...IY
8...AF' 14...PC
9...BC' 15...SP
16...(SP) - vrchol zásobníku MB poskytuje tyto běžné funkce:
arcsin ... ASIN |
arccos ... ACOS > závisí na THETA
arctg ... je již v BF | sinh ... SINH |
cosh ... COSH |
tgh ... TGH > nezávisí na THETA
argsinh ... ASINH |
argcosh ... ACOSH |
argtgh ... ATGH | Z méně běžných je to gamafunkce GAMA(x) ( zobecněná i pro zá-
porný argument ) s přesností na 10-11 platných číslic.
GAMA(n)=(n-1)! vychází přesně celočíselný.
Ve 2. verzi mB existuje funkce MCD(x,y) - největší společný
dělitel. Pokud je x,y integer, výpočet je rychlejší než když je
aspoň 1 z nich DBL.
Dalším významným přínosem pro numerické úlohy je rozšíření
fce CALC a fce NEWTON a SIMPSON a ve 2. verzi mB ještě ROMBERG .
Jedna výstraha: dejte si pozor, zda při použití těchto fcí máte
TYPE DBL!!!
CALC:
-----
Protože CALC(A$) vždy nejprve kompiluje řetězec do tvaru
vhodného pro interpretaci (tak jak je uložen program v paměti),
lze v mB použít tvar CALC(). Poprvé dáme CALC(A$) a potom CALC()
dělá totéž co CALC(A$), ale rychleji, protože se řetězec již
nekompiluje, ale použije se tak, jak byl poprvé zkompilován.
NEWTON - řešení obecné rovnice o jedné neznámé:
-----------------------------------------------
Rovnice se řeší Newtonovou metodou.
Syntaxe: NEWTON(string,var,X0,přes)
string ... text rovnice
var ... jméno proměmmé podle které rovnici řešíme
X0 ... počáteční odhad
přes ... požadvaná přesnost
příklad:
X=9:TYPE DBL:Y=4:PRINT NEWTON("X*X-Y",X,5,1E-6)
2 výsledek rovnice
PRINT X
9Proměnná X je formální (viz příklad), její hodnota se neruší.
Pokud metoda nekonverguje (v daném počtu cyklů nebylo dosaženo
požadované přesnosti), hlásí chybu. V tomto okamžiku má proměnná
X nedefinovanou hodnotu. Vyvoláním fce NEWTON() se obnoví
hodnota formální proměnné X a zároveň výsledkem této fce je
poslední aproximace kořene rovnice.
SIMPSON - výpočet určitého integrálu Simpsonovým pravidem
---------------------------------------------------------
Syntaxe: SIMPSON(string,var,a,b,n)
string ... integrovaná funkce
var ... proměnná podle níž se integruje
a,b ... meze intervalu
n ... počet dělení intervalu
příklad:
INPUT X:PRINT SIMPSON("T*T*EXP(X*T),T,-1,1,900)
Použití SIMPSON() je analogické jako NEWTON(). Dále byla odstraněna chyba EXP(-176),která v BF ohlásí error,
ačkoliv výsledek má být 0.
Byla zpřesněna funkce SQR(x), zkuste BF a v mB porovnat
PRINT SQR(1)-1 .
ROMBERG - výpočet určitého integrálu Rombergovou metodou
--------------------------------------------------------
Syntaxe: ROMBERG(string,var,dolní,horní,eps|,mink,maxk|)
string ... zápis integrandu
var ... integrační proměnná
dolní
horní ... meze integrálu
eps ... konec výpočtu,když rozdíl hodnot ze 2 iterací je <eps
mink ... a když bylo provedeno aspoň mink iterací
maxk ... error 26, když rozdíl výsledků maxk-té a (maxk-1).
iterace je > eps. maxk,mink jsou nepovinné parametry
přednastavené na 1,10 .
Použití ROMBERG() je analogické jako NEWTON(). Funkce CALC, NEWTON SIMPSON a ROMBERG se mohou navzájem
kombinovat s výjimkou ROMBERG & SIMPSON ; příslušné formální
proměnné pak musí být různé!! Lze tak například integrovat
implicitně zadanou funkci nebo řešit rovnici v níž se vyskytuje
integrál. Pro některé rovnice s integrálem je však lepší použít
program v Basicu. Pakliže máte program na kreslení grafů funkcí,
lze snadno s použitím LINE INPUT, NEWTON a SIMPSON kreslit grafy
impicitních fcí atd. To je však vhodné pouze pro trpělivého
uživatele, neboť takové výpočty nejou zrovna nejrychlejší.
!!! Funkce CALC, NEWTON, SIMPSON, ROMBERG nesmí volat samy !!!
!!! sebe, protože každá má pouze jeden kompilační buffer. !!!
Otázky konvergence a přesnosti numerických metod zde použi-
tých lze najít v každé učebnici numerické matematiky např. :
Ralston A. - Základy numerické matematiky, Academia 1973.
Další dvě funkce - TRACE a DETERM - už souvisí s maticovým
počtem, hlavní náplní mB. Je možné je použít jen při nastavení
na reálné výpočty .
TRACE(A) - stopa matice A
TRACE() - poslední vypočtená hodnota
DETERM(A)- determinant matice A
DETERM() - poslední vypočtená hodnota například při inverzi
matice a při řešení maticové rovnice - viz dále
Při výpočtu determinantu se matice A zničí;
(pokud byla regulární,přejde v jednotkovou matici) Výpočty s maticemi a s komplexními čísly
========================================
Příkazy MAT, TRANSFER, COMP, SCRATCH
------------------------------------ SCRATCH - zrušení pole
----------------------
Syntaxe: SCRATCH jméno, jméno, jméno, ...
příklad: SCRATCH A,C$,d%
V 1. verzi mB mohlo při pokusu zrušit neexist. pole dojít ke
zmatku v proměnných! Ve 2.verzi mB je už tento příkaz bezpečný.
COMP - výpočty s komplexními čísly (dále jen k.č.)
----------------------------------
Definice: komplexní číslo (skalár) se zapisuje jako:
(reál. část (,/;)imag. část)
nebo jen:
(reál.část) při nastavení na reálné výpočty
Příklady: (SIN(5);M(4,5,6)) (0,1) = imag. jednotka Komplexní proměnná je pole o aspoň 1 rozměru, přičemž
poslední rozměr (nejvíce vpravo) je dimenzován na 1.
Příklad: DIM A(4,5,1),C(1),D(1)
nadimenzuje komplexní proměnné, přičemž A je nutno
chápat jako DVOJROZMĚRNÉ pole komplexních čísel,
imag. část má index 1
značení: k.p.Koplexní výraz je v tomto textu míněn jako buď k.č. nebo k.p.
značení k.v.
Syntaxe: COMP operace (,/;) operace
povolené typy operací
k.p. = k.v. + k.v.
k.p. = k.v. - k.v.
k.p. = k.v. * k.v.
k.p. = k.v. / k.v.
k.p. = k.v.Je třeba upozornit, že při nastavení na reálné výpočty i příkaz
COMP pracuje jen s reálnými částmi komplexních čísel - viz dále.
Příklad: DIM A(1),B(1),C(1),D(2,1)
COMP A=(1,2), B=(3,4), C=A*B
A=C/(5,6), D(J,0)=C*CPoznámka:COMP A(0)=.... je totéž jako COMP A=....
(A(0),A(1)) má tutéž hodnotu jako A, avšak jeho
použití je pomalejší, neboť se 2* volá výpočet
výrazu a výsledky se přesunují do zvláštního
bufferu pro operandy. Operace s maticemi
==================
Příkazy: MAT, TRANSFER
Definice: reálnou maticí typu m,n rozumíme pole dojrozměrné,
přičemž poslední dva indexy jsou dimenzovány na
m-1,n-1 (počítá se i hodnota 0). Pole více než
dvojrozměrné je třeba považovat za pole reálných
matic.
Komplex. maticí typu m,n rozumíme pole třírozměrné
přičemž poslední index je dimenzován na 1,
předposlední dva na m-1,n-1. Reálná část má
poslední index 0, imaginární část 1. Pole více než
třírozměrné s posledním indexem 1 můžeme chápat
jako pole komplexních matic
Značení matic v syntaxi příkazů MAT a TRANSFER:
Matice reálné: zkratka rm
předpokládejme že bylo DIM R(5,6,7,8),S(3,4)
S nebo S(0,0) značí matici S
R značí matici 0,0 z pole matic R
R(i,j,0,0) značí i,j-tou matici z pole R Komplexní matice: zkratka km
Předpokládejme, že bylo DIM A(2,3,1),B(3,3,3,1)
A nebo A(0,0,0) značí matici A
B(i,0,0,0) značí i-tou matici z pole matic B Vzhledem k tomu, že i reálné výpočty se provádějí s komplex-
ními maticemi, ale tak, že jejich imaginární části se IGNORUJÍ a
při přiřazení a všech výpočtech ZŮSTANOU NEDOTKNUTY, lze takovou
komplexní matici A použít jako 2 reálné matice, na něž se odvo-
láváme značením A či A(0,0,0) a na tu druhou A(0,0,1).
Upozornění: vzhledem k tomu, že se při výpočtu adresy matice
značené i s indexy, používá rutina z BF pro nalezení obyčejné
proměnné, nekontroluje se nulovost indexů, a tak přiřazením ně-
jaké hodnoty matici označené např. A(1,1,0) se přepíše část pro-
měnných uložených za maticí A a tak dojde ke zmatku.
TRANSFER - slouží k převádění re. matic na ko. a naopak
-------------------------------------------------------
Syntaxe: TRANSFER REAL cm TO rm ;*
TRANSFER IMAG cm TO rm
TRANSFER rm TO REAL cm
TRANSFER rm TO IMAG cm* reálná část matice cm se převede do matice rm, ostatní
analogicky.
MAT - výpočty s komplexními maticemi
------------------------------------
Syntaxe: MAT operace (,/;) operace ...
Všechny operace se provádějí pouze s kopmlexními maticemi,
přičemž při nastavení na reálné výpočty se imaginární části
prvků matice ignorují a zůstávají nezměněny. Po inicializaci je
nastaven režim komplexních výpočtů. POZOR - nastavení na reálné
výpočty působí i na příkaz COMP.
V dalším textu předpokládejme, že máme dimenzovány matice A,B,C
a nastaveno TYPE DBL.
REAL nastavení na reálné výpočty
COMPLEX nastavení na komplexní výpočty
INV B,A B <== A^(-1), A <== 1 když A je regulární,jinak je
obsah A,B je nedefinovaný a nastává error, zároveň
se spočítá determ A a zůstane uschován - viz dále
GAUSS B,A A,B čtvercové stejného řádu, řešení rovnice
A*X=B. Bude-li A regulární, tak B:=X, A:=1;
spočte se determ (A) a uschová se
EXREIM A výměna reálné a imaginární části matice A
DETERM =kp determinant matice spočítaný při INV nebo
GAUSS se přiřadí komplexní proměnné
DETERM A=kp spočte se determ A a přiřadí se kp
A regulární ==> A:=1
TRACE A=kp výpočet stopy matice
A=0 vynulování celé matice nebo její části
A IMAG=0
A REAL=0
A=1 vytvoření jednotkové matice (A je čtvercová)
A=TRANSP B A <== B' pouze pro čtercové matice
lze A=TRANSP A
A=B* komplexně sdružená matice
lze A=A*
A=#kv každý prvek matice bude roven kv
A=#kv*B násobení matice skalárem
A=B*#kv -""- -""- -""-
A=B/#kv dělení matice skalárem
lze A=A*#kv apod.
A=B přiřazení matic
A=B+C základní operace,
A=B-C nelze A=B-A A=A*B A=B*A
A=B*CPři nastavení na reálné výpočty lze použít fce TRACE a DETERM.
Přitom DETERM(A) přepíše původní matici A a DETERM() lze použít
na získání determinantu vypočteného při INV nebo GAUSS.
CHYBOVÁ HLÁŠENÍ ZAVEDENÁ V mBASICu
==================================
ERR 26 Newtonova či Rombergova metoda nekonverguje; nedefino-
vaná FN funkce (až ve 2. verzi jsou FN implementovány)
ERR 27 Špatné rozměry polí - operace není definována
ERR 28 singulární matici nelze invertovat
ERR 29 nedovolené přiřazení - např. MAT A=B-A MAT A=A*B
příliš mnoho polí při SORT
ERR 31 příkaz nebo funkce v mBASIC neexistujePříklady:
DIM A(2,2,1),B(2,3,1),C(3,2,1),D(4,2,2,1),K(1)
MATA=D(3,0,0,0);DETERM A=K;A=#(3,5);A=B*C;D(0,0,0,0)=A(0,0,0)/#K