<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Runtux Blog (Einträge über german)</title><link>https://blog.runtux.com/</link><description></description><atom:link href="https://blog.runtux.com/de/categories/german.xml" rel="self" type="application/rss+xml"></atom:link><language>de</language><copyright>Contents © 2025 &lt;a href="mailto:rsc@runtux.com"&gt;Ralf Schlatterbeck&lt;/a&gt; </copyright><lastBuildDate>Mon, 03 Nov 2025 19:13:19 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Dynamisches DNS mit Bind funktioniert nicht mehr</title><link>https://blog.runtux.com/de/posts/2025/03/05/</link><dc:creator>Ralf Schlatterbeck</dc:creator><description>&lt;p&gt;Im Jahr 2021 hatte ich ein dynamisches DNS-Service mit dem &lt;a class="reference external" href="https://www.isc.org/bind/"&gt;ISC Bind&lt;/a&gt;
DNS-Server aufgesetzt und das Setup in einem Blog Artikel gepostet &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2025/03/05/#footnote-1" id="footnote-reference-1" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Vor kurzem (in der zweiten Hälfte von 2024) haben die DNS Updates
plötzlich nicht mehr funktioniert. In der Konfiguration hatte ich das
Public Key Verfahren namens SIG(0) verwendet. Dieses wird schon lange in
Bind unterstützt und es ist auch &lt;a class="reference external" href="https://bind9.readthedocs.io/en/latest/chapter7.html#sig-0"&gt;dokumentiert dass es funktioniert&lt;/a&gt;
– &lt;em&gt;in der letzten Version&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Plötzlich wurden alles DNS Update Anfragen mit einem &lt;code class="docutils literal"&gt;REFUSED&lt;/code&gt; Status
zurückgewiesen. Selbst mit aufgedrehtem Debugging mit &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;-d&lt;/span&gt; 15&lt;/code&gt; bekam
ich keine weiteren Informationen, auch nicht wenn alle Logs auf Standard
Error umgeleitet wurden mit der Option &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;-g&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Es stellte sich heraus dass das Public Key Verfahren SIG(0) wegen eines
"Denial of Service" Angriffsvektors, der in &lt;a class="reference external" href="https://security-tracker.debian.org/tracker/CVE-2024-1975"&gt;CVE-2024-1975&lt;/a&gt; dokumentiert
ist, entfernt worden war. DNS updates mit &lt;a class="reference external" href="https://bind9.readthedocs.io/en/bind-9.18/chapter7.html#tsig"&gt;TSIG keys&lt;/a&gt; funktionieren
noch. Leider sah es so aus als ob das nicht dokumentiert ist und es
kamen auch keine sinnvollen Logmeldungen, daher habe ich einen &lt;a class="reference external" href="https://gitlab.isc.org/isc-projects/bind9/-/issues/5221"&gt;Bug
report&lt;/a&gt; gemacht.&lt;/p&gt;
&lt;p&gt;Wie sich dann herausstellte hätte ich in die Dokumentation von 9.18 –
die Version die von Debian bookworm paketiert ist – schauen müssen.
Diese dokumentiert dass &lt;a class="reference external" href="https://bind9.readthedocs.io/en/bind-9.18/chapter7.html#sig-0"&gt;SIG(0) entfernt wurde&lt;/a&gt; wegen &lt;a class="reference external" href="https://security-tracker.debian.org/tracker/CVE-2024-1975"&gt;CVE-2024-1975&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Es sieht so aus dass &lt;em&gt;spätere&lt;/em&gt; Versionen von Bind (z.B. 9.20.6
und höher) wieder SIG(0) unterstützen, mit einem Quota-Mechanismus der
einen Denial of Service verhindert. Aber für frühere Versionen besteht
der "Fix" darin, SIG(0) komplett zu deaktivieren.&lt;/p&gt;
&lt;aside class="footnote-list brackets"&gt;
&lt;aside class="footnote brackets" id="footnote-1" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2025/03/05/#footnote-reference-1"&gt;1&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Ralf Schlatterbeck. &lt;a class="reference external" href="https://blog.runtux.com/de/posts/2021/01/08/"&gt;Dynamisches DNS mit dem bind DNS server&lt;/a&gt;.
Blog post, Open Source Consulting, Jan 2021.&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;</description><category>documentation</category><category>german</category><category>howto</category><category>open source</category><guid>https://blog.runtux.com/de/posts/2025/03/05/</guid><pubDate>Wed, 05 Mar 2025 18:00:00 GMT</pubDate></item><item><title>Schwebung</title><link>https://blog.runtux.com/de/posts/2024/05/11/</link><dc:creator>Ralf Schlatterbeck</dc:creator><description>&lt;div&gt;&lt;div class="cell border-box-sizing text_cell rendered" id="cell-id=4e997312"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Musiker kennen den Effekt beim Stimmen von Instrumenten: Wenn zwei Instrumente nicht ganz den selben Ton spielen klingt das als ob es eine periodische Variation der Lautstärke gibt. Die Periode wird größer je besser die beiden Instrumente gestimmt sind und stoppt wenn beide den selben Ton spielen. Wir nennen diesen Effekt &lt;a href="https://de.wikipedia.org/wiki/Schwebung"&gt;"Schwebung"&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Funkamateure kennen den "umgekehrten" Fall dieses Effekts von der Amplitudenmodulation einer Radio-Frequenz mit einer Sinusschwingung im Audio-Bereich: Das Resultat sind zwei Radio Frequenzen, eine um die Audio-Frequenz niedriger als die Modulationsfrequenz, eine um die Audio Frequenz höher.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://de.wikipedia.org/wiki/Amplitudenmodulation"&gt;Amplitudenmodulation&lt;/a&gt; ist eine einfache Multiplikation:
Wir multiplizieren die Radiofrequenz mit dem Audio, wir haben:&lt;/p&gt;
&lt;p&gt;$$m(t) = A(t) \cdot\cos(2\pi f t)$$&lt;/p&gt;
&lt;p&gt;Wobei $t$ die Zeit ist, $m(t)$ das amplitudenmodulierte Signal, $\cos(2\pi f_r t)$ ist das Radiofrequenz-Signal
mit der Frequenz $f_r$ und $A(t)$ ist das Audiosignal. Für eine einfache Audio Sinusschwingung bekommen wir:&lt;/p&gt;
&lt;p&gt;$$m(t) = \cos(2\pi f_a t)\cdot\cos(2\pi f_r t)$$&lt;/p&gt;
&lt;p&gt;wobei $f_a$ die Audio-Frequenz ist.&lt;/p&gt;
&lt;p&gt;Wir möchten jetzt zeigen, dass beide Effekte das gleiche Ding sind. Wir brauchen keine Radiofrequenzen, wir können das gleiche einfach im Audio-Spektrum tun.&lt;/p&gt;
&lt;p&gt;Aus Wikipedia bekommen wir eine trigonometrische Identität über &lt;a href="https://de.wikipedia.org/wiki/Formelsammlung_Trigonometrie#Produkte_der_Winkelfunktionen"&gt;Produkte von Winkelfunktionen&lt;/a&gt;, daraus nehmen wir die für zwei Cosinus Funktionen:&lt;/p&gt;
&lt;p&gt;$$\displaystyle\cos\theta \cos\phi = \frac{\cos(\theta-\phi) + \cos(\theta+\phi)}{2}$$&lt;/p&gt;
&lt;p&gt;Wenn wir die auf unser Modulation-Beispiel anwenden bekommen wir:&lt;/p&gt;
&lt;p&gt;$$\displaystyle
\begin{align}
 \  \cos(2\pi f_a t) \cos(2\pi f_r t) &amp;amp; = \frac{\cos(2\pi f_r t-2\pi f_a t) + \cos(2\pi f_r t+2\pi f_a t)}{2} \\
 &amp;amp; =  \frac{\cos(2\pi(f_r-f_a)t)) + \cos(2\pi(f_r+f_a)t)}{2} \\
\end{align}
$$&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered" id="cell-id=084ac693"&gt;&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Die &lt;em&gt;Multiplikation&lt;/em&gt; von zwei Cosinus-Schwingungen mit unterschiedlichen Frequenzen resultiert in der &lt;em&gt;Summe&lt;/em&gt;
von zwei Cosinus-Schwingungen, eine davon die &lt;em&gt;Differenz&lt;/em&gt; der beiden ursprünglichen Frequenzen, die andere die &lt;em&gt;Summe&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Egal &lt;em&gt;wie&lt;/em&gt; wir das modulierte Signal erzeugen, durch &lt;em&gt;Multiplikation&lt;/em&gt; von zwei Signalen oder durch &lt;em&gt;Addition&lt;/em&gt; von zwei Signalen, wir bekommen das selbe Resultat.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.runtux.com/de/posts/2024/05/11/"&gt;Weiterlesen…&lt;/a&gt; (3 min verbleiben zum Lesen)&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description><category>deutsch</category><category>documentation</category><category>german</category><category>hamradio</category><guid>https://blog.runtux.com/de/posts/2024/05/11/</guid><pubDate>Sat, 11 May 2024 09:00:00 GMT</pubDate></item><item><title>Differential Evolution veranschaulicht</title><link>https://blog.runtux.com/de/posts/2023/04/07/</link><dc:creator>Ralf Schlatterbeck</dc:creator><description>&lt;p&gt;Dieser Beitrag bezieht sich auf &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapack"&gt;PGAPack&lt;/a&gt; und &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapy"&gt;PGApy&lt;/a&gt; oder andere
Genetische Algorithmus (GA) Implementierungen die Differential Evolution
(vielleicht übersetzbar mit Differentielle Evolution, in der Folge
abgekürzt mit DE) unterstützen.&lt;/p&gt;
&lt;p&gt;Differential Evolution (DE) &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2023/04/07/#footnote-1" id="footnote-reference-1" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;, &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2023/04/07/#footnote-2" id="footnote-reference-2" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;2&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;, &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2023/04/07/#footnote-3" id="footnote-reference-3" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;3&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; ist ein
Optimierungsalgorithmus der ähnlich wie andere evolutionäre Algorithmen
auf einer Population basiert. Der Algorithmus ist recht mächtig, in
&lt;a class="reference external" href="https://github.com/schlatterbeck/pgapack"&gt;PGAPack&lt;/a&gt; implementiert und auch in &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapy"&gt;PGAPy&lt;/a&gt; nutzbar. Um einige Punkte zu
diesem Algorithmus zu veranschaulichen habe ich einen einfachen Parcours
in &lt;a class="reference external" href="https://github.com/openscad/openscad"&gt;OpenSCAD&lt;/a&gt; konstruiert.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;img alt="/images/parcours.gif" src="https://blog.runtux.com/images/parcours.gif"&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Um den Optimierer mit diesem Parcours zu testen ist das Gen (DE nennt es
die Parameter) die X- und Y-Koordinate um eine Position im Parcours zu
bestimmen. In der Folge bezeichnen wir diese zwei Werte auch als Vektor,
wie das in der Literatur zu DE üblich ist. Wir initialisieren die
Population in der Gegend beim Start der Rampe. Wir erlauben der
Population, den Initialisierungsbereich zu verlassen.&lt;/p&gt;
&lt;p&gt;Es ist zu beachten, dass die Ecken des Parcours flach sind, dass dort
also alle Punkte die selbe Höhe haben. Solche Bereiche sind generell
schwierig für Optimierungsalgorithmen weil der Algorithmus nicht wissen
kann, in welche Richtung bessere Werte (wenn es diese überhaupt gibt) zu
finden sind. Dies ist auch der Grund, warum wir den
Initialisierungsbereich nicht in den flachen Bereich am Boden des
Parcours legen. Üblicherweise würde man nämlich die Population über den
gesamten zu durchsuchenden Bereich initialisieren. In diesem Fall
möchten wir demonstrieren, dass der Algorithmus auch fähig ist, eine
Lösung weit vom Initialisierungsbereich zu finden.&lt;/p&gt;
&lt;p&gt;Der DE Algorithmus ist recht einfach (siehe z.B. &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2023/04/07/#footnote-3" id="footnote-reference-4" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;3&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; S.37-47): Mit jedem
Vektor &lt;span class="math"&gt;\(\mathbf x_{i,g}\)&lt;/span&gt; der Population der aktuellen Generation
&lt;span class="math"&gt;\(g\)&lt;/span&gt;, wobei &lt;span class="math"&gt;\(i\)&lt;/span&gt; der Populationsindex ist wird ein
Genaustausch mit einem Mutanten-Vektor vorgenommen. Der Mutanten-Vektor
wird zufällig (ohne Zurücklegen) aus drei Populations-Vektoren
bestimmt, indem diese wie folgt kombiniert werden.&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\mathbf v_{i,g} = \mathbf x_{r_0,g}
                  + F \cdot (\mathbf x_{r_1,g} - \mathbf x_{r_2,g})
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Wie man sieht, wird eine gewichtete Differenz von zwei Vektoren der
Population gebildet und zu einem dritten Vektor addiert. Alle Indices
&lt;span class="math"&gt;\(r_0, r_1,\)&lt;/span&gt; und &lt;span class="math"&gt;\(r_2\)&lt;/span&gt; sind voneinander und von &lt;span class="math"&gt;\(i\)&lt;/span&gt;
verschieden. Das Gewicht &lt;span class="math"&gt;\(F\)&lt;/span&gt; ist ein Konfigurationsparameter der
typischerweise &lt;span class="math"&gt;\(0.3 \le F &amp;lt; 1\)&lt;/span&gt; ist. Der beschriebene Algorithmus
ist der &lt;em&gt;klassische&lt;/em&gt; DE Algorithmus, oft auch als &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;de-rand-1-bin&lt;/span&gt;&lt;/code&gt;
bezeichnet. Eine Variante nutzt statt einem zufälligen Index &lt;span class="math"&gt;\(r_0\)&lt;/span&gt;
den Index des besten Vektors und wird als &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;de-best-1-bin&lt;/span&gt;&lt;/code&gt; bezeichnet.
Falls mehr als zwei Differenzen addiert werden wäre eine andere Variante
z.B. &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;de-rand-2-bin&lt;/span&gt;&lt;/code&gt;. Die letzte Komponente der Bezeichnung steht für
Uniform Crossover &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2023/04/07/#footnote-4" id="footnote-reference-5" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;4&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;, eine binomiale Verteilung. In DE werden die
Parameter des Mutanten-Vektors mit einer bestimmten Wahrscheinlichkeit
&lt;span class="math"&gt;\(Cr\)&lt;/span&gt; ausgewählt. Man beachte, dass DE dafür sorgt, dass zumindest
&lt;em&gt;ein&lt;/em&gt; Parameter des Mutanten-Vektors ausgewählt wird (sonst bliebe der
betrachtete Original-Vektor &lt;span class="math"&gt;\(\mathbf x_{i,g}\)&lt;/span&gt; unverändert).&lt;/p&gt;
&lt;p&gt;Mehr Details zu DE und er Nutzung mit &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapack"&gt;PGAPack&lt;/a&gt; findet sich in den
Abschnitten &lt;a class="reference external" href="https://pgapack.readthedocs.io/en/latest/part1.html#sec-differential-evolution"&gt;Differential Evolution&lt;/a&gt; und &lt;a class="reference external" href="https://pgapack.readthedocs.io/en/latest/part2.html#sec-mutation"&gt;Mutation&lt;/a&gt; der &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapack"&gt;PGAPack&lt;/a&gt;
Dokumentation.&lt;/p&gt;
&lt;p&gt;Um das &lt;a class="reference external" href="https://github.com/openscad/openscad"&gt;OpenSCAD&lt;/a&gt; Modell in der Optimierung zu verwenden, wird es
mithilfe eines &lt;a class="reference external" href="https://fenrus75.github.io/FenrusCNCtools/javascript/stl2png.html"&gt;STL zu PNG Konverters&lt;/a&gt; in ein Graustufen-Höhenbild
umgewandelt (STL ist ein &lt;a class="reference external" href="https://de.wikipedia.org/wiki/STL-Schnittstelle"&gt;3D-Format&lt;/a&gt; das von &lt;a class="reference external" href="https://github.com/openscad/openscad"&gt;OpenSCAD&lt;/a&gt; generiert werden
kann). Die Bewertungsfunktion des Algorithmus liefert dann einfach den
Graustufen-Wert an der gegebenen X/Y-Position zurück (nach Rundung der
Gen-Werte und Konvertierung in einen Integer-Wert). Werte ausserhalb des
Bildes werden als 0 (schwarz) geliefert. Der resultierende
Optimierungslauf ist unten in einem animierten Bild dargestellt. Die
Population ist ziemlich klein und enthält nur 6 Vektoren. Wir sehen
dass, wenn die Abstände zwischen den Punkten groß werden (auf den geraden
Strecken des Parcours), die Optimierung in größeren Schritten
voranschreitet. Wir sehen auch, dass der Algorithmus in den flachen
Ecken einige Zeit brauchen kann bis er aus diesem Bereich entkommt.
Schließlich, in der letzten Ecke, wird der Kegel erklommen und der
Algorithmus stoppt wenn das erste Individuum eine Bewertung mit dem
größten Graustufen-Wert liefert (entspricht weiss). Bitte beachten, dass
ich ein bisschen geschummelt habe: Viele Optimierungläufe dauern
deutlich länger (Insbesondere in den flachen Bereichen kann der
Algorithmus längere Zeit stecken bleiben). Ich habe einen Lauf
ausgewählt der sich für eine Animation gut eignet. Dieser Lauf ist nicht
im Bereich des Durchschnitts sondern deutlich kürzer.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;img alt="/images/animated.gif" src="https://blog.runtux.com/images/animated.gif"&gt;
&lt;p&gt; &lt;/p&gt;
&lt;aside class="footnote-list brackets"&gt;
&lt;aside class="footnote brackets" id="footnote-1" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2023/04/07/#footnote-reference-1"&gt;1&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Rainer Storn and Kenneth Price. Differential evolution – a simple
and efficient heuristic for global optimization over continuous
spaces. &lt;em&gt;Journal of Global Optimization&lt;/em&gt;, 11(4):341–359, December 1997.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-2" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2023/04/07/#footnote-reference-2"&gt;2&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Rainer Storn and Kenneth Price. Differential evolution – a simple
and efficient adaptive scheme for global optimization over
continuous spaces. Technical Report TR-95-012, International
Computer Science Institute (ICSI), March 1995.
&lt;a class="reference external" href="ftp://ftp.icsi.berkeley.edu/pub/techreports/1995/tr-95-012.pdf"&gt;Available from the International Computer Science Institute&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-3" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;3&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class="backrefs"&gt;(&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2023/04/07/#footnote-reference-3"&gt;1&lt;/a&gt;,&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2023/04/07/#footnote-reference-4"&gt;2&lt;/a&gt;)&lt;/span&gt;
&lt;p&gt;Kenneth V. Price, Rainer M. Storn, and Jouni A. Lampinen.
&lt;em&gt;Differential Evolution: A Practical Approach to Global Optimization.&lt;/em&gt;
Springer, Berlin, Heidelberg, 2005.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-4" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2023/04/07/#footnote-reference-5"&gt;4&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Gilbert Syswerda. Uniform crossover in genetic algorithms. In J.
David Schaffer, editor, Proceedings of the Third International
Conference on Genetic Algorithms (ICGA), pages 2–9. Morgan
Kaufmann, Fairfax, Virginia, June 1989.&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;</description><category>documentation</category><category>genetic algorithms</category><category>german</category><category>howto</category><category>open source</category><category>optimization</category><guid>https://blog.runtux.com/de/posts/2023/04/07/</guid><pubDate>Fri, 07 Apr 2023 20:00:00 GMT</pubDate></item><item><title>Proportionale Selection (Roulette-Rad) in Genetischen Algorithmen</title><link>https://blog.runtux.com/de/posts/2022/12/03/</link><dc:creator>Ralf Schlatterbeck</dc:creator><description>&lt;p&gt;Einige Leser hier wissen dass ich &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapack"&gt;PGApack&lt;/a&gt;, ein Paket für Genetische
Algorithmen, zusammen mit &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapy"&gt;PGApy&lt;/a&gt; einer Python Bibliothek pflege
(maintaine). Vor kurzem kam die Frage auf, warum &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapack"&gt;PGApack&lt;/a&gt; wenn eine
Selektionsmethode verwendet wird die proportional zur Fitness selektiert
(&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Fitness_proportionate_selection"&gt;Fitness Proportionate Selection&lt;/a&gt;), im englischen auch als Roulette-Rad
Selektion bezeichnet, mit einem Fehler aussteigt weil es einen
Fitness-Wert &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapack/issues/7"&gt;nicht normalisieren kann&lt;/a&gt;. Im folgenden werde ich kurz
von proportionaler Selektion schreiben.&lt;/p&gt;
&lt;p&gt;In &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapack"&gt;PGApack&lt;/a&gt; definieren wir als Anwenderin  eine Reelle
Bewertungsfunktion (die für jedes Individuum aufgerufen wird). Ausserdem
definieren wir ob diese Bewertung minimiert oder maximiert wird (wir
legen die Optimierungsrichtung fest).&lt;/p&gt;
&lt;p&gt;Bei proportionaler Selektion muss diese Bewertung auf positive Werte
abgebildet werden so dass jeder Bewertung ein Teil des Roulette-Rades
zugewiesen wird. Wenn &lt;em&gt;minimiert&lt;/em&gt; wird sind kleine Werte besser und
müssen einen &lt;em&gt;größeren&lt;/em&gt; Bereich des Roulette-Rades bekommen so dass die
Wahrscheinlichkeit der Selektion höher ist. Wir müssen also die
Bewertungsfunktion auf eine nicht-negative monoton steigende &lt;em&gt;Fitness&lt;/em&gt;
abbilden. Bei einem &lt;em&gt;Minimierungsproblem&lt;/em&gt; berechnen wir die maximale
(schlechteste) Bewertung und bilden dann die Differenz dieses Maximums
mit der Bewertung des Individuums (nach einer Skalierung des Maximums so
dass kein Fitnesswert negativ wird):&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
F = E_{max} - E
\end{equation*}
&lt;/div&gt;
&lt;p&gt;wobei &lt;span class="math"&gt;\(F\)&lt;/span&gt; die Fitness des aktuellen Individuums ist,
&lt;span class="math"&gt;\(E_{max}\)&lt;/span&gt; das Maximum aller Bewertungen der aktuellen Generation
und &lt;span class="math"&gt;\(E\)&lt;/span&gt; die Bewertung des Individuums.&lt;/p&gt;
&lt;p&gt;Wenn sich nun die Bewertungen um mehrere Größenordnungen unterscheiden
kann es vorkommen, dass die Fitness zu &lt;span class="math"&gt;\(E_{max}\)&lt;/span&gt; wird, für viele
(unterschiedliche) Individuen. Ich nenne das einen Überlauf
(overflow), vielleicht nicht der beste Name dafür.&lt;/p&gt;
&lt;p&gt;Der Überlauf passiert wenn &lt;span class="math"&gt;\(E_{max}\)&lt;/span&gt; groß ist verglichen mit der
aktuellen Bewertung &lt;span class="math"&gt;\(E\)&lt;/span&gt; so dass die obige Differenz
&lt;span class="math"&gt;\(E_{max}\)&lt;/span&gt; wird (die Subtraktion von &lt;span class="math"&gt;\(E\)&lt;/span&gt; also keine Wirkung hat)
Im Code checken wir diese Bedingung:&lt;/p&gt;
&lt;pre class="literal-block"&gt;if (cmax == cmax - evalue &amp;amp;&amp;amp; evalue != 0)&lt;/pre&gt;
&lt;p&gt;Die Bedingung ist erfüllt wenn die Subtraktion von &lt;span class="math"&gt;\(E\)&lt;/span&gt; von
&lt;span class="math"&gt;\(E_{max}\)&lt;/span&gt; &lt;span class="math"&gt;\(E_{max}\)&lt;/span&gt; nicht verändert obwohl &lt;span class="math"&gt;\(E\)&lt;/span&gt;
ungleich Null ist. &lt;span class="math"&gt;\(E\)&lt;/span&gt; ist so klein gegenüber &lt;span class="math"&gt;\(E_{max}\)&lt;/span&gt; dass
der Datentyp &lt;code class="docutils literal"&gt;double&lt;/code&gt; den Unterschied nicht repräsentieren kann.
Das passiert wenn die &lt;em&gt;Einheit der letzten Stelle&lt;/em&gt; (&lt;em&gt;units in the last
place&lt;/em&gt; von Goldberg (nicht dem Goldberg der das &lt;em&gt;Genetische Algorithmen&lt;/em&gt;
Buch geschrieben hat soweit ich weiss) auch &lt;em&gt;ulps&lt;/em&gt; genannt) der &lt;a class="reference external" href="https://de.wikipedia.org/wiki/Mantisse"&gt;Mantisse&lt;/a&gt;
größer ist als der Wert der subtrahiert wird &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/12/03/#footnote-1" id="footnote-reference-1" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In unserem Beispiel &lt;span class="math"&gt;\(E_{max} = 1.077688 * 10^{22}\)&lt;/span&gt; und die
Bewertung bei der das schiefging war &lt;span class="math"&gt;\(E = 10000\)&lt;/span&gt;. Ein IEEE 754
Fließkomma-Wert doppelter Genauigkeit (&lt;code class="docutils literal"&gt;double&lt;/code&gt;) hat 53 bit &lt;a class="reference external" href="https://de.wikipedia.org/wiki/Mantisse"&gt;Mantisse&lt;/a&gt;
die damit Zahlen bis &lt;span class="math"&gt;\(2^{54} - 1 = 18014398509481983\)&lt;/span&gt; darstellen
kann, also etwa &lt;span class="math"&gt;\(1.8 * 10^{16}\)&lt;/span&gt;. Man sieht dass die Zahl 10000
gerade unterhalb des oben erwähnten &lt;em&gt;ulps&lt;/em&gt; ist. Wir können das in Python
ausprobieren (das für Fließkommazahlen &lt;code class="docutils literal"&gt;double&lt;/code&gt; verwendet):&lt;/p&gt;
&lt;pre class="literal-block"&gt;&amp;gt;&amp;gt;&amp;gt; 1.077688e22 - 10000 == 1.077688e22
True&lt;/pre&gt;
&lt;p&gt;Warum machen wir diesen Check im Programm? Würde die Suche bei einem
solchen Überlauf (oder wie auch immer wir das nennen wollen)
weiterlaufen, würde der Algorithmus viele verschiedene Bewertungen auf
die gleiche Fitness abbilden. Der Genetische Algorithmus könnte also
diese Individuen nicht unterscheiden.&lt;/p&gt;
&lt;p&gt;Was können wir tun wenn dieser Fehler auftritt?&lt;/p&gt;
&lt;p&gt;Die kurze Antwort: Einen anderen Selektionsmechanismus verwenden. Es
gibt einen Grund, warum proportionale Selektion &lt;em&gt;nicht&lt;/em&gt; die
Standardeinstellung in &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapack"&gt;PGApack&lt;/a&gt; ist.&lt;/p&gt;
&lt;p&gt;Proportionale Selektion (&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Fitness_proportionate_selection"&gt;Fitness proportionate selection&lt;/a&gt;) hat noch
andere Probleme. Sie hat zu großen Selektionsdruck am Anfang zu wenig
gegen Ende der Optimierung (auch erwähnt im obigen Wikipedia Artikel,
aber Vorsicht, ich habe Teile davon geschrieben).&lt;/p&gt;
&lt;p&gt;Blickle and Thiele &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/12/03/#footnote-2" id="footnote-reference-2" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;2&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; haben eine mathematische Analyse von
unterschiedlichen Selektions-Algorithmen publiziert und gezeigt dass
proportionale Selektion typischerweise keine gute Idee ist
(proportionale Selektion war historisch der erste Selektionsmechanismus
in der Literatur und war ausführlich in Goldbergs (der andere Goldberg)
Buch &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/12/03/#footnote-3" id="footnote-reference-3" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;3&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; beschrieben und ist vielleicht deshalb heute noch manchmal in
Verwendung). Es sei darauf hingewiese dass Blickle und Thiele in einem
früheren Report &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/12/03/#footnote-4" id="footnote-reference-4" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;4&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; direkter waren was die Beurteilung von
proportionaler Selektion betrifft (meine Übersetzung): "Alle
unerwünschten Eigenschaften zusammen führten uns zu dem Schluss dass
proportionale Selektion ein sehr ungeeigneter Selektionsmechanismus ist.
Informell könnten wir sagen dass der einzige Vorteil von proportionaler
Selektion ist, dass es so schwierig ist die Nachteile zu beweisen"
(&lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/12/03/#footnote-4" id="footnote-reference-5" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;4&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;, S. 42), in der Endfassung im veröffentlichten Artikel waren sie
dann nicht mehr so deutlich :-)&lt;/p&gt;
&lt;p&gt;Wir sehen in obigem Beispiel: Wir haben sehr große Unterschiede zwischen
guten und schlechten Bewertungen (eben so groß dass die Fitness nicht
eindeutig berechnet werden kann, s.o.). Wenn man dafür proportionale
Selektion verwendet, werden sehr gute Individuen mit zu großer
Wahrscheinlichkeit selektiert was zu verfrühter Konvergenz (&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Premature_convergence"&gt;premature
convergence&lt;/a&gt;) führt.&lt;/p&gt;
&lt;p&gt;Zum Schluss all dieser Ausführungen: Wenn wir Optimierungen mit
Fließkomma-Repräsentationen durchführen (diese werden durch &lt;code class="docutils literal"&gt;double&lt;/code&gt;
Datentypen in &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapack"&gt;PGApack&lt;/a&gt; repräsentiert) sollten wir Differential Evolution
ausprobieren &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/12/03/#footnote-5" id="footnote-reference-6" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;5&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;, &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/12/03/#footnote-6" id="footnote-reference-7" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;6&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;, &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/12/03/#footnote-7" id="footnote-reference-8" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;7&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;. Zumindest in meinen Experimenten mit
Antennen-Optimierung &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/12/03/#footnote-8" id="footnote-reference-9" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;8&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; sind die Resultate damit deutlich besser als
mit standard Genetischen Algorithmen was auch von verschiedenen
Praktikern bestätigt wird &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/12/03/#footnote-7" id="footnote-reference-10" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;7&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;. Beispiele dazu finden sich in
&lt;code class="docutils literal"&gt;examples/deb/optimize.c&lt;/code&gt; oder &lt;code class="docutils literal"&gt;examples/mgh/testprogde.c&lt;/code&gt; in
&lt;a class="reference external" href="https://github.com/schlatterbeck/pgapack"&gt;PGApack&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Der Parameter &lt;code class="docutils literal"&gt;PGASetDECrossoverProb&lt;/code&gt; ist kritisch. Für Probleme wo
die Dimensionen nicht einzeln optimierbar sind, sollte der Wert nahe
bei, aber nicht gleich 1 sein.&lt;/p&gt;
&lt;aside class="footnote-list brackets"&gt;
&lt;aside class="footnote brackets" id="footnote-1" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/12/03/#footnote-reference-1"&gt;1&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;David Goldberg. What every computer scientist should know
about floating-point arithmetic. ACM Computing Surveys,
23(1):5–48, 1991.
&lt;a class="reference external" href="https://dl.acm.org/doi/pdf/10.1145/103162.103163"&gt;ACM macht es frei verfügbar&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-2" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/12/03/#footnote-reference-2"&gt;2&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Blickle, Tobias; Thiele, Lothar (1996). "A Comparison of Selection
Schemes Used in Evolutionary Algorithms". Evolutionary Computation.
4 (4): 361–394. &lt;a class="reference external" href="https://dl.acm.org/doi/pdf/10.1162/evco.1996.4.4.361"&gt;Verfügbar bei ACM&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-3" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/12/03/#footnote-reference-3"&gt;3&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;David E. Goldberg. Genetic Algorithms in Search, Optimization &amp;amp;
Machine Learning. Addison Wesley, October 1989.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-4" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;4&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class="backrefs"&gt;(&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/12/03/#footnote-reference-4"&gt;1&lt;/a&gt;,&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/12/03/#footnote-reference-5"&gt;2&lt;/a&gt;)&lt;/span&gt;
&lt;p&gt;Tobias Blickle and Lothar Thiele. A comparison of selection
schemes used in genetic algorithms. TIK-Report 11 Version 2,
Computer Engineering and Communications Lab (TIK), December 1995.
&lt;a class="reference external" href="https://tik-old.ee.ethz.ch/file/6c0e384dceb283cd4301339a895b72b8/TIK-Report11.pdf"&gt;Verfügbar bei der ETH&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-5" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/12/03/#footnote-reference-6"&gt;5&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Rainer Storn and Kenneth Price. Differential evolution – a simple
and efficient heuristic for global optimization over continuous
spaces. Journal of Global Optimization, 11(4):341–359, December 1997.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-6" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/12/03/#footnote-reference-7"&gt;6&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Rainer Storn and Kenneth Price. Differential evolution – a simple
and efficient adaptive scheme for global optimization over
continuous spaces. Technical Report TR-95-012, International
Computer Science Institute (ICSI), March 1995.
&lt;a class="reference external" href="ftp://ftp.icsi.berkeley.edu/pub/techreports/1995/tr-95-012.pdf"&gt;Verfügbar beim International Computer Science Institute&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-7" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;7&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class="backrefs"&gt;(&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/12/03/#footnote-reference-8"&gt;1&lt;/a&gt;,&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/12/03/#footnote-reference-10"&gt;2&lt;/a&gt;)&lt;/span&gt;
&lt;p&gt;Kenneth V. Price, Rainer M. Storn, and Jouni A. Lampinen.
Differential Evolution: A Practical Approach to Global Optimization.
Springer, Berlin, Heidelberg, 2005.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-8" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/12/03/#footnote-reference-9"&gt;8&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Ralf Schlatterbeck. &lt;a class="reference external" href="https://blog.runtux.com/de/posts/2021/12/27/"&gt;Antennen Optimierung mit mehreren Kriterien&lt;/a&gt;.
Blogeintrag, Open Source Consulting, Dezember 2021.&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;</description><category>documentation</category><category>genetic algorithms</category><category>german</category><category>howto</category><category>open source</category><category>optimization</category><guid>https://blog.runtux.com/de/posts/2022/12/03/</guid><pubDate>Sat, 03 Dec 2022 15:28:00 GMT</pubDate></item><item><title>Antennendiagramme plotten</title><link>https://blog.runtux.com/de/posts/2022/10/30/</link><dc:creator>Ralf Schlatterbeck</dc:creator><description>&lt;p&gt;Für mein &lt;a class="reference external" href="https://github.com/schlatterbeck/pymininec"&gt;pymininec&lt;/a&gt; Projekt (eine Re-Implementierung des
Original-Mininec &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/10/30/#footnote-1" id="footnote-reference-1" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; in Python, siehe die Beschreibung dort wie es
möglich war, 40 Jahre alten Basic-code zu Reverse-Engineeren) hatte ich
eine Möglichkeit gebraucht, die Resultate graphisch darzustellen. Daher
hatte ich zuerst ein Visualisierungswerkzeug in &lt;a class="reference external" href="https://github.com/schlatterbeck/pymininec"&gt;pymininec&lt;/a&gt; inkludiert.&lt;/p&gt;
&lt;p&gt;Nachdem ich dann aber auf die Schnelle einen Parser für die Ausgabe von
&lt;code class="docutils literal"&gt;nec2c&lt;/code&gt; geschrieben hatte, stellte sich heraus, dass das Programm auch
allein nützlich ist. Daher habe ich es als eigenes Projekt &lt;a class="reference external" href="https://github.com/schlatterbeck/plot-antenna"&gt;plot-antenna&lt;/a&gt;
genannt.&lt;/p&gt;
&lt;p&gt;NEC (vielleicht übersetzbar mit numerischer elektromagnetischer Code)
wurde ursprünglich am Lawrence Livermore National Laboratory in Fortran
entwickelt. Bis Version 2 ist das freie Software, spätere Versionen sind
nicht frei (inzwischen ist &lt;a class="reference external" href="https://ipo.llnl.gov/technologies/it-and-communications/nec-v50-numerical-electromagnetic-code"&gt;NEC bei Version 5&lt;/a&gt;). Neoklis Kyriazis hat
die Fortran Version von NEC-2 nach C übersetzt und das Resultat
&lt;code class="docutils literal"&gt;nec2c&lt;/code&gt; genannt. Er hat einige Optimierungen vorgenommen, z.B. das
ursprünglich separate Programm SOMNEC (um ein Sommerfeld/Norton
Erdungsmodell zu berechnen) integriert und einige Limitierungen des
ursprünglichen Fortran-Codes beseitigt. Das Programm &lt;code class="docutils literal"&gt;nec2c&lt;/code&gt; ist eines
von wenigen Open Source Antennen-Modellierungsprogrammen. Es ist ein
Kommandozeilen-Programm das aus der Beschreibung einer Antenne eine
Ausgabedatei mit vielen Tabellen berechnet. Es gibt andere Programme wie
&lt;a class="reference external" href="https://www.pa3fwm.nl/software/xnecview/"&gt;xnecview&lt;/a&gt; die mit dieser Ausgabedatei eine Antennen-Visualisierung
erzeugen können.&lt;/p&gt;
&lt;p&gt;An dieser Stelle ist zu bemerken, dass ich keine offizielle Webseite von
&lt;code class="docutils literal"&gt;nec2c&lt;/code&gt; gefunden habe. Das Programm &lt;em&gt;ist&lt;/em&gt; in &lt;a class="reference external" href="https://packages.debian.org/stable/hamradio/nec2c"&gt;Debian&lt;/a&gt; und &lt;a class="reference external" href="https://launchpad.net/ubuntu/lunar/+source/nec2c"&gt;Ubuntu&lt;/a&gt;
(&lt;a class="reference external" href="https://launchpad.net/ubuntu/lunar/+source/nec2c"&gt;Ubuntu&lt;/a&gt; sucht auch nach der offiziellen Upstream-Version) enthalten und
es scheint die ursprüngliche Version war mal auf &lt;a class="reference external" href="https://code.google.com/archive/p/nec2c/"&gt;Google Code&lt;/a&gt;
gehostet. Es gibt eine &lt;a class="reference external" href="https://github.com/cvvs/nec2c"&gt;Version auf Github&lt;/a&gt; die auf &lt;a class="reference external" href="https://github.com/hvegh/nec2c"&gt;eine andere
Version auf Github&lt;/a&gt; verweist. Die Software scheint heutzutage nicht
gewartet zu werden – kein großes Problem weil auch NEC in Version 2
seit ein paar Dekaden keine Updates mehr bekommt.&lt;/p&gt;
&lt;p&gt;Zurück zu &lt;a class="reference external" href="https://github.com/schlatterbeck/plot-antenna"&gt;plot-antenna&lt;/a&gt;: Ursprünglich hatte das Programm nur einen
Parser für die Ausgabe von &lt;a class="reference external" href="https://github.com/schlatterbeck/pymininec"&gt;pymininec&lt;/a&gt; (und für das Original Mininec &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/10/30/#footnote-1" id="footnote-reference-2" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;
Basic-Programm). Später habe ich dann einen Parser für NEC hinzugefügt.
Die derzeitigen Parser sind wahrscheinlich nicht sehr robust,
funktionieren aber für meine Zwecke.&lt;/p&gt;
&lt;p&gt;Die erste Version verwendet &lt;a class="reference external" href="https://matplotlib.org/"&gt;Matplotlib&lt;/a&gt; für die Grafikausgabe und diese
Variante ist immer noch unterstützt. Urprünglich hatte ich Azimuth- und
Elevationsdiagramme, sowie eine 3D-Anzeige implementiert.&lt;/p&gt;
&lt;p&gt;Kürzlich, nachdem ich einige Zeit vorher &lt;a class="reference external" href="https://github.com/plotly/plotly.py"&gt;Plotly&lt;/a&gt; entdeckt hatte, habe
ich HTML/Javascript Ausgabe mithilfe von &lt;a class="reference external" href="https://github.com/plotly/plotly.py"&gt;Plotly&lt;/a&gt; hinzugefügt. Die 3D
Möglichkeiten von &lt;a class="reference external" href="https://github.com/plotly/plotly.py"&gt;Plotly&lt;/a&gt; sind deutlich besser als die von &lt;a class="reference external" href="https://matplotlib.org/"&gt;Matplotlib&lt;/a&gt;
– sogar mit 1 Grad Auflösung bei den Antennen-Winkeln
(Azimuth/Elevation), also 180 * 360 3D Punkten, funktioniert das Display
im Browser (Firefox). Mit der 3D Variante von &lt;a class="reference external" href="https://matplotlib.org/"&gt;Matplotlib&lt;/a&gt; muss 5 Grad
Auflösung verwendet werden (36 * 72 3D Punkte), sonst ist die Anzeige
sehr ruckelig. Mit der folgenden Grafik kann selbst damit experimentiert
werden (kann auch in einem &lt;a class="reference external" href="https://blog.runtux.com/content/2022/12-el-1deg-plot3d.html"&gt;vollen Browserfenster dargestellt&lt;/a&gt; werden):&lt;/p&gt;
&lt;iframe class="iframe-embed" width="800" height="640" scrolling="no" frameborder="no" src="https://blog.runtux.com/content/2022/12-el-1deg-plot3d.html"&gt;
&lt;/iframe&gt;&lt;p&gt;Nicht zu reden von Zoom: Das funktioniert in &lt;a class="reference external" href="https://github.com/plotly/plotly.py"&gt;Plotly&lt;/a&gt; ausgezeichnet (mit
dem Scroll-Rad der Maus in obiger Grafik) und scheint in &lt;a class="reference external" href="https://matplotlib.org/"&gt;Matplotlib&lt;/a&gt;
garnicht implementiert zu sein.&lt;/p&gt;
&lt;p&gt;In der &lt;a class="reference external" href="https://github.com/plotly/plotly.py"&gt;Plotly&lt;/a&gt; Version zeichnen wir die Visualisierung für alle
Frequenzen in eine Grafik. Für die 3D-Ansicht sind alle Visualisierungen
bis auf die der gerade selektierten Frequenz versteckt. Über die
Frequenz-Legende auf der rechten Seite kann die jeweils anzuzeigende
Frequenz ausgewählt werden.&lt;/p&gt;
&lt;p&gt;Eine Besonderheit der &lt;a class="reference external" href="https://github.com/plotly/plotly.py"&gt;Plotly&lt;/a&gt; Version ist die Anzeige der 3D-Koordinaten
auf der Oberfläche der 3D-Visualisierung beim Drüberfahren mit der Maus.
In der derzeitigen Implementierung werden dabei Azimuth und
Elevations-Winkel sowie absoluter und relativer Gewinn für den gerade
ausgewählten Punkt angezeigt.&lt;/p&gt;
&lt;p&gt;Allerdings habe ich mit &lt;a class="reference external" href="https://github.com/plotly/plotly.py"&gt;Plotly&lt;/a&gt; auch einige Workarounds gebraucht:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Es &lt;a class="reference external" href="https://github.com/plotly/plotly.js/issues/5003"&gt;gibt einen Bug&lt;/a&gt; im Koordinatendisplay&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/plotly/plotly.py"&gt;Plotly&lt;/a&gt; unterstützt kein Menü (Legende) bei 3D Oberflächen, Ich musste
eine zusätzliche (leere mit einem weissen Pixel) Grafik in die Anzeige
aufnehmen um Menü (Legende) anzuzeigen. Das Menü wird verwendet um auf
der rechten Seite die Anzeige für eine bestimmte Frequenz auszuwählen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In &lt;a class="reference external" href="https://github.com/plotly/plotly.py"&gt;Plotly&lt;/a&gt; gibt es keine Möglichkeit, nur einen bestimmten Menüeintrag
gleichzeitig anzuzeigen. Ich wollte dass sich die Menü-Einträge wie
Radio-Knöpfe (Radio-Buttons) verhalten: Beim Klicken auf eine Frequenz
sollte die Visualisierung von &lt;em&gt;nur dieser Frequenz&lt;/em&gt; erfolgen. Für 3D
Grafiken macht es nicht viel Sinn, mehrere 3D Visualisierungen in
einer Anzeige zu haben. Dies wird mit ein paar Zeilen individuellem
Javascript erreicht.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das Antennendiagramm in obigem Beispiel ist aus einem Artikel von L.B.
Cebik &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/10/30/#footnote-2" id="footnote-reference-3" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;2&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;. Beim Vergleich des Diagramms im Artikel mit obiger
3D-Ansicht fällt auf (auch ein Vergleich der Azimuth/Elevationsdiagramme
in der Beschreibung von &lt;a class="reference external" href="https://github.com/schlatterbeck/plot-antenna"&gt;plot-antenna&lt;/a&gt; ist möglich) dass die &lt;a class="reference external" href="https://github.com/plotly/plotly.py"&gt;Plotly&lt;/a&gt; 3D
Ansicht leicht verzerrt ist (die Keule ist zu lang). Ich habe noch nicht
rausgefunden ob das ein Problem von &lt;a class="reference external" href="https://github.com/plotly/plotly.py"&gt;Plotly&lt;/a&gt; oder meiner Verwendung davon
ist. Ich &lt;em&gt;versuche&lt;/em&gt; das gleiche Bildseitenverhältnis für alle Richtungen
einzustellen indem ich den Wertebereich (range) für &lt;code class="docutils literal"&gt;xaxis&lt;/code&gt;,
&lt;code class="docutils literal"&gt;yaxis&lt;/code&gt; und &lt;code class="docutils literal"&gt;zaxis&lt;/code&gt; einstelle aber es schaut nicht korrekt aus.&lt;/p&gt;
&lt;p&gt;Beim Vergleich mit dem Azimuth Diagramm welches mit &lt;a class="reference external" href="https://github.com/plotly/plotly.py"&gt;Plotly&lt;/a&gt; erzeugt
wurde:&lt;/p&gt;
&lt;iframe class="iframe-embed" width="800" height="640" scrolling="no" frameborder="no" src="https://blog.runtux.com/content/2022/12-el-1deg-azimuth.html"&gt;
&lt;/iframe&gt;&lt;p&gt;sehen die Größenverhältnisse richtig aus. Auch im 2D-Diagramm wird
der Winkel (Azimuth in diesem Fall) beim Überfahren mit der Maus
sichtbar. Auch mit &lt;a class="reference external" href="https://matplotlib.org/"&gt;Matplotlib&lt;/a&gt; ist dies möglich, jedoch rastet der
Cursor nicht auf den jeweiligen Punkt auf der Anzeige ein. Damit kann
mit &lt;a class="reference external" href="https://matplotlib.org/"&gt;Matplotlib&lt;/a&gt; nur geraten werden ob sich der Cursor an der korrekten
Stelle befindet. Weiters kann wie bei der 3D-Grafik die Frequenz für die
Anzeige rechts in der Legende ausgewählt werden. Diesmal ist die
gleichzeitige Anzeige von mehreren Frequenzen möglich, was bei einer
opaken 3D-Ansicht nicht sehr sinnvoll wäre.&lt;/p&gt;
&lt;aside class="footnote-list brackets"&gt;
&lt;aside class="footnote brackets" id="footnote-1" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class="backrefs"&gt;(&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/10/30/#footnote-reference-1"&gt;1&lt;/a&gt;,&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/10/30/#footnote-reference-2"&gt;2&lt;/a&gt;)&lt;/span&gt;
&lt;p&gt;J. C. Logan and J. W. Rockway. The new MININEC (version 3): A
mini-numerical electromagnetic code. Technical Report NOSC TD
938, Naval Ocean Systems Center (NOSC), San Diego, California,
September 1986.  Available as &lt;a class="reference external" href="https://apps.dtic.mil/sti/pdfs/ADA181682.pdf"&gt;ADA181682&lt;/a&gt; from the Defense
Technical Information Center. Note: The scan of that report is
very bad. If you have access to a better version, please make it
available!&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-2" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/10/30/#footnote-reference-3"&gt;2&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;L. B. Cebik. Radiation plots: Polar or rectangular; log or linear.
In Antenna Modeling Notes &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/10/30/#footnote-3" id="footnote-reference-4" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;3&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;, chapter 48, pages 366–379. Available
in Cebik's &lt;a class="reference external" href="http://on5au.be/content/amod/amod48.html"&gt;Antenna modelling notes episode 48&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-3" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/10/30/#footnote-reference-4"&gt;3&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;L. B. Cebik. Antenna Modeling Notes, volume 2. antenneX Online
Magazine, 2003. Available with antenna models from the &lt;a class="reference external" href="http://on5au.be/Books/allmodnotes.zip"&gt;Cebik
collection&lt;/a&gt;.&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;</description><category>documentation</category><category>german</category><category>hamradio</category><category>hardware</category><category>open source</category><guid>https://blog.runtux.com/de/posts/2022/10/30/</guid><pubDate>Sun, 30 Oct 2022 12:50:00 GMT</pubDate></item><item><title>Optimierung mit Epsilon-Randbedingungen</title><link>https://blog.runtux.com/de/posts/2022/08/29/</link><dc:creator>Ralf Schlatterbeck</dc:creator><description>&lt;p&gt;[Änderung 2022-10-18: Ersetze epsilon durch delta in der Beschreibung
von Beispiel 7 in pgapack]&lt;/p&gt;
&lt;p&gt;Viele Optimierungsprobleme beinhalten Randbedingungen die von gültigen
Lösungen erfüllt sein müssen. Ein
&lt;a class="reference internal" href="https://blog.runtux.com/de/posts/2022/08/29/#optimierungsproblem-mit-randbedingungen"&gt;Optimierungsproblem mit Randbedingungen&lt;/a&gt; wird typischerweise als
nichtlineares Programmierungs-Problem formuliert &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-1" id="footnote-reference-1" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div class="math" id="optimierungsproblem-mit-randbedingungen"&gt;
\begin{align*}
\hbox{Minimiere}   \; &amp;amp; f_i(\vec{x}),            &amp;amp; i &amp;amp;= 1, \ldots, I \\
\hbox{Unter den Bedingungen} \;
                      &amp;amp; g_j(\vec{x}) \le 0,      &amp;amp; j &amp;amp;= 1, \ldots, J \\
                     &amp;amp; h_k(\vec{x}) = 0,        &amp;amp; k &amp;amp;= 1, \ldots, K \\
                     &amp;amp; x_m^l \le x_m \le x_m^u, &amp;amp; m &amp;amp;= 1, \ldots, M \\
\end{align*}
&lt;/div&gt;
&lt;p&gt;In diesem Problem gibt es &lt;span class="math"&gt;\(n\)&lt;/span&gt; Variablen (der Vektor
&lt;span class="math"&gt;\(\vec{x}\)&lt;/span&gt; hat die Länge &lt;span class="math"&gt;\(n\)&lt;/span&gt;), &lt;span class="math"&gt;\(J\)&lt;/span&gt; Ungleich-Bedingungen,
&lt;span class="math"&gt;\(K\)&lt;/span&gt; Gleichheits-Bedingungen und die Variable &lt;span class="math"&gt;\(x_m\)&lt;/span&gt; muss im
Bereich &lt;span class="math"&gt;\(|x_m^l, x_m^u|\)&lt;/span&gt; sein (als Box-Bedingung bezeichnet). Die
Funktionen &lt;span class="math"&gt;\(f_i\)&lt;/span&gt; heissen Zielfunktionen. Probleme mit mehreren
Zielfunktionen habe ich schon früher in diesem Blog &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-2" id="footnote-reference-2" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;2&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; beschrieben.
Im folgenden werde ich einige Begriffe ohne weitere Erklärung verwenden
die in diesem früheren Blogbeitrag eingeführt wurden.&lt;/p&gt;
&lt;p&gt;Die Zielfunktionen werden nicht notwendigerweise minimiert (wie in der
Formel angegeben) sondern können auch maximiert werden wenn das Problem
dies verlangt. Die Ungleich-Bedingungen werden auch oft mit einem
&lt;span class="math"&gt;\(\ge\)&lt;/span&gt; Zeichen formuliert, die Formal kann einfach umgestellt
werden (z.B. durch Multiplikation mit -1) um ein &lt;span class="math"&gt;\(\le\)&lt;/span&gt; Zeichen zu
verwenden.&lt;/p&gt;
&lt;p&gt;Nachdem es recht schwer ist, Gleichheits-Bedingungen zu erfüllen,
besonders wenn diese in nichtlinearen Funktionen der Eingabevariablen
auftreten, werden Gleichheits-Bedingungen oft in Ungleich-Bedingungen
umgewandelt unter Verwendung einer δ‑Umgebung:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
-\delta \le h_k(\vec{x}) \le \delta
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Wobei δ so gewählt wird dass die Lösung gut genug für das zu
lösende Problem ist.&lt;/p&gt;
&lt;p&gt;Eine sehr erfolgreiche Methode zur Lösung von Problemen mit
Randbedingungen verwendet eine lexicographische Ordnung von
Randbedingungen und Zielfunktion(en). Lösungskandidaten des Problems
werden zuerst nach verletzten Randbedingungen sortiert (typischerweise
der Summe der Verletzung von Randbedingungen) und dann nach dem Wert der
Zielfunktion(en) &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-1" id="footnote-reference-3" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;. Beim Vergleich von zwei Individuen während der
Selektionsphase des Genetischen Algorithmus gibt es drei Fälle: Wenn
beide Individuen die Randbedingungen verletzen gewinnt das Individuum
mit der kleineren Verletzung der Bedingungen. Wenn ein Individuum keine
Bedingung verletzt, das andere aber schon, gewinnt das Individuum ohne
Verletzung von Randbedingungen. Im letzten Fall dass keines der
Individuen die Bedingungen verletzt, findet ein normaler Vergleich der
Zielfunktionen statt (was vom verwendeten Algorithmus abhängt und ob
maximiert oder minimiert wird). Diese Methode, ursprünglich von Deb &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-1" id="footnote-reference-4" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;
vorgeschlagen ist in &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapack"&gt;PGAPack&lt;/a&gt; und im Python Wrapper &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapy"&gt;PGAPy&lt;/a&gt;
implementiert.&lt;/p&gt;
&lt;p&gt;Mit diesem Algorithmus zur Behandlung von Randbedingungen, werden zuerst
Lösungskandidaten gefunden die keine Randbedingung verletzen bevor der
Algorithmus die Zielfunktionen überhaupt "anschaut". Daher passiert es
dann oft, dass die Suche in einer Region endet wo es keine guten
Lösungen gibt (aber dafür keine Randbedingungen verletzt sind).
Schwierige Probleme, bei welchen dies auftritt, sind oft Probleme mit
Gleichheits-Bedingungen aber es gibt auch andere "schwierige"
Randbedingungen. In einem früheren Blog Post &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-2" id="footnote-reference-5" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;2&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; zur
Antennen-Optimierung habe ich geschrieben: "dass der
Optimierungs-Algorithmus Schwierigkeiten hat, überhaupt sinnvolle
Lösungen für die Direktor-Variante zu finden. Nur bei einer handvoll
Experimente war es überhaupt möglich, die obige Pareto-Front zu finden."&lt;/p&gt;
&lt;p&gt;In diesem Experiment habe ich 50 Optimierungsläufe durchgeführt und nur
5 davon sind &lt;em&gt;nicht&lt;/em&gt; in einem lokalen Optimum steckengeblieben. Etwas
ähnliches passiert bei Problem 7 in Deb's Artikel &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-1" id="footnote-reference-6" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; wo
Gleichheits-Bedingungen verwendet werden. Ich habe dieses als
&lt;a class="reference external" href="https://github.com/schlatterbeck/pgapack/blob/master/examples/deb/deb7.c"&gt;Beispiel 7&lt;/a&gt; in &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapack"&gt;PGAPack&lt;/a&gt; implementiert. Es wird nur eine Lösung nahe dem
(bekannten) Optimum gefunden wenn &lt;span class="math"&gt;\(\delta \ge 10^{-2}\)&lt;/span&gt; für
alle Gleichheits-Bedingungen ist (ich habe nicht mit verschiedenen
Anfangswerten für den Zufallszahlengenerator experimentiert, es könnte
sein dass man mit einem anderen Startwert bessere Lösungen findet). Im
Artikel &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-1" id="footnote-reference-7" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; verwendet Deb &lt;span class="math"&gt;\(\delta = 10^{-3}\)&lt;/span&gt; aus dem selben
Grund.&lt;/p&gt;
&lt;p&gt;Eine Methode, um dieses Problem zu verbessern, war attraktiv, weil sie
sowohl einfach zu verstehen als auch zu implementieren ist: Takahama und
Sakai haben zuerst mit einer Methode experimentiert um unter gelockerten
Randbedingungen in der Frühphase der Optimierung zu arbeiten, sie
nannten dies einen Genetischen Algorithmus mit α‑Randbedingungen &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-3" id="footnote-reference-8" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;3&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;. Die Methode wurde später vereinfacht und als
Optimierung mit ε‑Randbedingungen bezeichnet. Sie kann für
verschiedene Optimierungsalgorithmen verwendet werden, nicht nur für
Genetische Algorithmen und Varianten &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-4" id="footnote-reference-9" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;4&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;. Von speziellem Interesse in
diesem Zusammenhang ist die Anwendung der Methode für Differential
Evolution &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-5" id="footnote-reference-10" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;5&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;, &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-6" id="footnote-reference-11" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;6&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;, aber natürlich kann sie auch für andere Formen von
Genetischen Algorithmen verwendet werden.&lt;/p&gt;
&lt;p&gt;Das ε im Namen dieser Methode &lt;em&gt;kann&lt;/em&gt; für das δ bei der
Konversion von Gleichheits-Bedingungen in Ungleich-Bedingungen verwendet
werden, ist aber nicht auf diesen Anwendungsfall eingeschränkt.&lt;/p&gt;
&lt;p&gt;Während des Optimimierungslaufes wird in jeder Generation ein neuer Wert
für ε berechnet. Der Vergleich von Individuen wie oben skizziert
wird so modifiziert, dass ein Individuum so behandelt wird als verletze
es keine Randbedingung wenn die Verletzung der Randbedingungen kleiner
ist als ε. Wenn also beide Individuen die Randbedingungen um
mehr als ε verletzen gewinnt das Individuum mit der kleineren
Verletzung. Wenn ein Individuum die Bedingungen um weniger als ε
verletzt, das andere aber mehr, gewinnt das erste. Und schließlich wenn
die Verletzung der Randbedingungen bei beiden Individuen kleiner ist als
ε findet der normale Zielfunktions-Vergleich statt.&lt;/p&gt;
&lt;p&gt;Dieser letzte Fall ist der Schlüssel zum Erfolg des Algorithmus: Obwohl
die Suche in eine Richtung zu weniger Verletzung der Randbedingungen
fortschreitet, wird &lt;em&gt;gleichzeitig&lt;/em&gt; eine gute Lösung bezogen auf die
Zielfunktionenen gefunden.&lt;/p&gt;
&lt;p&gt;Der Algorithmus startet mit der Initialisierung von
&lt;span class="math"&gt;\(\varepsilon_0\)&lt;/span&gt; mit der Summe der Verletzung der Randbedingungen
des Individuums mit dem Index &lt;span class="math"&gt;\(\theta\)&lt;/span&gt; der nach Verletzung der
Randbedingungen sortierten initialen Population. Dabei ist
&lt;span class="math"&gt;\(\theta\)&lt;/span&gt; ein Parameter des Algorithmus zwischen 1 und der
Populationsgröße, ein guter Wert ist etwa 20% der Populationsgröße,
was auch der Standardwert in &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapack"&gt;PGAPack&lt;/a&gt; ist. In jeder Generation &lt;span class="math"&gt;\(t\)&lt;/span&gt;
wird &lt;span class="math"&gt;\(\varepsilon_t\)&lt;/span&gt; berechnet zu:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\varepsilon_t = \varepsilon_0 \left(1-\frac{t}{T_c}\right)^{cp}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;bis zur Generation &lt;span class="math"&gt;\(T_c\)&lt;/span&gt;. Nach dieser Generation wird ε
auf 0 gesetzt. Der Exponent &lt;span class="math"&gt;\(cp\)&lt;/span&gt; ist zwischen 2 und 10. Der
Artikel von 2010 &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-6" id="footnote-reference-12" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;6&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; empfiehlt zur Generation
&lt;span class="math"&gt;\(T_\lambda = 0.95 T_c\)&lt;/span&gt; den Wert &lt;span class="math"&gt;\(cp = 0.3 cp + 0.7 cp_\min\)&lt;/span&gt;
zu setzen, wobei &lt;span class="math"&gt;\(cp_\min\)&lt;/span&gt; der fixe Wert 3 ist. Der Anfangswert
von &lt;span class="math"&gt;\(cp\)&lt;/span&gt; wird so gewählt dass zur Generation &lt;span class="math"&gt;\(T_\lambda\)&lt;/span&gt;
&lt;span class="math"&gt;\(\varepsilon_\lambda=10^{-5}\)&lt;/span&gt; ist ausser &lt;span class="math"&gt;\(cp\)&lt;/span&gt; wäre kleiner,
dann wird es auf &lt;span class="math"&gt;\(cp_\min\)&lt;/span&gt; gesetzt. &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapack"&gt;PGAPack&lt;/a&gt; implementiert diese
Empfehlung für &lt;span class="math"&gt;\(cp\)&lt;/span&gt; als Standard-Einstellung, erlaubt aber das
Setzen von &lt;span class="math"&gt;\(cp\)&lt;/span&gt; zu Beginn und während der Laufzeit der
Optimierung. Es ist also einfach möglich, andere Änderungen von
&lt;span class="math"&gt;\(cp\)&lt;/span&gt; zu implementieren – die Standard-Einstellung funktioniert
jedoch recht gut.&lt;/p&gt;
&lt;p&gt;Durch Optimierung mit ε Randbedingungen konnten in meinen
Experimenten die Gleichheits-Bedingungen in Beispiel 7 von Deb &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-1" id="footnote-reference-13" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; mit
einer Genauigkeit von &lt;span class="math"&gt;\(10^{-6}\)&lt;/span&gt; approximiert werden, siehe die
Variable &lt;code class="docutils literal"&gt;epsilon_generation&lt;/code&gt; im &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapack/blob/master/examples/deb/optimize.c"&gt;optimizer Beispiel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Wird der &lt;a class="reference external" href="https://github.com/schlatterbeck/antenna-optimizer"&gt;antenna-optimizer&lt;/a&gt; mit ε‑generation 50 gestartet
(das ist der &lt;span class="math"&gt;\(T_c\)&lt;/span&gt; aus obigem Algorithmus) bleibt der Algorithmus
nur in einem einzigen Fall im lokalen Optimum stecken, alle anderen
Fälle finden gute Lösungen:&lt;/p&gt;
&lt;iframe class="iframe-embed" width="640" height="480" scrolling="no" frameborder="no" src="https://blog.runtux.com/content/2022/plot-50.html"&gt;
&lt;/iframe&gt;&lt;p&gt;In dieser Grafik sind alle Lösungen von einem Optimierungslauf die von
den Lösungen eines anderen Laufs dominiert werden in Schwarz
eingezeichnet. Wir sehen dass die Daten von Lauf 16 keine
nicht-dominierte Lösung beigetragen haben (auf der rechten Seite in der
Legende fehlt die Nummer 16). In der Grafik kann man die dominierten
Lösungen aus der Anzeige nehmen indem man auf den schwarzen Kreis in der
Legende klickt.&lt;/p&gt;
&lt;p&gt;Wenn der Parameter ε‑generation für den Lauf der im lokalen
Optimum geendet hat auf 60 erhöht wird, findet auch der Lauf mit
Zufallszahlen-Startwert 16 eine Lösung:&lt;/p&gt;
&lt;iframe class="iframe-embed" width="640" height="480" scrolling="no" frameborder="no" src="https://blog.runtux.com/content/2022/plot-50+60.html"&gt;
&lt;/iframe&gt;&lt;p&gt;Es ist auch sichtbar dass die Lösungen für alle Experimente ziemlich gut
(weil nahe an der Pareto-Front) sind. Der schwarze "Schatten" der
dominierten Lösungen ist ziemlich nahe an der wirklichen Pareto-Front
und ist gut genug um mit einem einzigen Optimierungslauf ausreichend
gute Lösungen zu finden.&lt;/p&gt;
&lt;aside class="footnote-list brackets"&gt;
&lt;aside class="footnote brackets" id="footnote-1" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class="backrefs"&gt;(&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-reference-1"&gt;1&lt;/a&gt;,&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-reference-3"&gt;2&lt;/a&gt;,&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-reference-4"&gt;3&lt;/a&gt;,&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-reference-6"&gt;4&lt;/a&gt;,&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-reference-7"&gt;5&lt;/a&gt;,&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-reference-13"&gt;6&lt;/a&gt;)&lt;/span&gt;
&lt;p&gt;Kalyanmoy Deb. An efficient constraint handling method for
genetic algorithms. Computer Methods in Applied Mechanics and
Engineering, 186(2–4):311–338, June 2000.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-2" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;2&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class="backrefs"&gt;(&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-reference-2"&gt;1&lt;/a&gt;,&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-reference-5"&gt;2&lt;/a&gt;)&lt;/span&gt;
&lt;p&gt;Ralf Schlatterbeck. &lt;a class="reference external" href="https://blog.runtux.com/posts/2021/12/27/"&gt;Multi-objective antenna optimization&lt;/a&gt;.
Blog post, Open Source Consulting, December 2021.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-3" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-reference-8"&gt;3&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Tetsuyuki Takahama and Setsuko Sakai. Constrained optimization
by α constrained genetic algorithm (αGA). Systems
and Computers in Japan, 35(5):11–22, May 2004.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-4" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-reference-9"&gt;4&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Tetsuyuki Takahama and Setsuko Sakai. Constrained optimization
by ε constrained particle swarm optimizer with ε‑level control. In Abraham et al., editors, Soft Computing as
Transdisciplinary Science and Technology, volume 29 of Advances
in Soft Computing, pages 1019–1029. Springer, 2005.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-5" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-reference-10"&gt;5&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Tetsuyuki Takahama and Setsuko Sakai. Constrained optimization by
the ε constrained differential evolution with gradient-based
mutation and feasible elites. In IEEE International Conference on
Evolutionary Computation (CEC). Vancouver, BC, Canada, July 2006.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-6" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;6&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class="backrefs"&gt;(&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-reference-11"&gt;1&lt;/a&gt;,&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/08/29/#footnote-reference-12"&gt;2&lt;/a&gt;)&lt;/span&gt;
&lt;p&gt;Tetsuyuki Takahama and Setsuko Sakai. Constrained optimization by
the ε constrained differential evolution with an archive and
gradient-based mutation. In IEEE Congress on Evolutionary Computation
(CEC), Barcelona, Spain, July 2010.&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;</description><category>documentation</category><category>genetic algorithms</category><category>german</category><category>hamradio</category><category>hardware</category><category>open source</category><category>optimization</category><guid>https://blog.runtux.com/de/posts/2022/08/29/</guid><pubDate>Mon, 29 Aug 2022 16:00:00 GMT</pubDate></item><item><title>Impedanzanpassung mit einem Coax-Kabel der selben Impedanz?</title><link>https://blog.runtux.com/de/posts/2022/05/30/</link><dc:creator>Ralf Schlatterbeck</dc:creator><description>&lt;p&gt;Vor kurzem waren in der deutschen Zeitschrift "Funkamateur" zwei Artikel
wo der Autor behauptet hat, es sei möglich, ein besseres
Stehwellenverhältnis (SWV) mit Hilfe eines 50Ω Kabels zu
erreichen.&lt;/p&gt;
&lt;p&gt;Der erste Artikel beschrieb eine Duoband-Antenne für die 70cm und 2m
Amateurfunkbänder &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/05/30/#footnote-1" id="footnote-reference-1" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;. Der Artikel erwähnte nebenbei dass das SWV
durch eine spezifische Länge von 50Ω Kabel verbessert werden
könne und enthielt einen Link zu einer Software des selben Autors um
diese Länge zu berechnen (es wurde behauptet dass verschiedene Längen
von Kabel für den zu erreichenden Zweck möglich seien). Die Behauptung
war, es fände eine Leitungstransformation durch das 50Ω Kabel
statt.&lt;/p&gt;
&lt;p&gt;Im zweiten Artikel – ausgelöst von mehreren Lesern die Leserbriefe
geschrieben hatten – lieferte der Autor Messergebnisse die klar
zeigten dass, in der Tat, das SWV durch eine bestimmte Kabellänge
verbessert wurde &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/05/30/#footnote-2" id="footnote-reference-2" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;2&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nun sagt die Leitungstheorie dass eine Impedanztransformation mit
Änderung des Stehwellenverhältnisses nur mit einer Leitung einer
&lt;em&gt;anderen&lt;/em&gt; Impedanz als der Systemimpedanz erreicht werden kann, siehe
auch meinen &lt;a class="reference external" href="https://blog.runtux.com/de/posts/2021/10/28/"&gt;kürzlich erschienenen Artikel&lt;/a&gt; zu diesem Thema.
Es muss also einen anderen Grund geben, warum sich die Impedanz ändert
– wie klar von den Messungen des Autors gezeigt wurde. Der Autor
meint in seinem Artikel dass es wohl eine Diskrepanz zwischen Theorie
und Praxis gäbe – ich zeige im folgenden dass es eine ganz gute
Erklärung für die Beobachtungen gibt ohne die existierende
elektromagnetische Theorie über Bord zu werfen.&lt;/p&gt;
&lt;p&gt;Der Hinweis hier ist, dass der Autor keinen Balun oder einen anderen
Mechanismus zur Unterdrückung von Mantelwellen auf der Zuleitung
verwendet hat. Also habe ich mir den Spaß gemacht, die Verhältnisse mit
dem Antennen-Simulationsprogramm NEC2 zu simulieren. Die Resultate
sollten mit einem anderen Modellierungsprogramm reproduzierbar sein,
zumindest wenn dieses einen NEC Kern (z.B. EZNEC) enthält der auch ein
Bodenmodell enthält und nicht nur im Freiraum simulieren kann. Ich habe die
(einfache Zwei-Elemente) Antenne aus dem Original-Artikel modelliert.&lt;/p&gt;
&lt;p&gt;Die folgende Grafik zeigt das Stehwellenverhältnis (SWV) und den Real-
und Imaginäranteil der Impedanz direkt an der Antenne. Das &lt;a class="reference external" href="https://blog.runtux.com/content/2022/an-der-antenne.nec"&gt;erste NEC
input file&lt;/a&gt; kann verwendet werden um die Resultate zu reproduzieren.
Ich habe das Sommerfeld/Norton Bodenmodell mit einer mittleren
Bodenqualität verwendet. Die Antenne ist 15m über dem Boden in diesem
Modell weil sie zur Befestigung auf einem Balkon vorgesehen ist.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;img alt="/images/an-der-antenne.png" src="https://blog.runtux.com/images/an-der-antenne.png"&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Das nächste Bild zeigt die selbe Antenne mit einem Stück Speiseleitung
(die Länge ist die von der der Autor behauptet sie würde das SWV
verbessern). Die Speiseleitung ist nicht als Draht modelliert, sondern
als Übertragungsleitung (für die bietet NEC eine eigene Abstraktion).
Wieder zeigen wir Real- und Imaginärteil der Impedanz. Die elektrische
Länge (NEC verwendet bei Übertragungsleitungen die elektrische Länge
ohne Verkürzungsfaktor) ist etwa 1.81m berechnet mit der Formel aus &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/05/30/#footnote-1" id="footnote-reference-3" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;
mit einem Verkürzungsfaktor von 1. Es ist klar ersichtlich, dass sich
zwar die Impedanz ändert aber das SWV gleich bleibt. Das
korrespondierende &lt;a class="reference external" href="https://blog.runtux.com/content/2022/mit-speiseleitung.nec"&gt;zweite NEC input file&lt;/a&gt; kann auch hier verwendet
werden um die Resultate zu reproduzieren.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;img alt="/images/mit-speiseleitung.png" src="https://blog.runtux.com/images/mit-speiseleitung.png"&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Um nun die Verhältnisse am Speisepunkt zu simulieren wenn es keinen
Balun gibt habe ich einen Draht zwischen der Antenne und dem Speisepunkt
am Ende des Kabels im &lt;a class="reference external" href="https://blog.runtux.com/content/2022/mit-mantelwelle.nec"&gt;dritten NEC input file&lt;/a&gt; modelliert. Das folgende
Bild zeigt das Modell, wir haben einen zusätzlichen Draht der die
&lt;em&gt;Aussenseite&lt;/em&gt; der Coax-Speiseleitung darstellt. Dieser Draht ist
verbunden mit der Antenne auf der einen Seite und dem Ende des
Coaxkabels auf der anderen Seite. Die Länge des Kabels ist die
&lt;em&gt;physikalische Länge&lt;/em&gt;. Ausser einer geringfügigen Erhöhung der
elektrischen Länge wegen der Isolation (nicht mit dem üblichen Coax
Verkürzungsfaktor, wir simulieren ja nur das äussere Drahtgeflecht!)
muss der Draht im Modell die echte physische Länge des Coax
wie mit der Formel aus dem ersten Artikel berechnet &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/05/30/#footnote-1" id="footnote-reference-4" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; verwenden. Wir
verwenden 1.484m aus &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/05/30/#footnote-1" id="footnote-reference-5" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;, Tabelle 3 für ein Aircell5 mit dem Faktor
n=1 aus der Tabelle im Artikel. Wir sehen dass sich in der Tat, wie im
zweiten Artikel &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/05/30/#footnote-2" id="footnote-reference-6" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;2&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; beobachtet, das Stehwellenverhältnis SWV
verkleinert hat. Der Grund ist dass, wegen des fehlenden Balun, sich die
Antenne geändert hat: Der Aussenmantel der Coax-Speiseleitung ist &lt;em&gt;Teil
der Antenne&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;img alt="/images/mit-mantelwelle.png" src="https://blog.runtux.com/images/mit-mantelwelle.png"&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Wenn man sich die Antenne mit dem Linux-Programm xnec2c ansieht,
bemerkt man die Ströme auf der Aussenseite der Speiseleitung. Wir können
klar sehen, &lt;em&gt;dass&lt;/em&gt; da ein Strom auf der Speiseleitung fließt (die
Speiseleitung in dem Bild ist der lange Teil rechts, parallel dazu liegt
die modellierte Übertragungsleitung zur Speisung).&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;img alt="/images/mit-mantelwelle-antenne.png" src="https://blog.runtux.com/images/mit-mantelwelle-antenne.png"&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Also ist die elektromagnetische Theorie gerettet, es gibt eine
physikalische Erklärung des Phänomens. Trotzdem wäre es noch interessant
die verschiedenen Einflüsse von Höhe über Grund oder unterschiedliche
Bodencharacteristika zu modellieren – um herauszufinden wie
reproduzierbar die Ergebnisse mit unterschiedlichen Parametern sind ,
weil der Autor ja behauptet das beobachtete Verhalten sei "seit Jahren
bekannt" (&lt;a class="brackets" href="https://blog.runtux.com/de/posts/2022/05/30/#footnote-2" id="footnote-reference-7" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;2&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; S. 35).&lt;/p&gt;
&lt;aside class="footnote-list brackets"&gt;
&lt;aside class="footnote brackets" id="footnote-1" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class="backrefs"&gt;(&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/05/30/#footnote-reference-1"&gt;1&lt;/a&gt;,&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/05/30/#footnote-reference-3"&gt;2&lt;/a&gt;,&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/05/30/#footnote-reference-4"&gt;3&lt;/a&gt;,&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/05/30/#footnote-reference-5"&gt;4&lt;/a&gt;)&lt;/span&gt;
&lt;p&gt;Klaus Warsow. Duoband-Fensterantenne für das 2-m- und 70-cm-Band.
Funkamateur, (9):712–714, September 2021.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-2" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;2&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class="backrefs"&gt;(&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/05/30/#footnote-reference-2"&gt;1&lt;/a&gt;,&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/05/30/#footnote-reference-6"&gt;2&lt;/a&gt;,&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2022/05/30/#footnote-reference-7"&gt;3&lt;/a&gt;)&lt;/span&gt;
&lt;p&gt;Klaus Warsow. Impendanzanpassung mithilfe von Koaxialkabeln.
Funkamateur, (1):35–37, Januar 2022.&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;</description><category>documentation</category><category>german</category><category>hamradio</category><category>hardware</category><guid>https://blog.runtux.com/de/posts/2022/05/30/</guid><pubDate>Mon, 30 May 2022 20:22:00 GMT</pubDate></item><item><title>Antennen Optimierung mit mehreren Kriterien</title><link>https://blog.runtux.com/de/posts/2021/12/27/</link><dc:creator>Ralf Schlatterbeck</dc:creator><description>&lt;p&gt;Seit einiger Zeit optimiere ich Antennen mit Genetischen Algorithmen.
Ich verwende dafür das Paket für parallele Genetische Algorithmen,
&lt;a class="reference external" href="https://github.com/schlatterbeck/pgapack"&gt;pgapack&lt;/a&gt; das ursprünglich von David Levine vom Argonne National
Laboratory entwickelt wurde und das ich pflege (wie übersetze ich
"maintain"?). Noch länger als die Pflege von &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapack"&gt;pgapack&lt;/a&gt; entwickle ich
eine &lt;a class="reference external" href="https://python.org"&gt;Python&lt;/a&gt; Bibliothek für &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapack"&gt;pgapack&lt;/a&gt; namens &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapy"&gt;pgapy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Für die Antennensimulation verwende ich Tim Molteno's &lt;a class="reference external" href="https://github.com/tmolteno/python-necpp"&gt;PyNEC&lt;/a&gt; Paket, eine
Bibliothek in &lt;a class="reference external" href="https://python.org"&gt;Python&lt;/a&gt; für ein Paket zur elektromagnetischen Simulation
namens "Numerical Electromagnetics Code (NEC) Version 2", geschrieben in
C++ (auch bekannt als NEC++).&lt;/p&gt;
&lt;p&gt;Mit diesen Paketen habe ich ein kleines Open Source Framework für die
Antennen-Optimierung namens &lt;a class="reference external" href="https://github.com/schlatterbeck/antenna-optimizer"&gt;antenna-optimizer&lt;/a&gt; geschrieben. Dieses
kann traditionelle Genetische Algorithmen mit Bit-Strings als Genen als
auch Fließkomma-Repräsentationen mit dafür geeigneten Operatoren
verwenden.&lt;/p&gt;
&lt;p&gt;Das "Parallel" in &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapack"&gt;pgapack&lt;/a&gt; sagt uns, dass die Evaluierungsfunktion des
Genetischen Algorithmus parallelisiert werden kann. Bei der Optimierung
von Antennen simulieren wir für jede Paramter-Kombination die einen
Antenne darstellt diese mit &lt;a class="reference external" href="https://github.com/tmolteno/python-necpp"&gt;PyNEC&lt;/a&gt;. Antennensimulation ist nach wie vor
(der ursprüngliche NEC Code ist aus den 80er Jahren und wurde im
Zeitalter von Lochkarten entwickelt) ein CPU-instensives Unterfangen.
So ist es eine gute Nachricht, dass wir mit &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapack"&gt;pgapack&lt;/a&gt; viele Simulationen
parallel mit dem Message Passing Interface (MPI) Standard &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2021/12/27/#footnote-1" id="footnote-reference-1" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;
durchführen können.&lt;/p&gt;
&lt;p&gt;Für &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapack"&gt;pgapack&lt;/a&gt; – und damit auch für &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapy"&gt;pgapy&lt;/a&gt; – habe ich in letzter
Zeit einige bewährte klassische Algorithmen implementiert:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Differential Evolution &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2021/12/27/#footnote-2" id="footnote-reference-2" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;2&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;, &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2021/12/27/#footnote-3" id="footnote-reference-3" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;3&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;, &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2021/12/27/#footnote-4" id="footnote-reference-4" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;4&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; ist ein erfolgreicher
Optimierungs-Algorithmus für Fließkomma-Gene der für
elektromagnetische Aufgaben sehr interessant ist.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Der "elitist Nondominated Sorting Genetic Algorithm" NSGA-II &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2021/12/27/#footnote-5" id="footnote-reference-5" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;5&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;
erlaubt es in einem einzigen Optimierungslauf mehrere Zielfunktionen
zu optimieren&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wir können Wertebeschränkungen im Zielbereich einer Funktion
definieren die minimiert werden, sogenannte "Constraints" &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2021/12/27/#footnote-6" id="footnote-reference-6" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;6&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;. Damit
eine Lösung gültig ist, müssen alle Constraints 0 oder negativ sein.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Traditionell ist mit Genetischen Algorithmen nur eine
Evaluierungsfunktion, die sogenannte Zielfunktion möglich. Mit NSGA-II
können mehrere Zielfunktionen oder Kriterien verwendet werden. Das
Englische nennt solche Algorithmen "Multi-Objective Optimization"
(Optimierung mehrerer Ziele).&lt;/p&gt;
&lt;p&gt;Für die Antennensimulation heisst dass, wir müssen nicht mehrere
Kriterien für eine gute Antenne wie Gewinn, Vorwärts/Rückwärtsverhältnis
und Stehwellenverhältnis (SWV) in einer einzigen Evaluierungsfunktion
zusammenfassen, was ich bisher im &lt;a class="reference external" href="https://github.com/schlatterbeck/antenna-optimizer"&gt;antenna-optimizer&lt;/a&gt; gemacht habe,
sondern können sie separat definieren und dem Genetischen Algorithmus
die Optimierung überlassen.&lt;/p&gt;
&lt;p&gt;Mit mehreren Zielfunktionen ist es allerdings typischerweise so, dass
die Verbesserung bei einem Ziel eine Verschlechterung bei einem anderen
Ziel zur Folge hat und umgekehrt. Wir suchen also Lösungen die strikt
besser sind als andere Lösungen. Eine Lösung &lt;em&gt;dominiert&lt;/em&gt; eine andere
Lösung wenn sie in einem Kriterium &lt;em&gt;besser&lt;/em&gt; aber in keinem der anderen
Kriterien &lt;em&gt;schlechter&lt;/em&gt; ist als die andere Lösung. Alle Lösungen die
dieser Definition entsprechen heissen &lt;a class="reference external" href="https://de.wikipedia.org/wiki/Pareto-Optimum"&gt;Pareto-Optimal&lt;/a&gt; nach dem
Italienischen Wissenschaftler &lt;a class="reference external" href="https://de.wikipedia.org/wiki/Vilfredo_Pareto"&gt;Vilfredo Pareto&lt;/a&gt; der das Konzept von
Pareto-Optimalität zuerst definiert hat. Alle Lösungen die dieses
Optimalitäts-Kriterium erfüllen, liegen auf einer sogenannten
&lt;em&gt;Pareto-Front&lt;/em&gt;. Wenn wir nur zwei Zielfunktionen haben, können wir die
Pareto-Front gut mit einem Scatterplot (Streudiagramm) darstellen, wie
wir weiter unten sehen werden.&lt;/p&gt;
&lt;p&gt;Weil &lt;a class="reference external" href="https://github.com/schlatterbeck/pgapack"&gt;pgapack&lt;/a&gt; einen Ansatz verfolgt, der die freie Kombination von
Algorithmen unterstützt, können wir verschiedene erfolgreiche Strategien
für unterschiedliche Teile des Genetischen Algorithmus kombinieren:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Für den Mutation/Crossover Teil können wir Differential Evolution (DE)
verwenden&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DE wiederum kann für mehrere Zielfunktionen mit der (Generations-)
Ersetzungsstrategie von NSGA-II kombiniert werden&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wir können einige der Zielfunktionen als Beschränkungen (Constraints)
definieren. Für unser Problem ist es sinnvoll nur Antennen zu erlauben
die ein bestimmtes Stehwellenverhältnis (SWV) nicht überschreiten. Wir
erlauben also keine Antenne mit einem SWV &amp;gt; 1.8. Die zugehörige
Zielfunktion ist &lt;span class="math"&gt;\(S - 1.8 \le 0\)&lt;/span&gt; wobei &lt;span class="math"&gt;\(S\)&lt;/span&gt; das SWV ist.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mit dieser Kombination können wir erfolgreich Antennen für das 70cm
Amaterufunkband (430 MHz - 440 MHz) berechnen. Die Antenne verwendet
einen sogenannten Faltdipol (das Ding mit den Rundungen in der Grafik)
und ein gerades Element. Die Messlinien in der Grafik repräsentieren die
vom Genetischen Algorithmus optimierten Längen. Die zwei Punkte in der
Mitte des Faltdipols zeigen den Punkt wo die Speiseleitung angeschlossen
wird.&lt;/p&gt;
&lt;img alt="/images/2ele.png" src="https://blog.runtux.com/images/2ele.png"&gt;
&lt;p&gt;Ein erstes Beispiel simuliert Antennenparameter für die höchste,
niedrigste und mittlere Frequenz. Der Gewinn und das
Vorwärts/Rückwärtsverhältnis (Forward/Backward ratio in der Grafik)
werden nur für die mittlere Frequenz berechnet:&lt;/p&gt;
&lt;img alt="/images/twoele-v1.png" src="https://blog.runtux.com/images/twoele-v1.png"&gt;
&lt;p&gt;In dieser Grafik (ein Scatterplot) wird die erste Zielfunktion (der
Gewinn) gegen die zweite Zielfunktion, das Vorwärts/Rückwärtsverhältnis
aufgetragen. Alle Zahlen sind für die mittlere Frequenz. Jeder Punkt in
der Grafik repräsentiert eine Antenne. Alle Antennen haben ein SWV
kleiner als 1.8 auf der kleinsten, mittleren und höchsten Frequenz.&lt;/p&gt;
&lt;p&gt;Nach diesem Erfolg habe ich dann angefangen, mit unterschiedlichen
Einstellungen für die Parameter des Differential Evolution (DE) Algorithmus
zu experimentieren. Es ist in der Literatur zu DE bekannt dass
für "zerlegbare" (decomposable) Probleme eine niedrige Crossover-Rate
besser ist, für nicht-zerlegbare eine höhere. Ein zerlegbares Problem
zeichnet sich dadurch aus, dass die unterschiedlichen Dimensionen
getrennt voneinander optimierbar sind, dies wurde zuerst von Salomon
1996 &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2021/12/27/#footnote-7" id="footnote-reference-7" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;7&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; beobachtet. Ursprünglich hatte ich eine Crossover-Rate von 0.2
eingestellt und meine Hoffnung war, dass die Optimierung mit einer
höheren Rate besser und schneller funktionieren würde. Das Experiment
unten verwendet eine Crossover-Rate von 0.9.&lt;/p&gt;
&lt;p&gt;Zusätzlich habe ich mit "Dither" für den Skalierungsfaktor &lt;span class="math"&gt;\(F\)&lt;/span&gt; von
Differential Evolution (könnte vielleicht mit einem leichten "Zittern"
Skalierung übersetzen) experimentiert. Mit diesem Faktor wird die
Differenz von zwei Vektoren der Input-Parameter bei der Anwendung von DE
multipliziert. In der ersten Implementierung hatte ich &lt;em&gt;Dither&lt;/em&gt; auf 0
gesetzt, jetzt hatte ich 0.2 eingestellt. Ich war dann sehr überrascht
dass ich mit diesen Einstellungen eine neue Pareto-Front als Lösung
gefunden habe:&lt;/p&gt;
&lt;img alt="/images/twoele-v2.png" src="https://blog.runtux.com/images/twoele-v2.png"&gt;
&lt;p&gt;Damit man besser sieht, dass die zweite Front komplett die zuerst
gefundene Front dominiert habe ich beide in einer Grafik geplottet:&lt;/p&gt;
&lt;img alt="/images/twoele-v3.png" src="https://blog.runtux.com/images/twoele-v3.png"&gt;
&lt;p&gt;Weil diese zweite Front (über den gesamten Frequenzbereich) für eine
Zwei-Elemente Antenne zu gut ausschaut um wahr zu sein schauen wir uns
das im Folgenden genauer an. Zuerst schauen wir auf die Orientierung der
Antenne und des berechneten Gewinn-Diagramms für eine der Antennen in
der Mitte der unteren Front:&lt;/p&gt;
&lt;img alt="/images/middle-lower-antenna.png" src="https://blog.runtux.com/images/middle-lower-antenna.png" style="width: 45%;"&gt;
&lt;img alt="/images/middle-lower-pattern.png" src="https://blog.runtux.com/images/middle-lower-pattern.png" style="width: 45%;"&gt;
&lt;p&gt;Die Antenne hat – wie schon aus der ersten Pareto-Front Grafik zu
entnehmen – einen Gewinn von etwa 6.6 dBi und ein
Vorwärts/Rückwärtsverhältnis von etwa 11 dB in der Mitte des Bandes
bei 435 MHz. Die Einfärbung der Antenne deutet die Ströme in der
Antennenstruktur an.
Wer sich das selbst anschauen möchte: Hier ist ein Link zur
&lt;a class="reference external" href="https://blog.runtux.com/content/2021/middle-lower.nec"&gt;NEC Input Datei für Antenne 1&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Vergleichen wir diese Antenne mit einer aus der Mitte der "orangen
Front" wo wir deutlich bessere Ergebnisse bekommen:&lt;/p&gt;
&lt;img alt="/images/middle-higher-antenna.png" src="https://blog.runtux.com/images/middle-higher-antenna.png" style="width: 45%;"&gt;
&lt;img alt="/images/middle-higher-pattern.png" src="https://blog.runtux.com/images/middle-higher-pattern.png" style="width: 45%;"&gt;
&lt;p&gt;Diese Antenne ist aus der Mitte der oberen Pareto-Front und hat einen
Gewinn von etwa 6.7 dBi sowie ein Vorwärts/Rückwärtsverhältnis von
etwa 16 dB in der Mitte des Bandes bei 435 MHz. Wer entdeckt den
Unterschied zur vorherigen Antenne? Ja: der maximale Gewinn liegt in der
Gegenrichtung der ersten Antenne. Wir sagen dass bei der ersten Antenne
das gerade Element ein &lt;em&gt;Reflektor&lt;/em&gt; ist, während bei der zweiten Antenne
das gerade Element als &lt;em&gt;Direktor&lt;/em&gt; arbeitet.
Auch hier ist ein Link zur &lt;a class="reference external" href="https://blog.runtux.com/content/2021/middle-higher.nec"&gt;NEC Input Datei für Antenne 2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nun schauen wir uns über die ganze Frequenz den Gewinn und das
Vorwärts/Rückwärtsverhältnis an. Die linke Grafik ist für die erste
Antenne (die mit dem &lt;em&gt;Reflektor&lt;/em&gt;-Element), die rechte für die zweite
Antenne wo das gerade Element als &lt;em&gt;Direktor&lt;/em&gt; arbeitet.&lt;/p&gt;
&lt;img alt="/images/middle-lower-fplot.png" src="https://blog.runtux.com/images/middle-lower-fplot.png" style="width: 45%;"&gt;
&lt;img alt="/images/middle-higher-fplot.png" src="https://blog.runtux.com/images/middle-higher-fplot.png" style="width: 45%;"&gt;
&lt;p&gt;Wir sehen dass sich das Vorwärts/Rückwärtsverhältnis bei der &lt;em&gt;Direktor&lt;/em&gt;
Antenne von etwas mehr als 10 dB bis zu über 25 dB bewegt,
während es für das &lt;em&gt;Reflektor&lt;/em&gt;-Design von 9.3 dB bis 11.75 dB
geht. Der Minimalgewinn ist beim Reflektor-Design etwas besser
(6.35-6.85 dBi bzw. 6.3-7.05 dBi). Also brauchen wir weitere
Experimente. Wenn man die Lösungen auf ein &lt;em&gt;Reflektor&lt;/em&gt;-Design beschränkt
und fordert dass der &lt;em&gt;Minimalgewinn&lt;/em&gt; und das &lt;em&gt;minimale&lt;/em&gt;
Vorwärts/Rückwärtsverhältnis an den drei Stellen (untere, mittlere,
obere Frequenz) genommen wird bekommen wir:&lt;/p&gt;
&lt;img alt="/images/twoele-reflector.png" src="https://blog.runtux.com/images/twoele-reflector.png"&gt;
&lt;p&gt;Für das gleiche bei einem &lt;em&gt;Direktor&lt;/em&gt; Design (auch mit &lt;em&gt;minimalem&lt;/em&gt; Gewinn
und Vorwärts/Rückwärtsverhältnis bei allen drei Frequenzen (untere,
mittlere, obere Frequenz) bekommen wir:&lt;/p&gt;
&lt;img alt="/images/twoele-director.png" src="https://blog.runtux.com/images/twoele-director.png"&gt;
&lt;p&gt;Mit diesen Resultaten ist der &lt;a class="reference external" href="https://de.wikipedia.org/wiki/Sweet_Spot"&gt;Sweet Spot&lt;/a&gt; für eine Antenne die man
wirklich bauen will wahrscheinlich bei etwa 10 dB
Vorwärts/Rückwärtsverhältnis oder darüber und bei einem Gewinn von etwa
6.2 dBi. Ein paar zehntel-dB mehr Gewinn rauszuholen und dabei
mehrere dB Vorwärts/Rückwärtsverhältnis zu verlieren scheint nicht sehr
sinnvoll. Beim Vergleich des Direktor mit dem Reflektor-Design fällt auf
(was zumindest &lt;em&gt;meiner&lt;/em&gt; Intuition widerspricht) dass das Direktor-Design
ein besseres Vorwärts/Rückwärtsverhältnis über den gesamten
Frequenzbereich hat. Wenn allerdings die Antenne für
Relais-Kommunikation Verwendung finden soll wo die Sendefrequenz (die
Relais-Eingabe) im unteren Teil des Frequenzbandes liegt und die
Relais-Ausgabe (unsere Empfangsfrequenz) in der oberen Hälfte, würden
wir vermutlich ein &lt;em&gt;Reflektor&lt;/em&gt;-Design realisieren weil der Gewinn beim
Senden besser ist und das Vorwärts/Rückwärtsverhältnis beim Empfang
besser ist (vergleiche die beiden vorherigen Grafiken zu Gewinn und
Vorwärts/Rückwärtsverhältnis).&lt;/p&gt;
&lt;p&gt;Man beachte auch, dass der Optimierungs-Algorithmus Schwierigkeiten hat,
überhaupt sinnvolle Lösungen für die Direktor-Variante zu finden. Nur bei
einer handvoll Experimente war es überhaupt möglich, die obige
Pareto-Front zu finden. Das Direktor-Design ist schmalbandiger als das
Reflektor-Design und da das Stehwellenverhältnis ein Beschränkung
(Constraint) ist, werden oft nur lokale Optima gefunden. Der größere
Unterschied im Wertebereich von Gewinn- und Vorwärts/Rückwärtsverhältnis
für das Direktor Design sagt uns ausserdem dass es schwieriger zu
realisieren sein wird: Wenn die Dimensionen nicht exakt richtig
getroffen werden wird die Antenne wohl weiter von den vorhergesagten
Simulationsergebnissen abweichen. Das Reflektor-Design ist etwas
toleranter in dieser Beziehung.&lt;/p&gt;
&lt;aside class="footnote-list brackets"&gt;
&lt;aside class="footnote brackets" id="footnote-1" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2021/12/27/#footnote-reference-1"&gt;1&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;MPI: A message-passing interface standard, version 4.0.
Standard, &lt;a class="reference external" href="https://www.mpi-forum.org/"&gt;Message Passing Interface Forum&lt;/a&gt;, June 2021.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-2" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2021/12/27/#footnote-reference-2"&gt;2&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Rainer Storn and Kenneth Price. Differential evolution – a simple
and efficient adaptive scheme for global optimization over
continuous spaces. Technical Report TR-95-012, International
Computer Science Institute (ICSI), March 1995.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-3" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2021/12/27/#footnote-reference-3"&gt;3&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Rainer Storn and Kenneth Price. Differential evolution – a simple
and efficient heuristic for global optimization over continuous spaces.
Journal of Global Optimization, 11(4):341–359, December 1997.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-4" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2021/12/27/#footnote-reference-4"&gt;4&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Kenneth V. Price, Rainer M. Storn, and Jouni A. Lampinen.
Differential Evolution: A Practical Approach to Global
Optimization.  Springer, Berlin, Heidelberg, 2005.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-5" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2021/12/27/#footnote-reference-5"&gt;5&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Kalyanmoy Deb, Amrit Pratap, Sameer Agarwal, and T. Meyarivan.
A fast and elitist multiobjective genetic algorithm: NSGA-II.
IEEE Transactions on Evolutionary Computation, 6(2):182–197,
April 2002.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-6" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2021/12/27/#footnote-reference-6"&gt;6&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Kalyanmoy Deb. An efficient constraint handling method for genetic
algorithms. Computer Methods in Applied Mechanics and Engineering,
186(2–4):311–338, June 2000.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-7" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2021/12/27/#footnote-reference-7"&gt;7&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Ralf Salomon. Re-evaluating genetic algorithm performance under
coordinate rotation of benchmark functions. a survey of some
theoretical and practical aspects of genetic algorithms.
Biosystems, 39(3):263–278, 1996.&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;</description><category>documentation</category><category>genetic algorithms</category><category>german</category><category>hamradio</category><category>hardware</category><category>howto</category><category>open source</category><category>optimization</category><guid>https://blog.runtux.com/de/posts/2021/12/27/</guid><pubDate>Mon, 27 Dec 2021 17:05:00 GMT</pubDate></item><item><title>Impedanztransformation auf einer Übertragungsleitung</title><link>https://blog.runtux.com/de/posts/2021/10/28/</link><dc:creator>Ralf Schlatterbeck</dc:creator><description>&lt;p&gt;Als Funkamateur ist man hin und wieder mit der Herausforderung
konfrontiert, eine Antenne an einen Transceiver über eine
Übertragungsleitung anzuschließen. Oft ist dabei die Impedanz der
Antenne unterschiedlich von der Impedanz der Übertragungsleitung und des
Transceivers. Die Impedanz von Transceiver und einer typischen Coax
Übertragungsleitung ist üblicherweise 50Ω im Amateurfunkbereich.
Die Impendanz der Antenne ist je nach technischen und Gegebenheiten und
Umgebungseinflüssen unterschiedlich.&lt;/p&gt;
&lt;p&gt;Eine Übertragungsleitung transformiert je nach Länge die Impedanz der
Antenne. Eine gut bekannte Formel wird z.B. von Chipman
&lt;a class="brackets" href="https://blog.runtux.com/de/posts/2021/10/28/#footnote-1" id="footnote-reference-1" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; S.134 Formel 7.15 angegeben:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\frac{Z_d}{Z_0} =
\frac{e^{\gamma d}(Z_l/Z_0 + 1) + e^{-\gamma d}(Z_l/Z_0 - 1)}
     {e^{\gamma d}(Z_l/Z_0 + 1) - e^{-\gamma d}(Z_l/Z_0 - 1)}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;In dieser Formel ist &lt;span class="math"&gt;\(Z_d\)&lt;/span&gt; die Impedanz in einem Abstand von der
Last &lt;span class="math"&gt;\(d\)&lt;/span&gt; zur Antenne, &lt;span class="math"&gt;\(Z_l\)&lt;/span&gt; ist die Impedanz an der Last
(also der Antenne) und &lt;span class="math"&gt;\(Z_0\)&lt;/span&gt; ist die characteristische Impedanz
der Übertragungsleitung und des Transceivers, typischerweise 50Ω.
&lt;span class="math"&gt;\(\gamma\)&lt;/span&gt; ist der komplexe Übertragungskoeffizient, diesen kann man
in den Real- und den Imaginärteil aufteilen, wobei dann &lt;span class="math"&gt;\(\alpha\)&lt;/span&gt;
die Dämpfung in Neper/m und &lt;span class="math"&gt;\(\beta\)&lt;/span&gt; die Phasenkonstante ist,
&lt;span class="math"&gt;\(j\)&lt;/span&gt; ist die imaginäre Einheit (oft auch als &lt;span class="math"&gt;\(i\)&lt;/span&gt; geschrieben
aber in der Elektrotechnik meist als &lt;span class="math"&gt;\(j\)&lt;/span&gt;):&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\gamma = \alpha + j \cdot \beta
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Es wird manchmal behauptet, dass ein Kabel das Stehwellenverhältnis am
Transceiver verbessern kann, weil es die Impedanz transformiert. Dies
stimmt aber nur dann, wenn die characteristische Impedanz des Kabels
&lt;em&gt;unterschiedlich&lt;/em&gt; von der Impedanz des Transceivers ist (wenn wir
annehmen dass das Kabel verlustfrei ist was in vielen Fällen von kurzen
Kabeln gilt) was ich im folgenden zeigen werde.&lt;/p&gt;
&lt;p&gt;Im verlustfreien Fall ist &lt;span class="math"&gt;\(\alpha\)&lt;/span&gt; in der obigen Formel 0. Wir
können &lt;span class="math"&gt;\(\beta\)&lt;/span&gt; über die Frequenz und schließlich über die
Wellenlänge &lt;span class="math"&gt;\(\lambda\)&lt;/span&gt; ausdrücken:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\beta = \frac{2\pi f}{c * \mathbb{VF}}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;und:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\lambda = \frac{c}{f}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Die Frequenz &lt;span class="math"&gt;\(f\)&lt;/span&gt; ist in Hz, &lt;span class="math"&gt;\(c\)&lt;/span&gt; ist die Lichtgeschwindigkeit
und &lt;span class="math"&gt;\(\mathbb{VF}\)&lt;/span&gt; der Verkürzungsfaktor (im Englischen velocity
factor) der Übertragungsleitung. Wenn wir die Entfernung von der Last
&lt;span class="math"&gt;\(d\)&lt;/span&gt; in Chipman's Formal als Vielfaches von &lt;span class="math"&gt;\(\lambda\)&lt;/span&gt;,
&lt;span class="math"&gt;\(l_\lambda\)&lt;/span&gt; ausdrücken, kürzen sich &lt;span class="math"&gt;\(f\)&lt;/span&gt;, &lt;span class="math"&gt;\(c\)&lt;/span&gt; und
&lt;span class="math"&gt;\(\mathbb{VF}\)&lt;/span&gt;, und wir bekommen für den verlustfreien Fall:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\frac{Z_d}{Z_0} =
\frac{ e^{ 2\pi l_\lambda j}(Z_l/Z_0 + 1)
     + e^{-2\pi l_\lambda j}(Z_l/Z_0 - 1)
     }
     { e^{ 2\pi l_\lambda j}(Z_l/Z_0 + 1)
     - e^{-2\pi l_\lambda j}(Z_l/Z_0 - 1)
     }
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Der komplexe Reflexionskoeffizient &lt;span class="math"&gt;\(\rho\)&lt;/span&gt; ist (siehe z.B. bei
Chipman &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2021/10/28/#footnote-1" id="footnote-reference-2" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; 7.9 S.128):&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\rho = \frac{Z - Z_0}{Z + Z_0}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;wobei &lt;span class="math"&gt;\(Z\)&lt;/span&gt; die Impedanz am Punkt der Leitung ist wo wir den
Reflexionskoeffizienten wissen wollen. Daraus können wir das
Stehwellenverhältnis berechnen (vgl. z.B. Chipman &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2021/10/28/#footnote-1" id="footnote-reference-3" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; 8.21 S.165) das
ich hier mit &lt;span class="math"&gt;\(S\)&lt;/span&gt; bezeichne:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
S = \frac{1+|\rho|}{1-|\rho|}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Ein einfaches &lt;a class="reference external" href="https://www.python.org"&gt;Python&lt;/a&gt; Programm (Python ist angenehm für solche
Berechnungen weil es komplexe Zahlen unterstützt und freie Software
ist) um obiges zu berechnen könnte wie folgt aussehen:&lt;/p&gt;
&lt;pre class="literal-block"&gt;from math import e, pi
def impedance (z_load, l_lambda, z0 = 50.0):
    zl = z_load / z0
    ex = 2j * pi * l_lambda
    lp = e **  (ex) * (zl + 1)
    lm = e ** (-ex) * (zl - 1)
    return z0 * (lp + lm) / (lp - lm)

def vswr (z, z0 = 50.0):
    absrho = abs ((z - z0) / (z + z0))
    return (1 + absrho) / (1 - absrho)&lt;/pre&gt;
&lt;p&gt;Wenn wir das nun für einige Punkte berechnen, z.B. für eine Antenne mit
72Ω und für einige Vielfache von &lt;span class="math"&gt;\(\lambda\)&lt;/span&gt; bekommen wir
immer den selben Wert für das Stehwellenverhältnis:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th class="head"&gt;&lt;p&gt;&lt;span class="math"&gt;\(l_{\lambda}\)&lt;/span&gt;&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;&lt;span class="math"&gt;\(Z_d\)&lt;/span&gt;&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;&lt;span class="math"&gt;\(S\)&lt;/span&gt;&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;0&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;72+0j&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1.44&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;1/8&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;46.85-17.46j&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1.44&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;3/8&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;46.85+17.46j&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1.44&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;1/4&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;34.72-1.59j&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1.44&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;1/2&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;72+0j&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1.44&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Zu beweisen dass das Stehwellenverhältnis &lt;em&gt;immer&lt;/em&gt; gleich ist, egal wie
lang die Übertragungsleitung ist, wird an dieser Stelle als Hausaufgabe
für den Leser gelassen. Ein Hinweise: Es genügt zu zeigen dass der
Absolutbetrag von &lt;span class="math"&gt;\(\rho\)&lt;/span&gt; gleich bleibt.&lt;/p&gt;
&lt;p&gt;Der interessantere Fall ist aber nun, wenn wir Kabelverluste mit
einbeziehen. Ich habe ein Stück Software geschrieben, das das Verhalten
einer Coax Leitung aus den Herstellerangaben berechnen kann, eine Idee
die schon vor langer Zeit von Frank Witt, AI1H &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2021/10/28/#footnote-2" id="footnote-reference-4" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;2&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; publiziert wurde.
Die Implementierung ist Teil meines Open Source &lt;a class="reference external" href="https://github.com/schlatterbeck/antenna-optimizer"&gt;antenna-optimizer&lt;/a&gt;
Projekts. und beinhaltet ein kleines Programm namens &lt;code class="docutils literal"&gt;coaxmodel&lt;/code&gt;.
Mit diesem kann die Impedanz (und Stehwellenverhältnis) für ein echtes
Kabel berechnet werden. Die Implementierung enthält schon die Modelle
einiger Kabel aber es ist recht einfach, neue dazuzugeben (siehe am Ende
von &lt;code class="docutils literal"&gt;coaxmodel.py&lt;/code&gt;). Zusätzlich kann man damit auch Anpassungen mit
Hilfe einer Stichleitung berechnen: Wenn man ein Stück
Übertragungsleitung parallel zur Speiseleitung in einem bestimmten
Abstand zur Last anschließt (dieses Stück heisst dann Stichleitung)
transformiert sich die Impedanz auf eine Weise dass der Generator (der
Transceiver) eine Last von 50Ω sieht. Für obiges Beispiel würde
es z.B. berechnen (Nur ein Teil der Ausgabe ist hier wiedergegeben,
probieren Sie es selbst):&lt;/p&gt;
&lt;pre class="literal-block"&gt;% coaxmodel -z 72 -f 435e6 -l .057 match
0.06 m at 435.00 MHz with 100 W applied
           Load impedance 72.000 +0.000j Ω
          Input impedance 46.857 -17.433j Ω
             VSWR at load 1.440
            VSWR at input 1.439
Inductive stub with open circuit at end:
            Stub attached 0.06246 m from load
              Stub length 0.20224 m
      Resulting impedance 50.00 -0.00j&lt;/pre&gt;
&lt;p&gt;Das verrät uns dass ein 5.7cm Stück Übertragungsleitung die 72Ω Impedanz an der Last (Antenne) in eine 46.86-17.43jΩ Impedanz
am Eingang der Übertragungsleitung transformiert. Es wird auch klar dass
sich das Stehwellenverhältnis durch Kabelverluste ganz leicht verbessert hat
und dass man diesen Unterschied bei dieser Länge des Kabels
vernachlässigen kann.&lt;/p&gt;
&lt;p&gt;Wenn man nun eine 20.2cm Stichleitung von 50Ω mit einem offenen
Ende parallel zur Speiseleitung im Abstand von 6.2cm von der Last
anschließt, wird die Impedanz auf 50Ω transformiert mit einem
Stehwellenverhältnis von 1:1.&lt;/p&gt;
&lt;aside class="footnote-list brackets"&gt;
&lt;aside class="footnote brackets" id="footnote-1" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class="backrefs"&gt;(&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2021/10/28/#footnote-reference-1"&gt;1&lt;/a&gt;,&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2021/10/28/#footnote-reference-2"&gt;2&lt;/a&gt;,&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2021/10/28/#footnote-reference-3"&gt;3&lt;/a&gt;)&lt;/span&gt;
&lt;p&gt;Robert A. Chipman. Theory and Problems of Transmission Lines.
Schaums Outline. McGraw-Hill, 1968.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-2" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2021/10/28/#footnote-reference-4"&gt;2&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Frank Witt. Transmission line properties from manufacturer’s
data. In Straw &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2021/10/28/#footnote-3" id="footnote-reference-5" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;3&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;, pages 179–183.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-3" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2021/10/28/#footnote-reference-5"&gt;3&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;R. Dean Straw, editor. The ARRL Antenna Compendium, volume 6.
American Radio Relay League (ARRL), 1999.&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;</description><category>documentation</category><category>german</category><category>hardware</category><category>howto</category><category>open source</category><guid>https://blog.runtux.com/de/posts/2021/10/28/</guid><pubDate>Thu, 28 Oct 2021 10:00:00 GMT</pubDate></item><item><title>Q-Faktor eines Coax Resonators</title><link>https://blog.runtux.com/de/posts/2021/10/11/</link><dc:creator>Ralf Schlatterbeck</dc:creator><description>&lt;p&gt;[Edit 2021-10-25 Tippfehler gefixt, Danke Peter!]&lt;/p&gt;
&lt;p&gt;Als ich vor kurzem Übertragungsleitungen für mein &lt;a class="reference external" href="https://github.com/schlatterbeck/antenna-optimizer"&gt;antenna-optimizer&lt;/a&gt;
Projekt studiert habe, bin ich über eine Formel für den Q-Faktor eines
Coax-Resonators von Frank Witt &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2021/10/11/#footnote-1" id="footnote-reference-1" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; gestolpert:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\frac{2.774 F_0}{A \cdot \mathbb{VF}}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;In dieser Formel ist &lt;span class="math"&gt;\(F_0\)&lt;/span&gt; die Frequenz des Resonators in MHz,
&lt;span class="math"&gt;\(A\)&lt;/span&gt; is der Verlust in
dB pro 100 ft, und VF ist der velocity factor (oder auf Deutsch
"Verkürzungsfaktor") des Kabels. Die Formel war für einen
&lt;span class="math"&gt;\(\frac{\lambda}{4}\)&lt;/span&gt; Resonator angegeben. Ich habe mich über die
Formel gewundert, weil ich dachte dass ein logarithmischer Wert für den
Verlust eine Exponentiation bei der Berechnung des Q-Faktors erfordern
sollte.&lt;/p&gt;
&lt;p&gt;Wenn wir bei Wikipedia die &lt;a class="reference external" href="https://de.wikipedia.org/wiki/G%C3%BCtefaktor"&gt;Definition der Güte eines Schwingkreises&lt;/a&gt;
nachschlagen bekommen wir:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
2 \pi \frac{E_s}{E_d}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Wobei &lt;span class="math"&gt;\(E_s\)&lt;/span&gt; die gespeicherte Energie ist und &lt;span class="math"&gt;\(E_d\)&lt;/span&gt; die
während der Schwingung als Wärme verbrauchte Energie.&lt;/p&gt;
&lt;p&gt;Wir wissen, dass der Verlustfaktor eines Kabels in dB Leistungsverluste
definiert. Wenn der Verlust in dB pro 100m (wir verwenden natürlich
metrische Einheiten) &lt;span class="math"&gt;\(a\)&lt;/span&gt; ist, haben wir für den Verlust in dB:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\frac{a \cdot l}{100}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Wobei &lt;span class="math"&gt;\(l\)&lt;/span&gt; die Länge in Meter ist. Für einen &lt;span class="math"&gt;\(\frac{\lambda}{4}\)&lt;/span&gt;
Resonator bekommen wir:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\frac{a \cdot \mathbb{VF}\lambda}{4\cdot 100}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Um die Verlustleistung als Faktor zu bekommen (statt in dB) bekommen
wir:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
1 - 10^{-\frac{a \cdot \mathbb{VF}\lambda}
              {4 \cdot 100 \cdot 10}}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Wir setzen&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\lambda = \frac{c}{f_0}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;in die Formel ein, wobei &lt;span class="math"&gt;\(c\)&lt;/span&gt; die Lichtgeschwindigkeit ist und
&lt;span class="math"&gt;\(f_0\)&lt;/span&gt; die Resonanzfrequenz in Hz:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
1 - 10^{-\frac{a \cdot c\cdot\mathbb{VF}}
              {4 \cdot 100\cdot 10\cdot f_0}}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Zurück zur Wikipedia-Formel die ja Energien benötigt müssten wir hier
integrieren – aber weil beim Integrieren eines Verhältnisses wieder
das selbe Verhältnis rauskommt machen wir so eine Art vereinfachende
Integration wo wir uns nur überlegen müssen wie lang die von der
Energie zurückgelegte Distanz ist. Die Wikipedia-Definition behandelt
eine volle Periode, also &lt;span class="math"&gt;\(\lambda\)&lt;/span&gt;, nicht
&lt;span class="math"&gt;\(\frac{\lambda}{4}\)&lt;/span&gt;. Und der Q-Faktor ist das Verhältnis von
gespeicherter zu verlorener Energie. Wir haben also:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
Q = \frac{2\pi}{1 - 10^{-\frac{a \cdot c\cdot\mathbb{VF}}{1000\cdot f_0}}}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Wie wir sehen ist das &lt;span class="math"&gt;\(Q\)&lt;/span&gt; des Resonators unabhängig vom
Resonator-Typ, sei es ein &lt;span class="math"&gt;\(\frac{\lambda}{4}\)&lt;/span&gt; oder
&lt;span class="math"&gt;\(\frac{\lambda}{2}\)&lt;/span&gt; Resonator.&lt;/p&gt;
&lt;p&gt;Wenn wir Q-Faktoren für einige Kurzwellen-Frequenzen (in der Grafik sind
die Frequenzen in MHz) gegen Verluste in dB auftragen, sehen wir dass
obige Formel recht nahe bei der Näherungsformel von Witt &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2021/10/11/#footnote-1" id="footnote-reference-2" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; ist.&lt;/p&gt;
&lt;img alt="/images/coaxq_by_loss.png" src="https://blog.runtux.com/images/coaxq_by_loss.png"&gt;
&lt;p&gt;Plotten wir den Q-Faktor gegen die Frequenz (auch im Kurzwellen-Bereich)
für typische Kabel, sehen wir auch dass der Fehler nicht sehr hoch ist,
jedenfalls bei höheren Frequenzen.&lt;/p&gt;
&lt;img alt="/images/coaxq_by_frq.png" src="https://blog.runtux.com/images/coaxq_by_frq.png"&gt;
&lt;p&gt;Den relativen Fehler können wir auch darstellen, wieder für typische Kabel
über den gesamten Kurzwellenbereich. Wir sehen, dass der Fehler recht
hoch ist für niedrige Frequenzen und verlustreiche Kabel wie RG174.&lt;/p&gt;
&lt;img alt="/images/coaxq_relative_error.png" src="https://blog.runtux.com/images/coaxq_relative_error.png"&gt;
&lt;p&gt;Wir sehen also dass Witts Formel vermutlich eine Approximation ist, die
recht gut für hohe Frequenzen und niedrige Verluste funktioniert.
Die Frage ist aber offen: Woher kommt die Formel und woher kommt die
magische Konstante die vermutlich alle physischen Konstanten in der
Formel zusammenfasst?&lt;/p&gt;
&lt;p&gt;Beim Studium von Übertragungsleitungen bin ich auch über ein älteres
Buch gestolpert, das mal ein Universitäts-Lehrbuch war &lt;a class="brackets" href="https://blog.runtux.com/de/posts/2021/10/11/#footnote-2" id="footnote-reference-3" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;2&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;. Auf S. 222
leitet Chipman eine Näherungsformel für &lt;span class="math"&gt;\(Q\)&lt;/span&gt; her, die als vereinfachende
Annahme ein niedriges &lt;span class="math"&gt;\(\alpha\)&lt;/span&gt; (den Dämpfungskoeffizienten in
Neper) voraussetzt. Chipman's Näherungsformel ist:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
Q \approx\frac{\beta_r}{2\alpha_r}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Hier ist &lt;span class="math"&gt;\(\alpha\)&lt;/span&gt; der Dämpfungskoeffizient in Neper/m und
&lt;span class="math"&gt;\(\beta\)&lt;/span&gt; ist der Phasenfaktor in Radians pro Meter.
Das Subscript &lt;span class="math"&gt;\(r\)&lt;/span&gt; steht für &lt;em&gt;Resonanz&lt;/em&gt;. Wir schreiben:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\lambda=\frac{c\mathbb{VF}}{f_0}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;und&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
\beta_r=\frac{2\pi}{\lambda}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;und Witts Verlust &lt;span class="math"&gt;\(A\)&lt;/span&gt; pro 100 ft können wir auch schreiben (wir
konvertieren Neper zu dB) als:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
A=\frac{20\cdot 100\alpha_r}{3.2808\cdot log_e 10}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Wobei die Konstante 3.2808 der Konversionsfaktor m/ft ist.
Lösen wir für &lt;span class="math"&gt;\(\alpha_r\)&lt;/span&gt; und ersetzen &lt;span class="math"&gt;\(\lambda\)&lt;/span&gt; und
&lt;span class="math"&gt;\(\alpha_r\)&lt;/span&gt; in Chipman's Formel bekommen wir:&lt;/p&gt;
&lt;div class="math"&gt;
\begin{equation*}
Q \approx\frac{2\cdot 2000\pi f_0}
               {2 c \mathbb{VF}\cdot A \cdot 3.2808\cdot log_e 10}
  \approx\frac{2.774 F_0}{A \mathbb{VF}}
\end{equation*}
&lt;/div&gt;
&lt;p&gt;Wobei das &lt;span class="math"&gt;\(F_0\)&lt;/span&gt; die Frequenz &lt;span class="math"&gt;\(f_0\)&lt;/span&gt; in MHz ist.&lt;/p&gt;
&lt;p&gt;Wir sehen dass die Annahme von niedrigem &lt;span class="math"&gt;\(\alpha\)&lt;/span&gt; in Chipman's (und
Witt's) Formel für höhere Frequenzen und niedrige Verluste zutrifft:
&lt;span class="math"&gt;\(\alpha\)&lt;/span&gt; in Neper pro Meter ist ein konstanter Faktor wenn wir es
in dB (pro 100m oder pro 100 ft) umrechnen. Dass die Näherung mit hohen
Frequenzen besser wird, liegt daran, dass Kabelverluste typischerweise mit
der Wurzel aus &lt;span class="math"&gt;\(\lambda\)&lt;/span&gt; steigen, während &lt;span class="math"&gt;\(\lambda\)&lt;/span&gt; invers
proportional mit der Frequenz sinkt. Also hat z.B. ein
&lt;span class="math"&gt;\(\frac{\lambda}{4}\)&lt;/span&gt; Resonator höhere Verluste bei niedrigen
Frequenzen.&lt;/p&gt;
&lt;aside class="footnote-list brackets"&gt;
&lt;aside class="footnote brackets" id="footnote-1" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class="backrefs"&gt;(&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2021/10/11/#footnote-reference-1"&gt;1&lt;/a&gt;,&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2021/10/11/#footnote-reference-2"&gt;2&lt;/a&gt;)&lt;/span&gt;
&lt;p&gt;Frank Witt. The coaxial resonator match. In Gerald L. (Jerry)
Hall, editor, The ARRL Antenna Compendium, volume 2, pages 110-118.
American Radio Relay League (ARRL), 1989.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-2" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="https://blog.runtux.com/de/posts/2021/10/11/#footnote-reference-3"&gt;2&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Robert A. Chipman. Theory and Problems of Transmission Lines.
Schaums Outline. McGraw-Hill, 1968.&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;</description><category>documentation</category><category>german</category><category>hamradio</category><category>hardware</category><guid>https://blog.runtux.com/de/posts/2021/10/11/</guid><pubDate>Mon, 11 Oct 2021 08:30:00 GMT</pubDate></item></channel></rss>