zoukankan      html  css  js  c++  java
  • 计算方法(一)用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;
            }
        }
  • 相关阅读:
    NOIP2014D2T2寻找道路(Spfa)
    【割点】【割边】tarjan
    NOIP2013D1T3货车运输(最大生成树+倍增lca)
    lca最近公共祖先(模板)
    人生第一次hash
    【模板】Tarjan求强连通分量
    【模板】链式前向星+spfa
    二叉树的三种遍历
    hdu 3549 最大流
    hdu 1532&&poj1273 基础最大流
  • 原文地址:https://www.cnblogs.com/wzxwhd/p/5859050.html
Copyright © 2011-2022 走看看