Esempio n. 1
0
        // MMath.BesselInverse(ref double, double, double, double)
        /// <summary>
        /// Setzt den Interpolationsfaktor der Nullstelle für drei Tabellenwerte und liefert TRUE, falls die Interpolation in weniger als 100 Schritten konvergiert.
        /// </summary>
        /// <param name="p"> Interpolationsfaktor der Nullstelle.</param>
        /// <param name="yM">Funktionswert an der Stelle t-1.</param>
        /// <param name="y0">Funktionswert an der Stelle t0.</param>
        /// <param name="yP">Funktionswert an der Stelle t+1.</param>
        /// <returns>TRUE, falls die Interpolation in weniger als 100 Schritten konvergiert.</returns>
        public static bool BesselInverse(ref double p, double yM, double y0, double yP)
        {
            // Lokale Felder einrichten
            double a = y0 - yM;
            double b = yP - y0;
            double c = b - a;

            // Interpolation einrichten
            double n  = -2.0 * y0 / (a + b);
            double dN = -1.0 * (2.0 * y0 + n * (a + b + n * c)) / (a + b + 2.0 * n * c);
            double i  = 0;

            // Interpolationsschleife
            while (MMath.Abs(dN) > 0.00005)
            {
                // Zähler inkrementieren und prüfen
                i++;
                if (i > 100)
                {
                    return(false);
                }

                // Nächsten Schritt vorbereiten
                n += dN;
                dN = -1.0 * (2.0 * y0 + n * (a + b + n * c)) / (a + b + 2.0 * n * c);
            }

            // Faktor anwenden
            p = n;
            return(true);
        }
Esempio n. 2
0
        // MMath.BesselInverse(ref double, double, double, double, double, double)
        /// <summary>
        /// Setzt den Interpolationsfaktor der Nullstelle für fünf Tabellenwerte und liefert TRUE, falls die Interpolation in weniger als 100 Schritten konvergiert.
        /// </summary>
        /// <param name="p">Interpolationfaktor der Nullstelle.</param>
        /// <param name="yM2">Funktionswert an der Stelle t-2.</param>
        /// <param name="yM1">Funktionswert an der Stelle t-1.</param>
        /// <param name="y0">Funktionswert an der Stelle t0.</param>
        /// <param name="yP1">Funktionswert an der Stelle t+1.</param>
        /// <param name="yP2">Funktionswert an der Stelle t+2.</param>
        /// <returns>TRUE, falls die Interpolation in weniger als 100 Schritten konvergiert.</returns>
        public static bool BesselInverse(ref double p, double yM2, double yM1, double y0, double yP1, double yP2)
        {
            // Lokale Felder einrichten
            double a = yM1 - yM2;
            double b = y0 - yM1;
            double c = yP1 - y0;
            double d = yP2 - yP1;
            double e = b - a;
            double f = c - b;
            double g = d - c;
            double h = f - e;
            double j = g - f;
            double k = j - h;

            // Lokale Hilfsfelder einrichten
            double h1 = k / 24.0;
            double h2 = (h + j) / 12.0;
            double h3 = f / 2.0 - h1;
            double h4 = (b + c) / 2.0 - h2;

            // Interpolation einrichten
            double n  = 0.0;
            double dN = -1.0 * MMath.Polynome(n, y0, h4, h3, h2, h1) / MMath.Polynome(n, h4, 2.0 * h3, 3.0 * h2, 4.0 * h1);
            int    i  = 0;

            // Interpolationsschleife
            while (MMath.Abs(dN) > 0.00005)
            {
                // Zähler inkrementieren und prüfen
                i++;
                if (i > 100)
                {
                    return(false);
                }

                // Nächsten Schritt vorbereiten
                n += dN;
                dN = -1.0 * MMath.Polynome(n, y0, h4, h3, h2, h1) / MMath.Polynome(n, h4, 2.0 * h3, 3.0 * h2, 4.0 * h1);
            }

            // Faktor anwenden
            p = n;
            return(true);
        }
Esempio n. 3
0
        // MMath.ToLambda(double, double)
        /// <summary>
        /// Liefert die Längenkomponente des Polars zur X- und Y-Komponente des Vektors.
        /// </summary>
        /// <param name="x">X-Komponente.</param>
        /// <param name="y">Y-Komponente.</param>
        /// <returns>Längenkomponente des Polars zur X- und Y-Komponente des Vektors.</returns>
        public static double ToLambda(double x, double y)
        {
            // Ursprung verarbeiten
            if (x == 0.0 && y == 0.0)
            {
                return(0.0);
            }

            // Winkel berechnen
            double phi = 2.0 * MMath.ArcTan(y, MMath.Abs(x) + MMath.Sqr(x * x + y * y));

            if (x >= 0.0 && y >= 0.0)
            {
                return(phi);
            }
            if (y < 0.0)
            {
                return(MMath.Pi2 + phi);
            }
            return(MMath.Pi - phi);
        }