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;
            }
        }
  • 相关阅读:
    暑假练习:游戏
    Floyd算法 笔记 C/C++
    Bellman-Ford 与 SPFA 算法笔记
    Dijkstra算法 C++
    C/C++ 并查集及其优化笔记整理
    C/C++ 哈夫曼树与哈夫曼编码
    判断是否为同一颗搜索树 C/C++
    C/C++ 平衡二叉树笔记(AVL树)
    VB中 “实时错误“3704”,对象关闭时,不允许操作”
    SQL Server 2014 配置全过程
  • 原文地址:https://www.cnblogs.com/wzxwhd/p/5859050.html
Copyright © 2011-2022 走看看