起因: 同事之前分析数据使用过 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);
<a name="P0Z7f"></a>
## FindRoots 计算根
[FindRoots.Polynomial(Double[] coefficients)](https://numerics.mathdotnet.com/api/MathNet.Numerics/FindRoots.htm#Polynomial)
多项式的根:多项式图像与 X 轴各个交点处的横坐标值。
<a name="KXZbb"></a>
## 计算导数
```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);
/// d 用于存储各点的导数
var d = new double[x.Length];
Debug.WriteLine("Differentiate Results Table");
Debug.WriteLine($" x dy/dx");
for (int i = 0; i < x.Length; i++)
{
// Derivative(函数, 求导的点, 求导阶数)
d[i] = Differentiate.Derivative(func, x[i], 1);
Debug.WriteLine($" {x[i]} {d[i]}");
}
效果:
PS:通过构建 Cubic Spline 也可以计算导数。