K. Taubert, W. Wiedl: MATLAB Einführung

2. Arithmetische Daten, Operationen und Ausdrücke

Bei der Datenverarbeitung geht es darum, aus einer Menge vorhandener Daten, nach einem vorgegebenem Programm, neue Daten zu gewinnen. Wenn wir uns zunächst auf das Rechnen beschränken, sind die Daten, mit denen wir es zu tun haben, im wesentlichen Zahlen. Daneben werden wir gelegentlich Zeichenketten in der Form 'Zeichenkette' verwenden, die Zeichenkette wird also immer in Apostrophe eingeschlossen.
Mehrere Zahlen fassen wir gelegentlich durch Einschließen in eckige Klammern zu einer Zahlenliste (Vektor) zusammen, etwa [1 2 3 4711]. Dieselbe Operation verknüpft zwei Zeichenketten zu einer einzigen ['Auto' 'mobil'].

2.1 Zahlen

Matlab kennt (im Prinzip) nur eine einzige Zahlenart. Sie erlaubt die Darstellung reeller und komplexer Zahlen. Reelle Zahlen mit einem Betrag aus dem Bereich von 10-308 bis 10+308 werden mit einer Genauigkeit von etwa 16 Dezimalstellen dargestellt.

Im Matlab Programm können Sie diese Zahlen schreiben:

  1. als ganze Dezimalzahlen, mit oder ohne Vorzeichen
     1  -2  +30  -400
  2. als Dezimalbruch mit Dezimalpunkt und mindestens einer Dezimalziffer vor oder nach dem Punkt, mit oder ohne Vorzeichen
     1.5  -2.0  +.25  -425.  3.1415926535897
  3. als dezimale Gleitkommazahlen, wobei die Mantisse eine Zahl der Form 1 oder 2 und der Exponent eine ganze Zahl der Form 1 sein muß. Mantisse und Exponent sind mittels eines e zu verknüpfen.
     1.0e+3  .1e-5  5.e4   2e3
    Wir bezeichnen solche Zahlendarstellungen, bei denen der Zahlenwert unmittelbar angegeben wird als Literale. Daneben werden wir später noch Namen wie pi zur Bezeichnung von Zahlen verwenden.

    Imaginäre Zahlen schreibt man wie üblich als reelle Zahlen mit anhängendem i, das auch durch ein j ersetzt werden kann. i bzw. j allein steht für die imaginäre Einheit und ist gleichwertig mit 1.0i. Komplexe Zahlen werden als Summe von Real- und Imaginärteil geschrieben, also mit Hilfe einer Operation, es gibt keine speziellen Literale. Den Real- bzw. Imaginärteil einer komplexen Zahl x erhält man mit real(x) bzw. imag(x).

    » i
    ans =
            0 + 1.0000i
    » 3j
    ans =
            0 + 3.0000i
    » .1i
    ans =
            0 + 0.1000i
    » 1.2j
    ans =
            0 + 1.2000i
    
    » 3e2i
    ans =
            0 +3.0000e+002i
    » imag(3+2i)
    ans =
         2
    » real(3+2i)
    ans =
         3

    Namen beginnen in Matlab immer mit einem Buchstaben, dem beliebig viele weitere Buchstaben, Dezimalziffern und Unterstreichungszeichen (underscores, _) folgen dürfen. Matlab berücksichtigt beim Vergleich von zwei Namen allerdings nur die ersten 31 Zeichen. Zwischen Groß- und Kleinbuchstaben wird unterschieden.

    Namen werden dazu verwendet, eine Wert zu bezeichnen. Welchen Wert ein Name hat, wird in der Regel erst im Programm festgelegt, es gibt aber eine Reihe von Namen mit vordefinierten Werten:

    » format compact
    » pi
    ans =
        3.1416
    » eps
    ans =
      2.2204e-016
    » realmin
    ans =
      2.2251e-308
    » realmax
    ans =
      1.7977e+308
    » i
    ans =
            0 + 1.0000i
    » j
    ans =
    0 + 1.0000i
    

    Die Bedeutung von eps ergibt sich daraus, daß 1.0 + eps die kleinste Zahl mit Betrag größer 1.0 ist, die Matlab intern darstellen und von 1.0 unterscheiden kann. Der Wert von 1.0 + 0.5*eps wird intern also entweder als 1.0 oder als 1.0 + eps dargestellt. eps ist damit ein Maß für die interne Rechengenauigkeit.

    Matlab kennt keine geschützten Namen, man kann jeden Namen einen anderen Wert geben bzw. ihn in einer anderen Bedeutung benutzen. In diesem Zusammenhang sei ein kleiner Unterschied erwähnt. i und 1.0i bezeichnen in der Regel zwar beide denselben Zahlenwert, i ist aber ein Name, dessen Wert per Voreinstellung die imaginäre Einheit ist, niemand wird jedoch gehindert, dem Namen i eine andere Bedeutung zu geben. i ist also ein Name mit einem variablen Wert. Dagegen ist 1.0i ein Literal zur Darstellung der imaginären Einheit und damit eine Konstante. Wir werden sehen, daß wir den Wert von i ändern können, den von 1.0i nicht.

    In der Mathematik macht man man keinen Unterschied zwischen 1.0i und dem Produkt 1.0*i. In Matlab muß man diesen Unterschied machen. 1.0i ist die literale Darstellung einer Zahl und nicht identisch mit dem Produkt 1.0*i, wenn man z.B. den Wert von i ändert, ändert sich auch der Wert des Produktes 1.0*i, nicht aber der Wert von 1.0i.

    Daten, die als elementare Bausteine für strukturierte Daten wie Vektoren oder Matrizen verwendet werden, bezeichnen wir als skalare Daten oder Skalare. Komplexe Zahlen sind in Matlab Skalare, auch wenn man mit real bzw. imag auf einzelne Komponenten davon zugreifen kann.

    2.2 Arithmetische Operatoren

    Matlab kennt die folgenden arithmetischen Operationen zu je zwei Zahlen, das Ergebnis der Operation ist wieder eine Zahl. Die Operation wird mit einem Operatorsymbol zwischen den beiden Zahlen angegeben. Aus Gründen, auf die wir erst später eingehen werden, gibt für Operationen mit skalaren Operanden, häufig zwei gleichwertige Operatorsymbole. Die Gleichwertigkeit ist aber nur bei skalaren Operanden gegeben.

    • Addition, Operatorsymbol: +

      » 3+pi
      ans =
          6.1416
      
      » 5i+3.0e-2
      ans =
         0.0300 + 5.0000i
      

    • Subtraktion, Operatorsymbol: -

      » 4-2
      ans =
           2
      
      » 3i-eps
      ans =
        -0.0000 + 3.0000i
      

    • Multiplikation, Operatorsymbol: * bzw. .*

       » 4*2.5e-2
      ans =
         0.1000
      
      » pi.*i
      ans =
              0 + 3.1416i
      
      Anders als in der üblichen mathematischen Notation kann man in Matlab das Symbol * bei der Produktbildung nicht weglassen. In der üblichen mathematischen Notation benutzt man nur Namen, die aus einem einzigen Zeichen bestehen, daher ist klar, daß unter xy das Produkt x*y zu verstehen ist. In Matlab sind lä,ngere Namen zulässig, xy wird daher als ein einfacher Name und nicht als Produkt x*y interpretiert.

    • (Rechts)-Division, Operatorsymbol: / bzw. ./

      » 4/2
      ans =
           2
      
      » 3./pi
      ans =
          0.9549
      

    • Links-Division, Operatorsymbol: \ bzw. .\

      » 4\2
      ans =
          0.5000
      
      Als Operation mit einfachen (skalaren) Zahlen) hat die Links-Division keine Bedeutung, sie liefert einfach den Kehrwert der Rechts-Division. Ihre Bedeutung erhält diese Operation erst beim Umgang mit Matrizen.

    • Potenzierung, Operatorsymbol: ^ bzw. .^

      » 2.5^1.2
      ans =
          3.0028
      » 2^3
      ans =
          8
      
      » 1.25^i
      ans =
          0.9752 + 0.2213i
      » i.^2
      ans =
          -1.0000 + 0.0000i 
      

    • unäres + und -

      Die Operatoren + und - können auch als unäre Operatoren auf einzelne Operanden angewandt werden. Die Operatorsymbole werden dann in der üblichen Weise vor dem Operanden angegeben:

      » -pi
      ans =
            -3.1416
      

    In Fällen wie -pi oder -(2.^3) ist klar, daß - ein Operatorsymbol ist und nicht zur literalen Darstellung einer Zahl gehört. In Fällen wie 2.^-3 oder -2^3 entscheidet Matlab diese Frage nach eigenen Regeln.

    Matlab erweitet den Bereich der Zahlen um zwei spezielle Werte mit den Namen inf und nan, anstelle von inf kann man auch Inf, anstelle von nan auch NaN schreiben.

    Der Wert inf ergibt sich:

    • als Ergebnis der Division einer Zahl ungleich 0 durch 0

      » 3/0
      Warning: Divide by zero.
      ans =
         Inf
      

    • als Ergebnis mathematisch wohldefinierter Operationen, deren Ergebnis überläuft (overflows), d.h. deren Ergebnis außerhalb des Matlab-Zahlenbereiches liegt.
      Wann bei einer solchen Operation der Wert realmax und wann der Wert inf geliefert wird, ist etwas willkürlich, dürfte für praktische Rechnungen aber selten von Belang sein.

      » realmax + 1.0e+100
      ans =
          1.7977e+308
      » realmax+1.0e+200
      ans =
          1.7977e+308
      
      » realmax+1.0e+300
      ans =
          Inf
      » 1.0e+200*1.0e+200
      ans =
          Inf
      

    • als Ergebnis von Operationen normaler Zahlen mit inf

      » 5+inf
      ans =
          Inf
      » 3*inf
      ans =
          Inf
      
      » inf/2
      ans =
          Inf
      
      Die Division einer normalen Zahl durch inf ergibt 0.

      » -3/Inf
      ans =
           0
      

    nan (not a number) liefert Matlab:

    • als Ergebnis mathematisch nicht definierter Operationen wie:

      » 0/0
      Warning: Divide by zero.
      ans =
         NaN
      » inf-inf
      ans =
         NaN
      
      » inf/inf
      ans =
         NaN
      

    • Operationen mit einem Operanden, der den Wert nan hat.

      » 5*nan
      ans =
         NaN
      

    Wichtig ist dabei primär, daß Matlab bei solchen Operationen nicht mit einer Fehlermeldung abbricht, sondern mit diesen Werten weiterrechnet. Eine spezielle Anwendung von NaN werden Sie später bei der Visualisierung kennenlernen.

    2.3 Funktionen

    Matlab kennt eine Vielzahl von Funktionen, die eine Zahl als Argument erwarten und dann eine Zahl als Funktionswert liefern, darunter:

    Einen Überblick über die Matlab Funktionen erhalten Sie über mit der MATLAB Function Reference. Ein Auflistung der elementaren Funktionen in Matlab erhält man mit dem Befehl:
       
       help elfun
    
    eine Auflistung speziellerer Funktionen mit dem Befehl:
       
       help specfun
    
    Nähere Informationen zu einer bestimmten Funktion mit Namen Funktionsname erhält man mit dem Befehl:
       
       help Funktionsname
    

    Wir haben die Namen pi, eps, realmin, realmax, i, j als Namen von bestimmten Zahlen kennengelernt. Genauer gesprochen bezeichnen diese Namen in Matlab per Voreinstellung bestimmte Funktionen ohne Argument, die eben als Funktionswert bestimmte Zahlen liefern. Wie alle Namen in Matlab sind diese Namen aber nicht geschützt, Sie können ihren Wert, also das was sie bezeichnen, ohne Probleme abändern.

    Wenn Sie das wirklich tun, sollten Sie aber auch später daran denken, wenn Sie die Namen wieder benutzen. Im folgenden Beispiel ist der ausgegebene Wert von sin(pi) kein Rechenfehler von Matlab.

    » pi=1
    pi =
         1
    
    » sin(pi)
    ans =
         0.8415
    

    1.4 Ausdrücke

    Jede Angabe einer Zahl, sei es in literaler Form oder als Ergebnis einer Operation, eines Funktionsaufrufes oder einer Folge von Operationen und Funktionsaufrufen nennt man Ausdruck bzw. genauer arithmetischen Ausdruck im Gegensatz zu Ausdrücken, die nicht zahlenartige Daten angeben.

    Falls mehrere Operationen und Funktionsaufrufe in einem Ausdruck beschrieben werden, muß die Reihenfolge festgelegt werden, in der diese auszuführen sind. Matlab unterscheidet sich da nicht vom Üblichen. Man kann die Reihenfolge wie gewohnt durch Klammerung angeben, daneben gilt die (übliche) Prioritätenregelung für Operatoren. Die Angaben der Klammerung haben immer Vorrang vor der Prioritätenregelung.

    Die Prioritätsstufen sind von oben nach unten:

    1. Potenzbildung ^ bzw. .^

      » -3.2^3
      ans =
        -32.7680
      
      » -(3.2^3)
      ans =
        -32.7680
      

    2. unäres + und -

      » -2^2
      ans =
          -4
      
      Man beachte, daß hier das Minuszeichen als Operatorsymbol und nicht als Teil der literalen Zahlendarstellung interpretiert wird. Im Zweifelsfalle verfährt Matlab immer in dieser Form.
      Diese Regel erlaubt einige in anderen Programmiersprachen eher seltene Konstrukte, die aber nicht unbedingt zu empfehlen sind.

      » 3*-5
      ans =
         -15
      » 3*(-5)
      ans =
         -15
      
      » 4+-2
      ans =
           2
      » 5--2^2
      ans =
           9
      

      Die Prioritätenregelung legt nicht fest, wie der folgende Ausdruck zu interpretieren ist:

      » 2^-(3-2)
      ans =
          0.5000
      
      Es gibt jedoch hier nur eine sinnvolle Reihenfolge und Matlab wählt diese auch.

    3. Multiplikation *, .* sowie Rechts- und Links-Division /, ./ bzw. \, .\

      » 4./-2
      ans =
          -2
      

    4. zweistellige Addition + und Subtraktion -

      » 1.0 + 0.5*eps
      ans =
           1
      
      » 1.0 + (0.5*eps)
      ans =
           1
      

    Steht ein Ausdruck in Klammern, so kann nur der Wert des gesamten Klammerausdruckes als Operand in eine Operation eingehen, die außerhalb der Klammer steht.
    Es versteht sich von selbst, daß bei einem Funktionsaufruf das Argument zuerst ausgerechnet werden muß bevor der Funktionswert ermittelt und mit diesem weitergerechnet werden kann.

    » (2+3)^2 + sin((1+eps)*pi)
    ans =
        25
    
    Wenn die Reihenfolge weder durch Klammerung noch durch Prioritätsregeln festgelegt ist, werden die betreffenden Teile eines Ausdrucks von links nach rechts abgearbeitet.

    » 2^3^4
    ans =
            4096
    » (2^3)^4
    ans =
            4096
    » 2^(3^4)
    ans =
      2.4179e+024
    
    » 128/4/2
    ans =
        16
    » (128/4)/2
    ans =
        16
    » 128/(4/2)
    ans =
        64
    

    Aufgabe 2.1:

    Lassen Sie die Werte von pi, eps sowie 1.0 + eps ausgeben. Letzteres ist die kleinste Zahl größer 1.0, die Matlab von 1.0 unterscheiden kann.
    Welches Ergebnis liefert Matlab für 1.0+0.5*eps?
    Können Sie Matlab dazu bringen, eine Zahl auszugeben, deren Wert zwischen pi und (1+eps)*pi liegt?
    weiter