如何在 C# 中绘制高斯曲线

Sak*_*era 5 c#

我有一个包含以下数据的直方图统计条形图。

Count, HistogramBin
    0,    -1615.25
    0,    -1056.42
    0,     -497.48
    1,       61.25
    1,      620.05
    1,     1178.92
    0,     1737.76
    0,     2296.59
Run Code Online (Sandbox Code Playgroud)

我需要根据上述值形成高斯曲线。谁能指导我如何实现同样的目标。

我根据维基百科链接编写了一个函数: https: //en.wikipedia.org/wiki/Gaussian_function

我们的平均值是:340.67 SD:标准差:488.98001098632812

 private DataTable GenerateGaussTable1(DataTable histogramDataTable, 
                                       HistogramValueItem histogramValueDBItem)
    {
      double amplitude = (Average + 3 * Sigma) / 2;
      double mean = Average;
      double sd = Sigma;
      DataTable dt = new DataTable();
      dt.Columns.Add("x", typeof(float));
      dt.Columns.Add("Y", typeof(float));
      foreach (DataRow row in histogramDataTable.Rows)// top provided data
      {
        double x = Convert.ToDouble(row[1]) / 2;
        double var1 = 1 / sd * Math.Sqrt(2 * 3.14);
        double var2 = -0.5 *  Math.Pow((x - mean)/sd, 2);

        double var4= Math.Exp(var2);
        double var5 = var1 * var4;
        // Y = Amplitude * exp(-0.5 * ((X - Mean) / SD) ^ 2)
        double y = var5;
        dt.Rows.Add((float)x, (float)y);
      }
      return dt;
    }
Run Code Online (Sandbox Code Playgroud)

TaW*_*TaW 5

在此输入图像描述

这是我的代码:

double gauss(double x, double a, double b, double c)
{
    var v1 = ( x - b) / (2d * c * c);
    var v2 = -v1 * v1 / 2d;
    var v3 = a * Math.Exp(v2);

    return v3;
}
Run Code Online (Sandbox Code Playgroud)

和:

private void button_Click(object sender, EventArgs e)
{
    Series s1 = chart2.Series[0];
    s1.ChartType = SeriesChartType.Line;
    s1.Name = "Line";
    Series s2 = chart2.Series.Add("Spline");
    s2.ChartType = SeriesChartType.Spline;

    double avg = 1.8;
    double amp = 3;
    double sd = 0.53;

    List<double> xes = new List<double> 
       { 0, 0, 0.05, 0.1, 0.4, 0.9, 1.3, 1.6, 2, 2.4, 2.8, 3.2, 4 };

    foreach (var x in xes)
    {
        s1.Points.AddXY(x, gauss(x, amp, avg, sd));
        s2.Points.AddXY(x, gauss(x, amp, avg, sd));
    }
}
Run Code Online (Sandbox Code Playgroud)

数学来自维基百科

我认为你的 SD 太大而无法创建钟形曲线;尝试除以 10-100..!- 当然,您的 SD 实际上非常大,因此您实际上不会获得这些数据的有意义的钟形曲线。


Dom*_*ieu 2

我已经尝试过你的函数,但它给出了错误的曲线,\n高斯函数是错误的,你为什么使用“2d”?

\n\n

这里的功能:

\n\n

在此输入图像描述

\n\n

所以首先,v1 = (xb)。然后 v2 = (xb)\xc2\xb2 / 2 c\xc2\xb2\n 最后 v3 = a exp (v2)

\n\n
 double gauss(double x, double a, double b, double c)\n        {\n            var v1 = (x - b);\n            var v2 = (v1 * v1) / (2 * (c*c));\n            var v3 = a * Math.Exp(-v2);\n            return v3;\n        }\n
Run Code Online (Sandbox Code Playgroud)\n\n

经过此修复后,曲线好多了。

\n