更新
This commit is contained in:
@@ -29,8 +29,12 @@ namespace WindowsFormsApp6
|
||||
private const string ROW_INITIAL_WEIGHT = "初始重量(g)";
|
||||
private const string ROW_AFTER_WEIGHT = "浸润后重量(g)";
|
||||
private const string ROW_ABSORPTION = "液体吸收量(%)";
|
||||
private const string ROW_SOAK_TIME = "浸润时间";
|
||||
private const string ROW_HANG_TIME = "悬挂时间";
|
||||
private const string ROW_RUN_SPEED = "运行速度";
|
||||
private const string ROW_AVG_ABSORPTION = "液体吸收量平均值(%)";
|
||||
private const string ROW_MAX_ABSORPTION = "液体吸收量最大值(%)";
|
||||
private const string ROW_STD_DEVIATION = "标准偏差";
|
||||
#endregion
|
||||
|
||||
#region 字段
|
||||
@@ -297,8 +301,12 @@ namespace WindowsFormsApp6
|
||||
{
|
||||
var rowsToRemove = sampleDataTable.AsEnumerable()
|
||||
.Where(r => r.Field<string>("序号") == ROW_ABSORPTION ||
|
||||
r.Field<string>("序号") == ROW_SOAK_TIME ||
|
||||
r.Field<string>("序号") == ROW_HANG_TIME ||
|
||||
r.Field<string>("序号") == ROW_RUN_SPEED ||
|
||||
r.Field<string>("序号") == ROW_AVG_ABSORPTION ||
|
||||
r.Field<string>("序号") == ROW_MAX_ABSORPTION)
|
||||
r.Field<string>("序号") == ROW_MAX_ABSORPTION ||
|
||||
r.Field<string>("序号") == ROW_STD_DEVIATION)
|
||||
.ToList();
|
||||
|
||||
foreach (var row in rowsToRemove)
|
||||
@@ -316,7 +324,7 @@ namespace WindowsFormsApp6
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 生成模拟测试数据
|
||||
/// 生成模拟测试数据(精确模拟真实测试场景)
|
||||
/// </summary>
|
||||
public void GenerateMockData()
|
||||
{
|
||||
@@ -327,16 +335,45 @@ namespace WindowsFormsApp6
|
||||
double[] initialWeights = new double[currentSampleCount];
|
||||
double[] afterWeights = new double[currentSampleCount];
|
||||
|
||||
// 设置基准值,使数据更真实
|
||||
double baseInitialWeight = 15.0; // 基准初始重量
|
||||
double baseAbsorptionRate = 0.35; // 基准吸收率 35%
|
||||
|
||||
for (int i = 0; i < currentSampleCount; i++)
|
||||
{
|
||||
initialWeights[i] = Math.Round(MIN_WEIGHT + random.NextDouble() * (MAX_WEIGHT - MIN_WEIGHT), 2);
|
||||
afterWeights[i] = Math.Round(initialWeights[i] * (1.2 + random.NextDouble() * 0.3), 2); // 浸润后增重20%-50%
|
||||
// 初始重量:在基准值附近波动 ±3g
|
||||
initialWeights[i] = Math.Round(baseInitialWeight + (random.NextDouble() - 0.5) * 6.0, 2);
|
||||
|
||||
// 吸收率:在基准吸收率附近波动 ±10%
|
||||
double absorptionRate = baseAbsorptionRate + (random.NextDouble() - 0.5) * 0.2;
|
||||
|
||||
// 浸润后重量 = 初始重量 × (1 + 吸收率)
|
||||
afterWeights[i] = Math.Round(initialWeights[i] * (1 + absorptionRate), 2);
|
||||
}
|
||||
|
||||
sampleCount = 1;
|
||||
UpdateDisplay(initialWeights, afterWeights);
|
||||
|
||||
ShowMessage($"已生成 {currentSampleCount} 个试样的模拟数据", "模拟数据生成");
|
||||
// 计算并显示统计信息
|
||||
double[] absorptions = new double[currentSampleCount];
|
||||
for (int i = 0; i < currentSampleCount; i++)
|
||||
{
|
||||
absorptions[i] = ((afterWeights[i] - initialWeights[i]) / initialWeights[i]) * 100;
|
||||
}
|
||||
|
||||
double avgAbsorption = absorptions.Average();
|
||||
double stdDev = CalculateStandardDeviation(absorptions);
|
||||
double maxAbsorption = absorptions.Max();
|
||||
double minAbsorption = absorptions.Min();
|
||||
|
||||
string message = $"已生成 {currentSampleCount} 个试样的模拟数据\n\n" +
|
||||
$"液体吸收量统计:\n" +
|
||||
$"平均值:{avgAbsorption:F2}%\n" +
|
||||
$"标准偏差:{stdDev:F2}%\n" +
|
||||
$"最大值:{maxAbsorption:F2}%\n" +
|
||||
$"最小值:{minAbsorption:F2}%";
|
||||
|
||||
ShowMessage(message, "模拟数据生成");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -377,29 +414,57 @@ namespace WindowsFormsApp6
|
||||
}
|
||||
sampleDataTable.Rows.Add(absorptionRow);
|
||||
|
||||
// 4. 液体吸收量平均值行
|
||||
// 4. 浸润时间行
|
||||
DataRow soakTimeRow = sampleDataTable.NewRow();
|
||||
soakTimeRow["序号"] = ROW_SOAK_TIME;
|
||||
// 为每个试样生成浸润时间(基准60s,波动±10s)
|
||||
for (int i = 1; i <= count; i++)
|
||||
{
|
||||
int soakTime = 60 + random.Next(-10, 11); // 50-70秒
|
||||
soakTimeRow[$"试样{i}"] = $"{soakTime}s";
|
||||
}
|
||||
sampleDataTable.Rows.Add(soakTimeRow);
|
||||
|
||||
// 5. 悬挂时间行
|
||||
DataRow hangTimeRow = sampleDataTable.NewRow();
|
||||
hangTimeRow["序号"] = ROW_HANG_TIME;
|
||||
// 为每个试样生成悬挂时间(基准30s,波动±5s)
|
||||
for (int i = 1; i <= count; i++)
|
||||
{
|
||||
int hangTime = 30 + random.Next(-5, 6); // 25-35秒
|
||||
hangTimeRow[$"试样{i}"] = $"{hangTime}s";
|
||||
}
|
||||
sampleDataTable.Rows.Add(hangTimeRow);
|
||||
|
||||
// 6. 运行速度行
|
||||
DataRow runSpeedRow = sampleDataTable.NewRow();
|
||||
runSpeedRow["序号"] = ROW_RUN_SPEED;
|
||||
// 为每个试样生成运行速度(基准100mm/min,波动±10mm/min)
|
||||
for (int i = 1; i <= count; i++)
|
||||
{
|
||||
int runSpeed = 100 + random.Next(-10, 11); // 90-110 mm/min
|
||||
runSpeedRow[$"试样{i}"] = $"{runSpeed}mm/min";
|
||||
}
|
||||
sampleDataTable.Rows.Add(runSpeedRow);
|
||||
|
||||
// 7. 液体吸收量平均值行
|
||||
DataRow avgRow = sampleDataTable.NewRow();
|
||||
avgRow["序号"] = ROW_AVG_ABSORPTION;
|
||||
double avgAbsorption = absorptions.Average();
|
||||
double stdDev = CalculateStandardDeviation(absorptions);
|
||||
|
||||
// 根据实际试样数量计算平均值
|
||||
double avgAbsorption = count > 0 ? absorptions.Take(count).Average() : 0;
|
||||
|
||||
// 第1列显示平均值
|
||||
avgRow["试样1"] = avgAbsorption;
|
||||
|
||||
// 第2列显示标准偏差
|
||||
if (count >= 2)
|
||||
{
|
||||
avgRow["试样2"] = stdDev;
|
||||
}
|
||||
|
||||
// 其他列为空
|
||||
for (int i = 3; i <= count; i++)
|
||||
for (int i = 2; i <= count; i++)
|
||||
{
|
||||
avgRow[$"试样{i}"] = DBNull.Value;
|
||||
}
|
||||
sampleDataTable.Rows.Add(avgRow);
|
||||
|
||||
// 5. 液体吸收量最大值行
|
||||
// 8. 液体吸收量最大值行
|
||||
DataRow maxRow = sampleDataTable.NewRow();
|
||||
maxRow["序号"] = ROW_MAX_ABSORPTION;
|
||||
double maxAbsorption = absorptions.Max();
|
||||
@@ -414,20 +479,38 @@ namespace WindowsFormsApp6
|
||||
}
|
||||
sampleDataTable.Rows.Add(maxRow);
|
||||
|
||||
// 9. 标准偏差行(最后一行)
|
||||
DataRow stdDevRow = sampleDataTable.NewRow();
|
||||
stdDevRow["序号"] = ROW_STD_DEVIATION;
|
||||
|
||||
// 根据实际试样数量计算标准偏差
|
||||
double stdDev = count > 1 ? CalculateStandardDeviation(absorptions.Take(count).ToArray()) : 0;
|
||||
|
||||
// 第1列显示标准偏差
|
||||
stdDevRow["试样1"] = stdDev;
|
||||
|
||||
// 其他列为空
|
||||
for (int i = 2; i <= count; i++)
|
||||
{
|
||||
stdDevRow[$"试样{i}"] = DBNull.Value;
|
||||
}
|
||||
sampleDataTable.Rows.Add(stdDevRow);
|
||||
|
||||
// 刷新界面
|
||||
RefreshDataGridView();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算标准偏差
|
||||
/// 计算标准偏差(样本标准偏差,n-1)
|
||||
/// </summary>
|
||||
private double CalculateStandardDeviation(double[] values)
|
||||
{
|
||||
if (values.Length == 0) return 0;
|
||||
if (values == null || values.Length <= 1) return 0;
|
||||
|
||||
double avg = values.Average();
|
||||
double sumOfSquares = values.Sum(val => Math.Pow(val - avg, 2));
|
||||
return Math.Sqrt(sumOfSquares / values.Length);
|
||||
// 使用样本标准偏差公式:除以 (n-1)
|
||||
return Math.Sqrt(sumOfSquares / (values.Length - 1));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
Reference in New Issue
Block a user