This commit is contained in:
GukSang.Jin
2026-01-03 11:11:22 +08:00
parent 04889abac2
commit c84fb2f480
3 changed files with 274 additions and 118 deletions

View File

@@ -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>