Andreas Lindig: Ich brauche mathematische Hilfe

Hallo Forum,

ich habe eine schöne Entdeckung gemacht, um weiche Farbreihen zu mischen. Nun fehlt mir der mathematische Sachverstand, das Verfahren zu verallgemeinern.

Ich beschreibe zunächst mal Beispielhaft das Verfahren.

  • zwei Zahlen sind zu verbinden, z.B. 0xFF mit 0x00. Die Reihe soll z.B. 5 Zahlen insgesamt haben. Wir nennen die Zahlen mal a4, a3, a2, a1, a0. Die äußeren Zahlen sind wie gesagt vorgegeben:

  • a4 = 0xFF;

  • a0 = 0x00;

so geht's:

  • a3 = (a4 - a0)/4.Wurzel_aus_2
  • a2 = (a3 - a0)/3.Wurzel_aus_2
  • a1 = (a2 - a0)/2.Wurzel_aus_2

wie man sieht, errechnet sich die nächste Zahl immer mitHilfe der zuvor ermittelten. Soweit fein. Jetzt kann ich die Abstufung aber genauer/glatter hinkriegen, wenn ich eine längere Reihe berechne, und daraus nur jedes n-te Element nehme. Ich kann z.B. 9 Elemente berechnen und nur jedes zweite nehmen:

  • a8 = 0xFF;

  • a0 = 0x00;

  • a7 = (a8 - a0)/8.Wurzel_aus_2

  • a6 = (a7 - a0)/7.Wurzel_aus_2

  • ...

  • a1 = (a2 - a0)/2.Wurzel_aus_2

Ich nehme davon: a8, a6, a4, a2, a0, also jedes zweite Element.
Diese Reihe ließe sich aber auch vergrößern, z.B. auf 17 Elemente und ich nehme davon nur jedes vierte. Und dieses Spiel könnte man bis ins Unedliche fortsetzen... Das Ergebnis für die resultierende 5-er Reihe wird immer glatter. Ich schließe daraus, daß es so eine Art Grenzwert gibt, dem sich die ensprechenden Zahlen mit zunehmender Reihenlänge annähern.

Die Frage ist nun: wie kann ich allgemeingültig von einem Element zum nächsten kommen bzw. von den vorgegebenen Endelementen aus rechnen, ohne immer diese Zwischenelemente zu berechnen? Mich erinnert das irgendwie dumpf an Folgen und Reihen und Grenzwertfunktionen, aber das ist sooo lange her... ;-)

wäre nett, wenn mir da jemand auf die Sprünge helfen könnte.

Gruß, Andreas

--
SELFFORUM - hier werden Sie geholfen,
auch in Fragen zu richtiges Deutsch
  1. Hallo,

    Die Frage ist nun: wie kann ich allgemeingültig von einem Element zum nächsten kommen bzw. von den vorgegebenen Endelementen aus rechnen, ohne immer diese Zwischenelemente zu berechnen?

    Bezogen auf das Beispiel mit

    an=255 und a0=0 ergibt sich:

    ai = an / [Produkt{j=i+1 ... n} 2^(1/j)]

    In JS-Code ausgedrueckt:

    function a(i,n)
    {
      a=255;
      for(j=i+1;j<=n;j++)a/=Math.pow(2,1/j);
      return a;
    }

    alert(a(3,4)); // 214.42858588969722 = a3 aus Bsp. 1
    alert(a(7,8)); // 233.83603101719115 = a7 aus Bsp. 2

    MfG, Thomas

    1. Hallo Thomas,

      vielen Dank für Deine Mühe, aber das ist es leider nicht. Du machst ja sowas Ähnliches, wie ich derzeit in meinem Programm schon mache: in einer Schleife immer die nächste Wurzel ziehen. Was mir dabei fehlt ist zweierlei:

      1. ich dachte, man könnte das auch mathematisch ausdrücken, also den Mehrfachvorgang umgehen.

      2. viel wichtiger: mir fehlt der Bezug zur Unendlichkeit. Ich müßte mit dieser Methode nach wie vor z.B. neun Schleifen durchlaufen und jede zweite Zahl rauspicken um am Ende 5 genauere Werte zu haben als bei 5 Durchgängen. Wenn ich es noch genauer haben will, muß ich die Schleife 100 mal, 10000 mal oder was auch immer durchlaufen. Und immer ist es eine willkürliche Festlegung. Ich will im Grunde die Zahlen errechnen, die sich ergeben, wenn ich eine unendliche Reihe berechnen würde und davon 5 Elemente in geleichem Abstand rauspicke... (5 ist jetzt immer nur ein Beispiel - können auch mal 12 oder 32 sein).

      hoffe, daß ich mich verständlich ausdrücke. Stell Dir das so ähnlich vor, wie so eine einfache Grenzwertfunktion:

      f(x) = 1/x;

      Da kann man mit x immer weiter hoch gehen, und die Kurve ereicht nie die f(x)-Achse, aber den Grenzwert 0 für f(x) kann man trozdem errechnen.

      Gruß, Andreas

      --
      SELFFORUM - hier werden Sie geholfen,
      auch in Fragen zu richtiges Deutsch
      1. Hallo,

        1. ich dachte, man könnte das auch mathematisch ausdrücken, also den Mehrfachvorgang umgehen.

        Ich habe das ja mathematisch ausgedrueckt und zwar in Form des Produktes der "2er-Wurzeln" im Nenner.

        1. viel wichtiger: mir fehlt der Bezug zur Unendlichkeit.

        Du kannst mit dieser Methode beliebig viele Werte zwischen 0 und 255 erhalten. Das Produkt im Nenner geht fuer j gegen unendlich ebenfalls gegen unendlich und somit ist der Grenzwert 0:

        a(1,100)     --> 13.99632261657045
        a(1,1000)    --> 2.845895280216398
        a(1,10000)   --> 0.5770416666032317
        a(1,100000)  --> 0.11696974390210046
        a(1,1000000) --> 0.023709790312033164

        Plotte mal den Graph der Funktion und ueberlege dann, welche Zwischenwerte gesucht sind.

        MfG, Thomas

        1. [Nachtrag:]

          Plotte mal den Graph der Funktion und ueberlege dann, welche Zwischenwerte gesucht sind.

          Ich habe fuer die genannte Funktion

          function a(i,n)
          {
            var a=255;
            for(j=i+1;j<=n;j++)a/=Math.pow(2,1/j);
            return a;
          }

          mal einige Tests mittels SVG umgesetzt und dieses Ergebnis erhalten:

          Es ist zu sehen, dass sich die weniger genau ermittelten Werte der mit n=1000 erhaltenen roten Kurve annaehern, d. h. die Genauigkeit der Einzelwerte mit groeßerem n bzw. j zunimmt.

          Es sollte also reichen, einen moeglichst großen Wertevorrat zu ermitteln (--> Array) und dann daraus in bestimmten Abstaenden Werte entnehmen.

          MfG, Thomas

          1. Ich habe fuer die genannte Funktion

            function a(i,n)
            {
              var a=255;
              for(j=i+1;j<=n;j++)a/=Math.pow(2,1/j);
              return a;
            }

            also, was mich an Deiner Funktion überrascht ist, daß man die Reihenfolge der Wurzelziehungen scheinbar umdrehen kann. Du ziehst ja 2^1/2, 2^1/3... Aber wenn das ein Produkt ist, sollte das gehen ;-) hmm... kann man denn das Produkt mehrerer verschiedener Wurzeln nicht zu einem Audruck zusammenfassen?

            [...bild...]

            sehr anschaulich hast Du das gemacht, dankeschön.

            Es ist zu sehen, dass sich die weniger genau ermittelten Werte der mit n=1000 erhaltenen roten Kurve annaehern, d. h. die Genauigkeit der Einzelwerte mit groeßerem n bzw. j zunimmt.

            ja. Ich hab auch mal getestet. Die relevante Abweichung (mehr als 1) wird unterschritten, wenn man ca. 80-100 Werte ermittelt.

            Es sollte also reichen, einen moeglichst großen Wertevorrat zu ermitteln (--> Array) und dann daraus in bestimmten Abstaenden Werte entnehmen.

            Ich überlege auch, es so zu machen. Blöd ist halt, daß ich dann auf einen bestimmten Wertevorrat angewiesen bin. Das Programm soll auch Eigaben entgegennehmen können die sollen eben jede Zahl zwischen 0-255 sein können. Diese Zahlen würden aber nicht alle in dem Array vorkommen... Wenn hingegen die Reihe so lang ist, daß _alle_ Zahlen von 0-255 vorkommen, werden bestimmte Zahlen mehrfach vorkommen, was bei auslesender Nutzung nicht schlimm ist, aber eine Eingabe könnte dann nicht mehr eindeutig zugeordnet werden.

            Ich dachte, das ginge mit einer Gleichung, so daß ich an jeder Stelle die Reihen neu berechnen kann, ohne großen Zeitaufwand.

            Naja, vielleicht werde ich das Programm dahingehend umstellen, daß es eben nur aus einem festen Wertevorrat schöpfen kann.

            Gruß, Andreas

            --
            SELFFORUM - hier werden Sie geholfen,
            auch in Fragen zu richtiges Deutsch
            1. Hallo,

              kann man denn das Produkt mehrerer verschiedener Wurzeln nicht zu einem Audruck zusammenfassen?

              Klar, es gibt ja Potenzgesetze:

              2^(1/2) * 2^(1/3) = 2^(5/6)
              2^(1/2) * 2^(1/3) * 2^(1/4) = 2^(13/12)

              MfG, Thomas

              1. Klar, es gibt ja Potenzgesetze:

                mann ist das lange her... ;-)

                2^(1/2) * 2^(1/3) = 2^(5/6)
                2^(1/2) * 2^(1/3) * 2^(1/4) = 2^(13/12)

                genau das meinte ich doch. Da kann ich mir immerhin das Berechnen der Zwischenwerte in der Schleife sparen. Hat mir die Rechenzeit schon mal auf ein Viertel/Fünftel verkürzt.

                Wenn ich jetzt auch noch die Brüche ohne Schleife addieren könnte... Aber das sind weder arithmetische, noch geometrische Reihen. Ob da trozdem was machbar ist? Also 1/3 + 1/4 + 1/5 ... 1/n in einem Ausdruck, ohne Hauptnenner und so?

                Gruß, Andreas

                --
                SELFFORUM - hier werden Sie geholfen,
                auch in Fragen zu richtiges Deutsch
                1. Hallo,

                  Wenn ich jetzt auch noch die Brüche ohne Schleife addieren könnte... Aber das sind weder arithmetische, noch geometrische Reihen. Ob da trozdem was machbar ist? Also 1/3 + 1/4 + 1/5 ... 1/n in einem Ausdruck, ohne Hauptnenner und so?

                  Mit einer Naeherung ist das moeglich. Es gilt:

                  Summe{i=1 ... n} 1/n ~~ ln(n) + gamma

                  mit gamma ~~ 0.57721566490153286 (Euler-Mascheroni-Konstante)

                  Fuer die Summe von 2 bis n gilt also:

                  S = ln(n) + gamma - 1

                  1/2 + 1/3 + 1/4 + 1/5 = 77/60

                  Naeherung in JS-Code ausgedrueckt:

                  S = Math.log(5) + 0.57721566490153286 - 1;

                  S : 1.1866535773356332
                  77/60 : 1.2833333333333334

                  Fuer hoehere n steigt die Genauigkeit der Naeherung.

                  MfG, Thomas

                  1. [Nachtrag:]

                    Mit der genannten Naehrung kann die oben beschriebene Funktion a(i,n) fuer groeßere n (ab ca. 100) durch a_neu(i,n) ersetzt werden (gamma und -1 heben sich auf):

                    function a(i,n)
                    {
                      var a=255;
                      for(j=i+1;j<=n;j++)a/=Math.pow(2,1/j);
                      return a;
                    }

                    function a_neu(i,n)
                    {
                      var a=255;
                      a/=Math.pow(2,Math.log(n/(i+1)));
                      return a;
                    }

                    Diese Grafik stellt beide Funktionen im Vergleich dar [SVG-Dokument].

                    MfG, Thomas

                    1. Hallo Thomas,

                      wie immer, sehr sorgfältig gemacht :-)

                      Und es funktioniert prächtig, obwohl der Geschwindigkeitsgewinn gegenüber dem Addieren der Brüche in einer Schleife nur noch so 1,5-2-fach ist. Im Mozilla noch weniger. Aber immerhin, wenn man mit jedem Klick ganze Tabellen neu mischen muß, bringt das schon was :-) Insgesamt dürfte ich jetzt gegenüber der allerersten Version die 6-10-fache Geschwindigkeit haben. Ich hab doch geahnt, daß das ohne Schleifen möglich sein muß.

                      Ich erkläre Dich hiermit zu meinem Hausmathematiker ;-)

                      Gruß, Andreas

                      --
                      SELFFORUM - hier werden Sie geholfen,
                      auch in Fragen zu richtiges Deutsch
                      1. ach ja, und DANKESCHÖN für die Hilfe. :-)

                        Gruß, Andreas

                        --
                        SELFFORUM - hier werden Sie geholfen,
                        auch in Fragen zu richtiges Deutsch
            2. 你好 Andreas,

              [...] kann man denn das Produkt mehrerer verschiedener Wurzeln nicht
              zu einem Audruck zusammenfassen?

              Ja:

              [latex]\sqrt[5]{2} * \sqrt[4]{2} * \sqrt[3]{2} * \sqrt[2]{2}[/latex]

              ist das gleiche wie

              [latex]2^{\frac{1}{5}} * 2^{\frac{1}{4}} * 2^{\frac{1}{3}} * 2^{\frac{1}{2}}[/latex]

              und das ist dasselbe wie

              [latex]2^{\frac{1}{5} + \frac{1}{4} + \frac{1}{3} + \frac{1}{2}}[/latex]

              Das zusammengefasst ergibt:

              [latex]2^{1\frac{17}{60}}[/latex]

              In einen einzigen Ausdruck kriegt man das aber nicht. Koennte sich
              aber uU trotzdem lohnen, das umzuformen, weil man dann nur eine
              Wurzel-Operation (bzw. nicht Wurzel, sondern Exponential, aber das ist
              ja das gleiche in dem Fall) macht.

              [...]

              Was moechtest du eigentlich machen? Wenn du den genaueren Einsatzzweck
              beschreibst, kann man dir eher helfen.

              再见,
               CK

              P.S.: Die LaTeX-Schreibweise ist schon fuer die Zukunft.

              --
              Mit einem Windhauch kannst du das Feuer loeschen. Mit einem Windhauch kannst du das Feuer entfachen.
              http://wwwtech.de/
              1. Hallo,

                P.S.: Die LaTeX-Schreibweise ist schon fuer die Zukunft.

                Wird diese in MathML umgesetzt?

                MfG, Thomas

                1. 你好 Thomas,

                  P.S.: Die LaTeX-Schreibweise ist schon fuer die Zukunft.

                  Wird diese in MathML umgesetzt?

                  Wahrscheinlich wahlweise in MathML oder GIF, ist aber noch nicht sicher.

                  再见,
                   CK

                  --
                  Sein oder nicht sein, das ist hier die Frage!
                  http://wwwtech.de/
              2. Was moechtest du eigentlich machen?

                mir die Langeweile vertreiben ;-)

                Wenn du den genaueren Einsatzzweck beschreibst, kann man dir eher helfen.

                es geht um das Farbprogramm, das ich hier neulich schonmal vorgestellt habe. Ich muß jetzt die Farbtabellen mischen.

                Gruß, Andreas

                --
                SELFFORUM - hier werden Sie geholfen,
                auch in Fragen zu richtiges Deutsch
  2. Hallo Andreas,

    das scheint ja wahnsinnig kompliziert zu sein, was du da machst. Ich verstehe bloß nicht den Sinn der Aktion.  *grübel*

    ich habe eine schöne Entdeckung gemacht, um weiche Farbreihen zu mischen. Nun fehlt mir der mathematische Sachverstand, das Verfahren zu verallgemeinern.

    Solche Farbreihen hätte ich entweder als arithmetische oder als geometrische Reihe angesetzt. Nehmen wir an, der Startwert u und der Endwert v sei gegeben, und die Reihe bekommt dadurch (u und v eingeschlossen) insgesamt n+1 Werte.

    Arithmetische Reihe:  a[i] = u + i*(v-u)/n
    Geometrische Reihe:   a[i] = u * (v/u)^(i/n)

    Bei der arithmetischen Reihe ist dann immer die Differenz von zwei aufeinanderfolgenden Werten konstant, sie sind also äquidistant. Solche gleichmäßig abgestuften Reihen kennen wir alle.
    Bei geometrischen Reihen ist immer das Verhältnis zweier aufeinanderfolgender Elemente konstant, man erhält damit eine logarithmische Abstufung wie z.B. bei der Tonleiter, wo zwei aufeinanderfolgende Halbtöne immer das Frequenzverhältnis 2^(1/12) haben.

    Bezogen auf deine Farbreihen würde ich beide Varianten mal ausprobieren und mir dann das rauspicken, was besser aussieht. Wobei du dich mit der geometrischen Reihe etwas schwer tun wirst, wenn der Start- oder Endwert Null ist.

    Ich würde mich freuen, von deinem Ergebnis wieder was zu lesen.
    So long,

    Martin

    1. Hallo Martin,

      das scheint ja wahnsinnig kompliziert zu sein,...

      aber geil ;-)

      Solche Farbreihen hätte ich entweder als arithmetische oder als geometrische Reihe angesetzt.

      schon probiert. Meine Reihe ist besser :-)

      Wobei du dich mit der geometrischen Reihe etwas schwer tun wirst, wenn der Start- oder Endwert Null ist.

      ebent. Bei Tönen ist das etwas anders, weil es immer eine langsamere Schwingung gibt. Bei Farben ist das im Grunde auch so, aber das kann ich in so einem 0-255 System nicht darstellen. In der Fototechnik mißt man ja auch in Blenden und eine Farbe wird immer dunkler und dunkler, aber eben nie Schwarz... Nur will ich ja keine Endlosreihen darstellen, sondern einen definierten Bereich von Punkt zu Punkt ausfüllen. Geht schon. Nur das Rechnen muß ich eben vereinfachen :-)

      Gruß, Andreas

      --
      SELFFORUM - hier werden Sie geholfen,
      auch in Fragen zu richtiges Deutsch
  3. Holladiewaldfee,

    Die Frage ist nun: wie kann ich allgemeingültig von einem Element zum nächsten kommen bzw. von den vorgegebenen Endelementen aus rechnen, ohne immer diese Zwischenelemente zu berechnen? Mich erinnert das irgendwie dumpf an Folgen und Reihen und Grenzwertfunktionen, aber das ist sooo lange her... ;-)

    Ich glaube nicht, daß das funktioniert. Das Problem ist, daß der Grenzwert ja n->inf. ist, d.h. Du teilst durch 2^(1/inf) = 2^0 = 1. Dein Algorithmus reduziert sich dann auf

    • a3 = (a4 - a0)
    • a2 = (a3 - a0)
    • a1 = (a2 - a0)

    Das geht dann zwangsläufig daneben, da für das simple Beispiel a0 = xFF, a4=xFF schon a3=x00 und damit a2=-xFF ist. So wie ich das sehe funktioniert Dein Algorithmus nur zufällig für die von Dir gewählten Startwerte. Wenn Du ihn verallgemeinern willst, mußt Du grundsätzlich über die Farbdifferenzen gehen, d.h. der untere Wert der Reihe muß immer x00 sein.

    Nimm Dir doch einfach mal das nächstbeste Mathematik-Programm (falls zur Hand) und laß Dir die Reihe plotten. Wenn Du das nicht hast, probier die Notlösung und schreib es in irgendwas anderem und trag die Punkte pixelweise in ein x-y-Koordinatensystem auf.

    Ciao,

    Harry

    --
      Irgendwann kommt die Waldfee - oder auch nicht ... (Projektphase: Keine Ahnung)
      Bis dahin:
      Ski- und Bergtouren in den Tölzer Voralpen und im Karwendel