C#,码海拾贝(43)——求“非线性方程实根”的“对分法”之C#源代码

C#,码海拾贝(43)——求“非线性方程实根”的“对分法”之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
    {
        ///
        /// 求非线性方程实根的对分法
        ///

        /// 计算方程左端函数 double Func(double x)
        /// 在[xStart, xEnd]内实根个数的预估值
        /// 一维数组,长度为m。返回在区间[xStart, xEnd]内搜索到的实根,实根个数由函数值返回
        /// 求根区间的左端点
        /// 求根区间的右端点
        /// 搜索求根时采用的步长
        /// 精度控制参数
        /// int 型,求得的实根的数目
        public static int GetRootBisect(delFunction_x Func, int nNumRoots, double[] x, double xStart, double xEnd, double dblStep, double eps)
        {
            int n, js;
            double z, y, z1, y1, z0, y0;

            // 根的个数清0
            n = 0;

            // 从左端点开始搜索
            z = xStart;
            y = Func(z);

            // 循环求解
            while ((z <= xEnd + dblStep / 2.0) && (n != nNumRoots))
            {
                if (Math.Abs(y) < eps)
                {
                    n = n + 1;
                    x[n - 1] = z;
                    z = z + dblStep / 2.0;
                    y = Func(z);
                }
                else
                {
                    z1 = z + dblStep;
                    y1 = Func(z1);

                    if (Math.Abs(y1) < eps)
                    {
                        n = n + 1;
                        x[n - 1] = z1;
                        z = z1 + dblStep / 2.0;
                        y = Func(z);
                    }
                    else if (y * y1 > 0.0)
                    {
                        y = y1;
                        z = z1;
                    }
                    else
                    {
                        js = 0;
                        while (js == 0)
                        {
                            if (Math.Abs(z1 - z) < eps)
                            {
                                n = n + 1;
                                x[n - 1] = (z1 + z) / 2.0;
                                z = z1 + dblStep / 2.0; y = Func(z);
                                js = 1;
                            }
                            else
                            {
                                z0 = (z1 + z) / 2.0;
                                y0 = Func(z0);
                                if (Math.Abs(y0) < eps)
                                {
                                    x[n] = z0;
                                    n = n + 1;
                                    js = 1;
                                    z = z0 + dblStep / 2.0;
                                    y = Func(z);
                                }
                                else if ((y * y0) < 0.0)
                                {
                                    z1 = z0;
                                    y1 = y0;
                                }
                                else
                                {
                                    z = z0;
                                    y = y0;
                                }
                            }
                        }
                    }
                }
            }

            // 返回实根的数目
            return (n);
        }
 

}

}

你可能感兴趣的:(C#数值计算,Numerical,Recipes,数学建模,开发语言,c#,算法,线性代数)