計算方法(一)用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;
        }
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM