我有一个包含以下数据的直方图统计条形图。
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)
这是我的代码:
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 实际上非常大,因此您实际上不会获得这些数据的有意义的钟形曲线。
我已经尝试过你的函数,但它给出了错误的曲线,\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 }\nRun Code Online (Sandbox Code Playgroud)\n\n经过此修复后,曲线好多了。
\n| 归档时间: |
|
| 查看次数: |
6664 次 |
| 最近记录: |