起因: 同事之前分析数据使用过 Excel 的拟合功能,他问我这用 C# 实现不难吧 😏,我心头忐忑,直到找到了 Math.NET,—— 确实不难 🧐

简介

Math.NET 是一个针对 .NET、Silverlight 和 Mono 的开源数学库。

Math.NET Numerics is an opensource numerical library for .Net, Silverlight and Mono.

相关资源:

支持平台:

  • .NET Framework (4.0 and higher)
  • .NET Standard (1.3 and higher)

    使用

    多项式拟合

    Curve Fitting: Linear Regression ```csharp var x = Enumerable.Range(1, 150).Select(r => (double)r).ToArray(); // y 也是 150 个 double var y = new double[]{…};

// 根据 6 阶多项式拟合得到 func var func = Fit.PolynomialFunc(x, y, 6);

  1. <a name="P0Z7f"></a>
  2. ## FindRoots 计算根
  3. [FindRoots.Polynomial(Double[] coefficients)](https://numerics.mathdotnet.com/api/MathNet.Numerics/FindRoots.htm#Polynomial)
  4. 多项式的根:多项式图像与 X 轴各个交点处的横坐标值。
  5. <a name="KXZbb"></a>
  6. ## 计算导数
  7. ```csharp
  8. var x = Enumerable.Range(1, 150).Select(r => (double)r).ToArray();
  9. // y 也是 150 个 double
  10. var y = new double[]{...};
  11. // 根据 6 阶多项式拟合得到 func
  12. var func = Fit.PolynomialFunc(x, y, 6);
  13. /// d 用于存储各点的导数
  14. var d = new double[x.Length];
  15. Debug.WriteLine("Differentiate Results Table");
  16. Debug.WriteLine($" x dy/dx");
  17. for (int i = 0; i < x.Length; i++)
  18. {
  19. // Derivative(函数, 求导的点, 求导阶数)
  20. d[i] = Differentiate.Derivative(func, x[i], 1);
  21. Debug.WriteLine($" {x[i]} {d[i]}");
  22. }

效果:
image.png

PS:通过构建 Cubic Spline 也可以计算导数。

参考