【问题标题】:Are there any C# math libraries that do interpolation / extrapolation [closed]是否有任何 C# 数学库可以进行插值/外推[关闭]
【发布时间】:2010-03-07 13:11:52
【问题描述】:

比如我有积分

Y X
100 50
90 43
80 32

需要解出 y = 50

Y X
2009 年 1 月 1 日 100
2009 年 1 月 3 日 97
2009 年 1 月 4 日 94
2009 年 1 月 5 日 92
2009 年 1 月 6 日 91
2009 年 1 月 7 日 89

需要求解 y = 1/23/2009

【问题讨论】:

    标签: c# math


    【解决方案1】:

    我使用的是 Math.NET 的数字组件http://numerics.mathdotnet.com/

    它包含“各种插值方法,包括重心方法和样条曲线”。

    但俗话说,有谎言,该死的谎言和双三次样条插值。

    【讨论】:

      【解决方案2】:

      看看你是否能在ALGLIB找到你想要的东西。当然,您仍然需要针对您的问题决定合适的插值/外插类型。

      【讨论】:

      • Alglib 是 GPL 许可证,免费版本不并发,商业并发版本付费,仅供参考。
      【解决方案3】:

      我不了解库,但这里有一个简单的正割求解器:

      class SecantSolver
      {
          private int     _maxSteps= 10;
          private double _precision= 0.1;
      
          public SecantSolver(int maxSteps, double precision)
          {
              _maxSteps= maxSteps;
              _precision= precision;
      
              if (maxSteps <= 0)
                  throw new ArgumentException("maxSteps is out of range; must be greater than 0!");
      
              if (precision <= 0)
                  throw new ArgumentException("precision is out of range; must be greater than 0!");
      
          }
      
          private double ComputeNextPoint(double p0, double p1, Func<Double,Double> f)
          {
              double r0 = f(p0);
              double r1 = f(p1);
              double p2 = p1 - r1 * (p1-p0) / (r1-r0); // the basic secant formula
              return p2;
          }
      
          public double Solve( double lowerBound, double upperBound, Func<Double,Double> f, out String message)
          {
              double p2,p1,p0;
              int i;
              p0=lowerBound;
              p1=upperBound;
              p2= ComputeNextPoint(p0,p1,f);
      
              // iterate till precision goal is met or the maximum
              // number of steps is reached
              for(i=0; System.Math.Abs(f(p2))>_precision &&i<_maxSteps;i++) {
                  p0=p1;
                  p1=p2;
                  p2=ComputeNextPoint(p0,p1,f);
              }
      
              if (i < _maxSteps)
                  message = String.Format("Method converges in " + i + " steps.");
              else
                  message = String.Format("{0}. The method did not converge.", p2);
      
              return p2;
          }
      }
      

      用法:

      SecantSolver solver= new SecantSolver(200,              // maxsteps
                                            0.00000001f/100   // tolerance
                                            );
      
      string message;
      double root= solver.Solve(0.10,   // initial guess (lower)
                                1.0,    // initial guess (upper)
                                f,      // the function to solve
                                out message
                                );
      

      【讨论】:

        【解决方案4】:

        ILNumerics Interpolation Toolbox 带来了所有标准的插值函数。您会发现具有通用、简单界面的各种插值/外插函数。与其他解决方案相比的一个特别优势是速度:这些功能经过精心优化,可在多核硬件和大数据上尽可能快。

        【讨论】:

        • 它是开源的吗?在哪里可以看到这些函数的代码?
        猜你喜欢
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        • 2012-03-08
        • 2011-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-11
        相关资源
        最近更新 更多