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
        9
Promě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*C
Pozná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*C
Př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 neexistuje
Pří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