C#,码海拾贝(44)——求“非线性方程一个实根”的“牛顿法”之C#源代码

 

C#,码海拾贝(44)——求“非线性方程一个实根”的“牛顿法”之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)及其一阶导数f'(x)值
        ///     void Func(double x, double[] y)
        ///     y(0) 返回f(x)的值
        ///     y(1) 返回f'(x)的值
        ///

        /// 计算方程左端函数
        /// 传入迭代初值(猜测解),返回在区间求得的一个实根
        /// 递归次数
        /// 精度控制参数
        /// bool 型,求解是否成功
        public static bool GetRootNewton(delFunction_x_ya Func, ref double x, int nMaxIt, double eps)
        {
            int r;
            double d, p, x0, x1 = 0.0;
            double[] y = new double[2];

            // 条件值
            r = nMaxIt;
            x0 = x;
            Func(x0, y);

            // 求解,控制精度
            d = eps + 1.0;
            while ((d >= eps) && (r != 0))
            {
                if (Math.Abs(y[1]) < float.Epsilon)
                {
                    return false;
                }
                x1 = x0 - y[0] / y[1];
                Func(x1, y);

                d = Math.Abs(x1 - x0);
                p = Math.Abs(y[0]);
                if (p > d)
                {
                    d = p;
                }
                x0 = x1;
                r = r - 1;
            }

            x = x1;

            return true;
        }
}

}

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