计算方法(一)用C#实现数值迭代

    平时,经常会遇到解方程,计算方法中常用的有二分法(精度太低,迭代次数多,一般没人用),牛顿迭代法,弦截法,网上大多都是C++或者Java的实现代码,很少有C#的,我在本科毕业论文中用到了这些,那时也需要做一个winfrom,所以就用了C#,因此今天正好借这篇文章,把我的代码修改一下,公布出来,当然,代码有很多不足,扩展性也比较差,所以还希望大家多多指教喽。

public static class Equation
    {
        //二分法
        //[x1,x2]为近似解区间,e为求解精度,fun为求解方程
        public static double Dichotomy(Func<double, double> fun, double x1, double x2, double e)
        {
            double x = 0;
            while (Math.Abs(x2 - x1) >= e)
            {
                x = (x1 + x2) / 2;
                if (fun(x1) * fun(x) < 0)
                {
                    x2 = x;
                }
                if (fun(x2) * fun(x) < 0)
                {
                    x1 = x;
                }
                if (0 == fun(x))
                {
                    return x;
                }
            }
            return x;
        }

        //牛顿迭代法
        //fun为牛顿迭代公式!!f(x)=x-f(x)/f'(x)
        //x1为方程初始解,e为方程求解精度
        public static double Newton(Func<double, double> fun, double x1, double e)
        {
            int count = 0;
            double x2 = fun(x1);
            while (Math.Abs(x2 - x1) >= e)
            {
                x1 = x2;
                x2 = fun(x1);
                count++;
            }
            return x2;
        }

        //单点弦截法,即不动点迭代法
        //f(x)=x0-(x-x0)/(f(x)-f(x0))*f(x0) x0为不动点,一般常选取区间的一个端点。
        //x1为区间的另一个端点,e为方程解的精度
        public static double Single(Func<double, double> fun, double x1, double e)
        {
            int count = 0;
            double x2 = fun(x1);
            while (Math.Abs(x2 - x1) >= e)
            {
                x1 = x2;
                x2 = fun(x1);
                count++;
            }
            return x2;
        }

        //割线法
        public static double Sec(Func<double, double, double> fun, double x1, double x2, double e)
        {
            int count = 0;
            double x3 = 0;
            while (Math.Abs(x2 - x1) > e)
            {
                x3 = fun(x1, x2);
                x1 = x2;
                x2 = x3;
                count++;
            }
            return x3;
        }
    }
原文地址:https://www.cnblogs.com/wzxwhd/p/5859050.html