Anzeigen des Gesamtinhalts (oder Logo links anklicken) oder des Impressums.

Berechnung einer Vektorlänge

Zur Berechnung der Vektorlänge

    `v = sqrt(x^2+y^2)

sind verschiedene Schaltungen möglich, die unterschiedliche und unterschiedlich viele Elemente benötigen. Sie unterscheiden sich auch in der Stabilität und Genauigkeit, wenn die Eingangswerte klein bzw. null sind.

Ferner ist zu untersuchen, ob die Kombination der Eingangswerte zu einem Ausgangswert größer als 1 führen kann; dann sind die Eingangswerte entsprechend zu skalieren, nötigenfalls beide mit dem Faktor `1/sqrt(2)`. Häufig sind aber die Eingangswerte in diesen Fällen ohnehin Komponenten eines Vektors, dessen Länge auf 1.0 beschränkt ist, so dass dieses Problem im folgenden nicht berücksichtigt wird.

Direkte Methode

Die Eingangswerte werden quadriert, addiert und die Wurzel gezogen. Die Wurzel wird bevorzugt mit einem Funktionsgenerator ermittelt, da dieser keine Instabilitäten, insbesondere im Nullpunkt, aufweist. Aus diesem Grunde sind auch (spezielle) Funktionsgeneratoren für die Quadrate vorzuziehen, wie sie in manchen Multipliziereren verwendet werden, aber leider selten extern verfügbar sind. So wird man in der Regel Multiplizier verwenden müssen, und die Quadratwurzel mit einem dritten Multiplizierer im Rückkopplungszweig eines offenen Verstärkers berechnen. Dies kann jedoch leicht zu Instabilitäten führen.

Zudem werden drei multiplikative Elemente verwendet, die meist knapp sind.

Inverse Methode

Verwendet wird die dritte Binomische Formel:

    `v^2 - x^2 = (v+x)*(v-x) = y^2

und `v` durch einen einzigen offenen Verstärker bestimmt.

Hierbei wird, zusätzlich zu zwei Addierern und einem offenen Vestärker, lediglich ein Quadrierer und ein Multiplizierer benötigt:

Als Beispiel sei `x=y=0.1`, dann sind `y^2 = 0.01, v=0.141, v+x=0.241, v-x = 0.041, (v+x)*(v-x)=0.0099 `.

Der offene Verstärker muss zwei Werte mit 1% vom Rechenbereich vergleichen (also 100mV bei 10V).

Für `y=0` oder `x=0` sind keine Stabilitätsprobleme ersichtlich.

Es werden nur zwei multiplikative Elemente verwendet; zwar wird gegenüber den folgenden Lösungen mit Division zusätzlich ein offener Verstärker benötigt; dafür entfallen die Instabilitäten bei der Division mit Null.

Division mit AD433

In der Firmenzeitschrift Analog Dialogue der Firma Analog Devices wird ein Schaltung angegeben, mit der die Länge eines Vektors, d.h. die Funktion `v = sqrt(x^2+y^2)` mittels folgender Formel berechnet werden kann:

    `v=x + y^2 / (v+x)

Zum Beweis subtrahiert man x von der Gleichung und multipliziert anschließend `v+x`, so ergibt sich:

    `(v-x) * (v+x) = v^2 - x^2 = y^2

Verwendet werden soll der AD433, ein Multiplizierer mittels Logarithmusbildung, der gleichzeitig durch einen dritten Wert dividieren kann:

Die Schaltung ist nicht empfindlich für kleine Werte von `y` und auch wenig empfindlich für kleine Werte von `x`, solange das Ergebnis nicht nahe Null ist. Wenn allerdings beide Eingangswerte beide null sind, müsste durch Null dividiert werden. Letzter Fall könnte bei Verwendung des AD433 weniger gravierend sein als bei einem Aufbau mit einzelnen Multiplizieren und Dividierern.

Sei als Beispiel `x=y=0.1`, also `v=0.14` dann sind `y^2=0.01` und `v+x=0.24`, wobei der Eingangswert der Division von 0.01 nicht optimal ist. Ist `x=0.4` und `y=0.9`, mithin `v=0.978`, so ist `v+x=1.38` und damit ausserhalb des Rechenbereichs, obwohl das Ergebnis innerhalb ist. Dies ließe sich durch Faktoren <1 vor dem ersten Summierer A1 vermeiden.

Der den AD433 ersetzende AD538 ist relativ teuer im Vergleich zu zwei Multiplizierern AD633, so dass eine Ausführung mit getrennten Elementen sinnvoll sein kann.

Division mit getrennten Elementen

Wird anstelle der integrierten Schaltung eine Schaltung aus vorhandenen Elementen verwendet, so ergibt sich die Schaltung zu:

    `v=x + y^2 / (v+x)

Wegen `v ge |x|` ist auch für `x<0` die Summe `v+x ge 0`, so dass hier der Divisor nicht negativ ist. Auch hier kann allerdings `v+x > 1 ` werden, so dass — nicht gezeigt — skaliert werden muss.

Die in der vorigen und dem folgenden Schema gezeigten Addierer sind nicht invertierend, weil bei der praktischen Umsetzung ohnehin Änderungen notwendig sind, da einige Dividierer invertierte Ergebnisse liefern, u.s.w.

Division vertauscht

Eine bessere Aussteuerung wird erreicht, wenn anstelle des Quadrierers ein Multplizierer verwendet wird und die Faktoren vertauscht werden:

    `v=x + y * (y / (v+x))

Als Beispiel sei `x=y=0.1`, dann ist `v=0.14, v+x=0.24`. Im ersten Fall muss 0.01 durch 0.24 dividiert, im zweiten Fall 0.1 durch 0.24 dividiert und anschließend mit 0.1 multipliziert werden, was deutlich weniger ungenau ist. Die Aussteuerbarkeit ist unverändert, da nach wie vor der Term v+x gebildet wird.

Alternative Quadratsumme

Wegen

    `x^2+y^2 = (x+y)^2 - 2 x y

kann man die Quadratsumme auch mit einem zusätzlichen Addierer, einem Quadrierer und einem Multiplizierer bilden und hat dabei größere Zwischenwerte, da man, mit `x=y=0.1`, die Subtraktion `0.04 - 0.02` anstelle der Addition `0.01+0.01` verwendet. Dieser Vorteil ist aber für einen weiteren Addierer nicht ausreichend groß.

Polynom-Approximation

Wegen

    `sqrt(x^2+y^2) >= max(x,y)

kann man auch durch einen linearen Ausdruck approxmieren:

    `sqrt(x^2 + y^2) ~~ alpha x + beta y

Hierbei ist für `x > y` der Koeffizient `alpha` ungefähr 1; dies wird als Alpha max plus beta min Verfahren bezeichnet (siehe https://en.wikipedia.org/wiki/Alpha_max_plus_beta_min_algorithm für Werte von `alpha` und `beta`).

Damit für `y=0` der Funktionswert nicht kleiner als `x` wird, ist `alpha = 1` vorzuziehen.

Dies entspricht einer Approximation

    `sqrt(1+x^2) ~~ 1 + 0.38 x if |x| <= 1

wobei der Wert 0.38 durch Probieren ermittelt wurde. Mit dem Faktor `sqrt(2)-1 ~~ 0.414` wird der Fehler am Bereichsende minimiert.

Besser ist freilich eine Taylorreihe (für `x<=1`) mit

    `sqrt(1+x^2) ~~ 1 + 0.41*x^2 if |x| <= 1

benötigt aber einen Quadrierer (anstelle von dreien).

Mit einem zusätzlichen Multiplizierer ist der Fehler unter 1%:

    `sqrt(1+x^2) ~~ 1 + (0.47 - 0.06x)*x^2 if |x| <= 1

Die Koeffizienten sind wieder empirisch ermittelt; gegebenenfalls können optimale Koeffizienten über eine Tschebyscheff-Approximation bestimmt werden.


Übersetzungen dieser Seite:
Anmelden