Addition zweier Spektren

Zwei Spektren zu addieren bedeutet ihre Funktionswerte Punkt für Punkt zu aufzuaddieren. Sich daraus ergebende neue Stützstellen werden einem zunächst leeren Ergebnisspektrum angehängt. Grenzen der Ausgangsspektren bilden Grenzen für eine Reihe von Ergebnisspektren, die jeweils einen Teilbereich abdecken. Eine spätere Integration muss dann über alle Ergebnisspektren laufen, wenn sie den gesamten verfügbaren Bereich abdecken soll. Für jedes dieser Spektren kann Gleichung [*] angewandt werden..

Der Ablauf folgt Abbildung [*] mit folgenden Verrechnungsaktionen:

Verrechnungsakion 1 (Vorlauf):
Spektrum $i$ noch nicht erreicht. Siehe Abbildung [*] rechts. Wert von Spektrum $j$ wird übernommen und um 1 hochgezählt.

   Anhängen:$\displaystyle [x= x_{j} \, , \, y_{l}= y_{j_{l}} \, , \, y_{r}= y_{j_{r}} ] $

Verrechnungsakion 2 (Vorlauf):
Spektrum $j$ noch nicht erreicht. Siehe Abbildung [*] links. Wert von Spektrum $i$ wird übernommen und um 1 hochgezählt.

   Anhängen:$\displaystyle [x= x_{i} \, , \, y_{l}= y_{i_{l}} \, , \, y_{r}= y_{i_{r}} ] $

Verrechnungsakion 3 (Interpolationsbereich):
Siehe Abbildung [*]. Speziell bei der Addition kommt es hier an den Grenzen der beiden Spektren zum Bruch der Stetigkeit. Das ist der Fall wenn $i$ oder $j$ jeweils 0 sind.

$\displaystyle \begin{array}{llll}
\text{Wenn } i = 0 \text{ anhängen:}& [x= ...
...}= y_{i_{l}}+ y_{j_{l}} \, , & y_{r}= y_{i_{r}} + y_{j_{r}} ]
\end{array}
$

Verrechnungsakion 4 (Interpolationsbereich):
Siehe Abbildung [*] Auch hier kommt es an den Grenzen der beiden Spektren zum Bruch der Stetigkeit wenn $j=0$ ist. Das interpolierte Wertepaar $[ x , y ]$ des Spektrums ist dann

$\displaystyle W_{\text{int}} = ( y_{i_{r}} + \frac{y_{i+1_{l}}-y_{i_{l}}}{x_{i+1}-x_{i}} (x_{j}-x_{i}) )
$

$\displaystyle \begin{array}{llll}
\text{Wenn } j = 0 \text{ anhängen:}& [x= ...
...{int}} + y_{j_{r}} \, , & y_{r}= W_{\text{int}} + y_{j_{r}} ]
\end{array}
$

Verrechnungsakion 5 (Interpolationsbereich):
Siehe Abbildung [*] Auch hier kommt es an den Grenzen der beiden Spektren zum Bruch der Stetigkeit wenn $i=0$ ist. Das interpolierte Wertepaar $[ x , y ]$ des Spektrums ist dann

$\displaystyle W_{\text{int}} = ( y_{j_{r}} + \frac{y_{j+1_{l}}-y_{j_{l}}}{x_{j+1}-x_{j}} (x_{i}-x_{j}) )
$

$\displaystyle \begin{array}{llll}
\text{Wenn } i = 0 \text{ anhängen:}& [x=...
...{int}} + y_{i_{r}} \, , & y_{r}= W_{\text{int}} + y_{i_{r}} ]
\end{array}
$

Verrechnungsakion 6 (Nachlauf):
Spektrum $i$ bereits durchlaufen. Siehe Abbildung [*] links. Speziell bei der Addition kommt es hier zum Bruch der Stetigkeit weil $i = i_{\text{max}}$ ist. Wert von Spektrum $j$ wird übernommen und um 1 hochgezählt.
Verrechnungsakion 7 (Nachlauf):
Spektrum $j$ bereits durchlaufen. Siehe Abbildung [*] rechts. Speziell bei der Addition kommt es hier zum Bruch der Stetigkeit weil $j = j_{\text{max}}$ ist. Wert von Spektrum $i$ wird übernommen und um 1 hochgezählt.

$\displaystyle \begin{array}{l}
\text{Anhängen:} [x= x_{i} \, , \, y_{l}= y_{...
...[x= x_{i} \, , \, y_{l}= y_{i_{l}} \, , \, y_{r}= y_{i_{r}} ]
\end{array}
$

Das Ergebnis ist wieder ein Spektrum, dessen Integrale gleich der Summe entsprechender Intergrale der Ausgangsspektren ist und dessen Spektralbereich die Vereinigung der beiden Ausgangsbereiche inklusive eines eventuell vorhandenen Bereichs zwischen den Ausgangsbereichen ist.

Gehen wir davon aus, dass uns die Spektralwerte als Stützstellen in bereits sortierten Listen vorliegen. Zwei durchzumultiplizierende Spektren werden mit zwei Variablen $i$ und $j$ durchlaufen. Abbildung [*] zeigt den prinzipiellen Ablauf und die Probleme beim Addieren:

Figure: Spektren
\includegraphics[width=0.90\textwidth]{HTMLBilder/AdditionPlot.pdf}
Listing: Addition zweier Spektren in Javascript
    1 
    2  function durchhangelnadd(spek1, spek2){
    3     var s=0,i=0,j=0, arr=[];
    4     while (i < spek1.length-1 && j< spek2.length-1) {
    5         if(spek1[i]["x"]>=spek2[j+1]["x"]){
    6             arr.push({info: `Heranrücken j++ auf : i=${i}->(${spek1[i]["x"]},${spek1[i]["y"]}) und j=${j}->(${spek2[j]["x"]},${spek2[j]["y"]})`,x:spek2[j]["x"], y: spek2[j]["y"]});
    7             j++;
    8             continue;};
    9         if(i == 0 && spek1[0]["x"]>spek2[j]["x"] && spek1[0]["x"]<spek2[j+1]["x"]){
   10         }
   11         if(spek2[j]["x"]>=spek1[i+1]["x"]){
   12             arr.push({info: `Heranrücken i++ auf : i=${i}->(${spek1[i]["x"]},${spek1[i]["y"]}) und j=${j}->(${spek2[j]["x"]},${spek2[j]["y"]})`,x:spek1[i]["x"], y: spek1[i]["y"]});
   13             i++;
   14             continue;};
   15         if(spek1[i]["x"]==spek2[j]["x"]){
   16             arr.push({x:spek1[i]["x"], y: spek1[i]["y"]+spek2[j]["y"]});
   17         };
   18         if(spek1[i]["x"]< spek2[j]["x"]){
   19             arr.push({x:spek2[j]["x"], y: spek1[i]["y"]+spek2[j]["y"] + (spek1[i+1]["y"]- spek1[i]["y"]) / (spek1[i+1]["x"] - spek1[i]["x"]) * (spek2[j]["x"] - spek1[i]["x"]) });
   20                    };
   21         if(spek1[i]["x"]> spek2[j]["x"]){
   22             arr.push({x:spek1[i]["x"], y: spek1[i]["y"]+spek2[j]["y"] + + (spek2[j+1]["y"]- spek2[j]["y"]) / (spek2[j+1]["x"] - spek2[j]["x"]) * (spek1[i]["x"] - spek2[j]["x"]) });
   23         };
   24         if(spek1[i+1]["x"]==spek2[j+1]["x"]){i++; j++; continue;};
   25         if(spek1[i+1]["x"]<spek2[j+1]["x"]){i++; continue;};
   26         if(spek1[i+1]["x"]>spek2[j+1]["x"]){j++; continue;};
   27     }
   28     /*************Letztes Element************/
   29     if(i==spek1.length-1){
   30         arr.push({x:spek1[i]["x"], y: (spek2[j-1]["y"] + (spek2[j]["y"]- spek2[j-1]["y"]) / (spek2[j]["x"] - spek2[j-1]["x"]) * (spek1[i]["x"] - spek2[j-1]["x"])) + spek1[i]["y"] });
   31         j++;
   32         while (j < spek2.length) {
   33             arr.push({x:spek2[j]["x"], y: spek2[j]["y"]});
   34             j++;
   35         }
   36 
   37     }
   38     if(j==spek2.length-1){
   39         arr.push({x:spek2[j]["x"], y: (spek1[i]["y"] + (spek1[i+1]["y"]- spek1[i]["y"]) / (spek1[i+1]["x"] - spek1[i]["x"]) * (spek2[j]["x"] - spek1[i]["x"])) + spek2[j]["y"] });
   40         i++;
   41         while (i < spek1.length) {
   42             arr.push({x:spek1[i]["x"], y: spek1[i]["y"]});
   43             i++;
   44         }
   45     }
   46     return arr;
   47 }