C#,码海拾贝(45)——求“非线性方程一个实根”的“埃特金迭代法”之C#源代码

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 GetRootAitken(delFunction_x Func, ref double x, int nMaxIt, double eps)
        {
            int flag, r;
            double u, v, x0;

            // 求解条件
            r = 0;
            x0 = x;
            flag = 0;

            // 迭代求解
            while ((flag == 0) && (r != nMaxIt))
            {
                r = r + 1;
                u = Func(x0);
                v = Func(u);
                if (Math.Abs(u - v) < eps)
                {
                    x0 = v;
                    flag = 1;
                }
                else
                {
                    x0 = v - (v - u) * (v - u) / (v - 2.0 * u + x0);
                }
            }

            x = x0;

            // 是否在指定的迭代次数内达到求解精度
            return (nMaxIt > r);
        }
 

}

}

 

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