C#,码海拾贝(46)——求“非线性方程一个实根“的“连分式解法“之C#源代码

C#,码海拾贝(46)——求“非线性方程一个实根“的“连分式解法“之C#源代码_第1张图片

 

using System;

namespace Zhou.CSharp.Algorithm
{
    public delegate double delFunction_x(double x);
    public delegate double delFunction_xa(double[] x);
    public delegate double delFunction_x_y(double x, double y);
    public delegate double delFunction_x_ya(double x, double[] y);
    public delegate double delFunction_xa_ya(double[] x, double[] y);

    ///


    /// 求解非线性方程组的类 NLEquations
    /// 原作 周长发
    /// 改编 深度混淆
    ///

    public static partial class NLEquations
    {

        ///


        /// 求非线性方程一个实根的连分式解法
        /// 计算方程左端函数f(x) double Func(double x)
        ///

        /// 计算方程左端函数
        /// 传入迭代初值(猜测解),返回在区间求得的一个实根
        /// 精度控制参数
        /// bool 型,求解是否成功
        public static bool GetRootPq(delFunction_x Func, ref double x, double eps)
        {
            int i, j, m, it = 0, r;
            double z, h, x0, q;
            double[] a = new double[10];
            double[] y = new double[10];

            // 求解条件
            r = 10;
            q = 1.0e+35;
            x0 = x;
            h = 0.0;

            // 连分式求解
            while (r != 0)
            {
                r = r - 1;
                j = 0;
                it = r;
                while (j <= 7)
                {
                    if (j <= 2)
                    {
                        z = x0 + 0.1 * j;
                    }
                    else
                    {
                        z = h;
                    }
                    y[j] = Func(z);
                    h = z;
                    if (j == 0)
                    {
                        a[0] = z;
                    }
                    else
                    {
                        m = 0;
                        i = 0;
                        while ((m == 0) && (i <= j - 1))
                        {
                            if (Math.Abs(h - a[i]) < float.Epsilon)
                            {
                                m = 1;
                            }
                            else
                            {
                                h = (y[j] - y[i]) / (h - a[i]);
                            }
                            i = i + 1;
                        }
                        a[j] = h;
                        if (m != 0)
                        {
                            a[j] = q;
                        }
                        h = 0.0;
                        for (i = j - 1; i >= 0; i--)
                        {
                            if (Math.Abs(a[i + 1] + h) < float.Epsilon)
                            {
                                h = q;
                            }
                            else
                            {
                                h = -y[i] / (a[i + 1] + h);
                            }
                        }

                        h = h + a[0];
                    }

                    if (Math.Abs(y[j]) >= eps)
                    {
                        j = j + 1;
                    }
                    else
                    {
                        j = 10;
                        r = 0;
                    }
                }

                x0 = h;
            }

            x = h;

            // 是否在10阶连分式内求的实根?
            return (10 > it);
        }
 

}

}

你可能感兴趣的:(C#数值计算,Numerical,Recipes,数学建模)