// 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); }
// 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); }
// 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); }