C#、コード Haishibei (49) - 「複素係数代数方程式」の根をすべて見つけるための「ニュートンのダウンヒル法」の C# ソース コード

システムを使用する;

名前空間 Zhou.CSharp.Algorithm
{     パブリック デリゲート double delFunction_x(double x);     パブリックデリゲートdouble delFunction_xa(double[] x);     パブリックデリゲートdouble delFunction_x_y(double x, double y);     パブリックデリゲートdouble delFunction_x_ya(double x, double[] y);     パブリックデリゲートdouble delFunction_xa_ya(double[] x, double[] y);




    /// <summary>
    /// 非線形方程式を解くためのクラス NLEquations
    /// Zhou Changfa
    /// 深い混乱に適応
    /// </summary>
    public static Partial class NLEquations
    {


nis = 0、it = 0;             ダブル t = 0、x = 0、y = 0、x1 = 0、y1 = 0、dx = 0、dy = 0;












            ダブル p = 0、q = 0、w = 0、dd = 0、dc = 0、c = 0;
            ダブル g = 0、u = 0、v = 0、pq = 0、g1 = 0、u1 = 0、v1 = 0;

            // 初期判定 m
            = n;
            p = Math.Sqrt(ar[m] * ar[m] + ai[m] * ai[m]);
            while ((m > 0) && (p + 1.0 == 1.0))
            {                 m = m - 1;                 p = Math.Sqrt(ar[m] * ar[m] + ai[m] * ai[m]);             }


            // 求解失败
            if (m <= 0)
            {                 return false;             }             for (i = 0; i <= m; i++)             {                 ar[i] = ar[i] / p;                 ai[i] = ai[i] / p;             }






            for (i = 0; i <= m / 2; i++)
            {                 w = ar[i];                 ar[i] = ar[m - i];                 ar[m - i] = w;                 w = ai[i];                 ai[i] = ai[m - i];                 ai[m - i] = w;             }






            // 迭代求解
            k = m;
            nis = 0;
            w = 1.0;
            jt = 1;
            while (jt == 1)
            {                 pq = Math.Sqrt(ar[k] * ar[k] + ai[k] * ai[k]);                 while (pq < 1.0e-12)                 {                     xr[k - 1] = 0.0;                     xi[k - 1] = 0.0;                     k = k - 1;                     if (k == 1)                     {                         p = ar[0] * ar[0] + ai[0] * ai[0];                         xr[0] = -w * (ar[0] * ar[1] + ai[0] * ai[1]) / p;










                        xi[0] = w * (ar[1] * ai[0] - ar[0] * ai[1]) / p;

                        true を返します。
                    }

                    pq = Math.Sqrt(ar[k] * ar[k] + ai[k] * ai[k]);
                }

                q = Math.Log(pq);
                q = q / (1.0 * k);
                q = Math.Exp(q);
                p = q;
                w = w * p;
                for (i = 1; i <= k; i++)
                {                     ar[i] = ar[i] / q;                     ai[i] = ai[i] / q;                     q = q * p;                 }



                x = 0.0001;
                x1 = x;
                y = 0.2;
                y1 = y;
                dx = 1.0;
                g = 1.0e+37;

                while (true)
                {                     u = ar[0];                     v = ai[0];                     for (i = 1; i <= k; i++)                     {                         p = u * x1;                         q = v * y1;                         pq = (u + v) * (x1 + y1);                         u = p - q + ar[i];                         v = pq - p - q + ai[i];                     }









                    g1 = u * u + v * v;
                    if (g1 >= g)
                    {                         if (nis != 0)                         {                             it = 1;                             g65c(ref x, ref y, ref x1, ref y1, ref dx, ref dy, ref dd, ref dc, ref c, ref k, ref nis, ref it);                             if (it == 0)                             {                                 続行;                             }                         }                         それ以外の場合は                         {











                            g60c(ref t, ref x, ref y, ref x1, ref y1, ref dx, ref dy, ref p, ref q, ref k, ref it);
                            if (t >= 1.0e-03)
                            {                                 続行;                             if (g > 1.0e-18)                             {                             it                                 = 0;                                 g65c(ref x, ref y, ref x1, ref y1, ref dx, ref dy, ref dd, ref dc, ref c, ref k, ref nis, ref it);                                 if (it == 0)                                 {                                     続行;                                 }










                            }
                        }

                        g90c(xr, xi, ar, ai, ref x, ref y, ref p, ref w, ref k);
                        壊す;
                    }
                    else
                    {                         g = g1;                         x = x1;                         y = y1;                         nis = 0;                         if (g <= 1.0e-22)                         {                             g90c(xr, xi, ar, ai, ref x, ref y, ref p, ref w, ref k);                         }                         else                         {                             u1 = k * ar[0];                             v1 = ai[0];












                            for (i = 2; i <= k; i++)
                            {                                 p = u1 * x;                                 q = v1 * y;                                 pq = (u1 + v1) * (x + y);                                 u1 = p - q + (k - i + 1) * ar[i - 1];                                 v1 = pq - p - q + (k - i + 1) * ai[i - 1];                             }





                            p = u1 * u1 + v1 * v1;
                            if (p <= 1.0e-20)
                            {                                 it = 0;                                 g65c(ref x, ref y, ref x1, ref y1, ref dx, ref dy, ref dd, ref dc, ref c, ref k, ref nis, ref it);                                 if (it == 0)                                 {                                     続行;                                 g90c                                 (xr, xi, ar, ai, ref x, ref y, ref p, ref w, ref k);                             }                             それ以外の場合は                             {










                                dx = (u * u1 + v * v1) / p;
                                dy = (u1 * v - v1 * u) / p;
                                t = 1.0 + 4.0 / k;
                                g60c(ref t, ref x, ref y, ref x1, ref y1, ref dx, ref dy, ref p, ref q, ref k, ref it);
                                if (t >= 1.0e-03)
                                {                                     続行;                                 if (g > 1.0e-18)                                 {                                 it                                     = 0;





                                    g65c(ref x, ref y, ref x1, ref y1, ref dx, ref dy, ref dd, ref dc, ref c, ref k, ref nis, ref it);
                                    if (it == 0)
                                    {                                         続行;                                     }                                 }


                                g90c(xr, xi, ar, ai, ref x, ref y, ref p, ref w, ref k);
                            }
                        }
                        ブレーク;
                    }
                }

                if (k == 1)
                {                     jt = 0;                 }                 else                 {                     jt = 1;                 }             }






            true を返します。
        }

        /// <summary>
        /// 内部関数数
        /// </summary>
        private static void g60c(ref double t, ref double x, ref double y, ref double x1, ref double y1, ref double dx, ref double dy 、ref double p、ref double q、ref int k、ref int it)
        {             it = 1;             while (it == 1)             {                 t = t / 1.67;                 それ = 0;                 x1 = x - t * (dx);                 y1 = y - t * (dy);                 if (k >= 30)                 {                     p = Math.Sqrt(x1 * (x1) + y1 * (y1));                     q = Math.Exp(75.0 / (k));                     if (p >= q)












                        それ = 1;
                }         }
            }

        /// <summary>
        /// 内部関数数
        /// </summary>
        private static void g90c(double[] xr, double[] xi, double[] ar, double[] ai, ref double x, ref double y , ref double p, ref double w, ref int k)
        {             for (int i = 1; i <= k; i++)             {                 ar[i] = ar[i] + ar[i - 1] * (x) - ai[i - 1] * (y);                 ai[i] = ai[i] + ar[i - 1] * (y) + ai[i - 1] * (x);             }




            xr[k - 1] = x * (w);
            xi[k - 1] = y * (w);
            k = k - 1;
            if (k == 1)
            {                 p = ar[0] * ar[0] + ai[0] * ai[0];                 xr[0] = -w * (ar[0] * ar[1] + ai[0] * ai[1]) / (p);                 xi[0] = w * (ar[1] * ai[0] - ar[0] * ai[1]) / (p);             }         }




        /// <summary>
        /// 内部関数数
        /// </summary>
        private static void g65c(ref double x, ref double y, ref double x1, ref double y1, ref double dx, ref double dy, ref double dd 、ref double dc、ref double c、ref int k、ref int nis、ref int it)
        {             if (it == 0)             {                 nis = 1;                 dd = Math.Sqrt(dx * (dx) + dy * (dy));                 if (dd > 1.0)                     dd = 1.0;                 dc = 6.28 / (4.5 * (k));                 c = 0.0;             }








            while (true)
            {                 c = c + dc;                 dx = dd * Math.Cos(c);                 dy = dd * Math.Sin(c);                 x1 = x + dx;                 y1 = y + dy;                 if (c <= 6.29)                 {                     it = 0;                     戻る;                 }









                dd = dd / 1.67;
                if (dd <= 1.0e-07)
                {                     it = 1;                     戻る;                 }


                c = 0.0;
            }
        }
 


}

}

おすすめ

転載: blog.csdn.net/beijinghorn/article/details/131197464