feat: 优化 LM 分阶段拟合与自适应形状搜索

- 根据目标压力与导数的相对斜率差,依次调整井储和表皮
- 形状阶段冻结井储与表皮,前期走势退化时回检并保护整体误差与形状
- 增加每轮半长探索与渗透率补偿,对可靠的导流能力联合方向尝试扩步
- 取消形状阶段固定配额,按完整搜索轮次和灵敏度刷新确认停滞,独立分配整体 LM 预算
- 整体阶段联合优化全部有效自由参数,完善局部差分、边界回退和失败重试
- 同步预调整进度显示、拟合轨迹诊断及中文翻译
feature/AutoFit-Optimize-20260914
lvjunjie 2 weeks ago
parent cd8bd9bafe
commit f0fbef51ad

Binary file not shown.

@ -673,8 +673,8 @@ Reason: %1</source>
<translation>LM 采样加密:%1 / %2 个目标点;全目标点误差:%3</translation>
</message>
<message>
<source>LM sampling: layered target points (%1 / %2); acceptance uses all valid target points.</source>
<translation>LM 采样方式:目标点分层采样(%1 / %2 点),使用全部有效目标点验收。</translation>
<source>LM sampling: layered target points (%1 / %2); total-stage acceptance uses all valid target points.</source>
<translation>LM 采样方式:目标点分层采样(%1 / %2 点),整体阶段使用全部有效目标点验收。</translation>
</message>
<message>
<source>LM sampling: fixed 80 points (original mode).</source>
@ -925,8 +925,8 @@ Reason: %1</source>
<translation>=== LM 自动拟合 - 局部最优 ===</translation>
</message>
<message>
<source>Max iterations reached. Best error: %1, Iterations: %2</source>
<translation>达到最大迭代次数。最佳误差:%1,迭代次数:%2</translation>
<source>Total-stage budget reached. Best error: %1, Cumulative iterations: %2</source>
<translation>整体阶段预算已用尽。最佳误差:%1,累计迭代次数:%2</translation>
</message>
<message>
<source>=== LM AUTOMATIC FITTING - MAX ITERATIONS ===</source>
@ -968,10 +968,6 @@ Reason: %1</source>
<source>=== Starting LM Main Loop ===</source>
<translation>=== 开始 LM 主循环 ===</translation>
</message>
<message>
<source>LM starting point error: %1; evaluation budget: %2</source>
<translation>LM 起点误差:%1;最大评估次数:%2</translation>
</message>
<message>
<source>No effective improvement for %1 consecutive steps; rebuilding sensitivity model for confirmation</source>
<translation>连续 %1 次无有效改善,正在重建灵敏度模型进行确认</translation>
@ -1065,8 +1061,8 @@ Reason: %1</source>
<translation>检测到局部最优</translation>
</message>
<message>
<source>Maximum iterations reached</source>
<translation>达到最大迭代次数</translation>
<source>Total-stage iteration or evaluation budget reached</source>
<translation>整体阶段迭代或评估预算已用尽</translation>
</message>
<message>
<source>Stopped by user request</source>
@ -1124,10 +1120,6 @@ Reason: %1</source>
<source>Permeability alignment: k=%1, height error=%2, shape error=%3, result=%4</source>
<translation>渗透率对齐:k=%1,上下误差=%2,形状误差=%3,结果=%4</translation>
</message>
<message>
<source>LM stage 2: optimize pressure and derivative shape; stop after 3 ineffective steps.</source>
<translation>LM 阶段二:优先调整压力和压力导数形状,连续 3 步无明显改善后切换。</translation>
</message>
<message>
<source>LM stage 3: original LM fitting; accept by total error only.</source>
<translation>LM 阶段三:按原有 LM 拟合,仅依据整体误差接受调整。</translation>
@ -1137,24 +1129,12 @@ Reason: %1</source>
<translation>采用灵敏度试算点:整体误差=%1</translation>
</message>
<message>
<source>Shape stage ended: %1</source>
<translation>形状阶段结束:%1</translation>
</message>
<message>
<source>3 consecutive steps without effective shape improvement</source>
<translation>连续 3 步形状没有明显改善</translation>
</message>
<message>
<source>reserve remaining iterations and evaluations for total fitting</source>
<translation>为整体拟合保留剩余迭代和求解预算</translation>
</message>
<message>
<source>no valid shape sensitivity model</source>
<translation>没有有效的形状灵敏度模型</translation>
<source>Sensitivity probe accepted: early relative-slope matching error=%1</source>
<translation>灵敏度试算点已接受:前期相对斜率匹配误差=%1</translation>
</message>
<message>
<source>no feasible shape descent step</source>
<translation>没有满足约束的形状下降步</translation>
<source>Shape stage ended: %1</source>
<translation>形状阶段结束:%1</translation>
</message>
<message>
<source>Permeability alignment ended: %1</source>
@ -1232,6 +1212,122 @@ Reason: %1</source>
<source>inaccurate model at minimum trust radius</source>
<translation>最小信赖半径下仍连续预测失准</translation>
</message>
<message>
<source>no remaining shape parameters</source>
<translation>没有其他勾选参数需要调整形状</translation>
</message>
<message>
<source>Early adjustment: adjust wellbore storage, then skin, to match the early pressure-derivative slope difference of the target.</source>
<translation>前期预调整:先调整井储,再调整表皮,使模拟压力与导数的前期斜率差接近目标曲线。</translation>
</message>
<message>
<source>Early adjustment: adjust skin to match the early pressure-derivative slope difference of the target.</source>
<translation>前期预调整:调整表皮,使模拟压力与导数的前期斜率差接近目标曲线。</translation>
</message>
<message>
<source>Wellbore storage adjustment ended: %1; now adjusting skin.</source>
<translation>井储调整结束:%1;开始单独调整表皮。</translation>
</message>
<message>
<source>Early wellbore adjustment ended: %1</source>
<translation>井储和表皮前期预调整结束:%1</translation>
</message>
<message>
<source>Shape fitting continues with storage and skin fixed; a conditional wellbore recheck follows.</source>
<translation>继续调整形状,暂时固定井储和表皮;随后按条件进行一次井储表皮回检。</translation>
</message>
<message>
<source>2 consecutive steps without effective early improvement</source>
<translation>连续 2 步前期误差没有明显改善</translation>
</message>
<message>
<source>no feasible early adjustment direction or parameter at bound</source>
<translation>没有明确可行的前期调整方向,或参数已到边界</translation>
</message>
<message>
<source>wellbore storage relative-slope matching</source>
<translation>井储前期相对斜率匹配</translation>
</message>
<message>
<source>skin relative-slope matching</source>
<translation>表皮前期相对斜率匹配</translation>
</message>
<message>
<source>Wellbore storage trial: relative-slope matching error=%1, C=%2 -&gt; %3</source>
<translation>井储试调:相对斜率匹配误差=%1,井储=%2 → %3</translation>
</message>
<message>
<source>Wellbore recheck: early error=%1, total limit=%2, shape limit=%3.</source>
<translation>井储表皮回检:前期相对斜率匹配误差=%1,整体误差上限=%2,形状误差上限=%3。</translation>
</message>
<message>
<source>early relative-slope error restored within tolerance</source>
<translation>前期相对斜率匹配误差已恢复到容差范围内</translation>
</message>
<message>
<source>new sensitivity for wellbore recheck</source>
<translation>为井储表皮回检重建灵敏度</translation>
</message>
<message>
<source>wellbore recheck completed during sensitivity evaluation</source>
<translation>井储表皮回检在灵敏度评价期间完成</translation>
</message>
<message>
<source>total target reached during shape fitting</source>
<translation>形状调整期间已达到总误差目标</translation>
</message>
<message>
<source>Half-length exploration accepted: L=%1, shape error=%2, total error=%3.</source>
<translation>裂缝半长探索结果已接受:半长=%1,形状误差=%2,整体误差=%3。</translation>
</message>
<message>
<source>fresh sensitivity after half-length exploration</source>
<translation>裂缝半长探索后重建灵敏度</translation>
</message>
<message>
<source>fresh sensitivity at joint shape entry</source>
<translation>进入联合形状调整时重建灵敏度</translation>
</message>
<message>
<source>Adaptive fitting counts: %1 completed shape rounds, %2 total-stage iterations, %3 total evaluations.</source>
<translation>自适应拟合统计:已完成 %1 轮形状搜索,整体阶段迭代 %2 次,累计评估 %3 次。</translation>
</message>
<message>
<source>LM stage 2: adaptive shape search; confirm stagnation after 2 complete rounds without significant improvement.</source>
<translation>LM 阶段2:自适应形状搜索;连续两轮完整搜索无显著改善后确认停滞。</translation>
</message>
<message>
<source>LM starting point error: %1; independent total-stage evaluation budget: %2</source>
<translation>LM 起点误差:%1;整体阶段独立评估预算:%2</translation>
</message>
<message>
<source>Shape search round %1: shape error=%2, improvement=%3, required=%4.</source>
<translation>形状搜索第 %1 轮:形状误差=%2,改善量=%3,所需改善量=%4。</translation>
</message>
<message>
<source>Total-stage budget starts now: %1 iterations, %2 evaluations; pre-adjustment is counted separately.</source>
<translation>整体阶段预算开始计数:%1 次迭代、%2 次评估;预调整单独计数。</translation>
</message>
<message>
<source>Unable to build a valid shape sensitivity model.</source>
<translation>无法建立有效的形状灵敏度模型。</translation>
</message>
<message>
<source>confirm stagnation after 2 complete shape rounds</source>
<translation>完成两轮形状搜索后确认停滞</translation>
</message>
<message>
<source>full sensitivity at total-stage entry</source>
<translation>进入整体阶段时建立完整灵敏度</translation>
</message>
<message>
<source>no significant improvement in a complete round after fresh sensitivity confirmation</source>
<translation>重建灵敏度确认后,完整一轮搜索仍无显著改善</translation>
</message>
<message>
<source>no valid early sensitivity model</source>
<translation>无有效的早期灵敏度模型</translation>
</message>
</context>
<context>
<name>nmCalculationSolver</name>
@ -4499,6 +4595,10 @@ Supported types: Vertical, Vertical Fractured, and Horizontal Multi-Fractured We
<source>Fitting Curve</source>
<translation>拟合曲线</translation>
</message>
<message>
<source>Pre-adjustment</source>
<translation>预调整中</translation>
</message>
</context>
<context>
<name>nmWxChangeAnal</name>

@ -48,6 +48,13 @@ struct AutoFitObjectiveBreakdownLM {
bool registrationAmbiguous;
// 固定 log-time 网格上的双曲线斜率残差,独立于数值残差的采样层级。
QVector<double> shapeResiduals;
// 前期数值残差为 81 点,平行程度残差为 73 个斜率区间,均含第一窗口权重。
// 平行误差比较模拟与目标各自的压力—导数斜率差,不要求模拟自身斜率差为零。
QVector<double> earlyValueResiduals;
QVector<double> earlyParallelResiduals;
double earlyValueLoss;
double earlyParallelLoss;
double earlyParallelBias;
double pressureVerticalBias;
double derivativeVerticalBias;
double shapeLoss;
@ -70,6 +77,9 @@ struct AutoFitObjectiveBreakdownLM {
, horizontalLoss(std::numeric_limits<double>::quiet_NaN())
, horizontalReliable(false)
, registrationAmbiguous(false)
, earlyValueLoss(std::numeric_limits<double>::quiet_NaN())
, earlyParallelLoss(std::numeric_limits<double>::quiet_NaN())
, earlyParallelBias(std::numeric_limits<double>::quiet_NaN())
, pressureVerticalBias(0.0)
, derivativeVerticalBias(0.0)
, shapeLoss(std::numeric_limits<double>::quiet_NaN())

File diff suppressed because it is too large Load Diff

@ -689,16 +689,19 @@ void nmWxAutomaticfittingStart::setPseudoPressureMode(bool enabled)
void nmWxAutomaticfittingStart::onFittingProgress(int iteration, double fitness)
{
// 确保iteration在合理范围内
int displayIteration = qMax(1, qMin(iteration, m_maxIterations));
// 更新进度条
progressBar->setValue(displayIteration);
double progress = (double)displayIteration / m_maxIterations * 100;
progressBar->setFormat(QString("%1%").arg(progress, 0, 'f', 1));
// LM 预调整没有固定总步数,单独显示阶段;整体阶段从局部迭代 0 开始计进度。
if (m_autoFitterLM && iteration < 0) {
progressBar->setValue(0);
progressBar->setFormat(tr("Pre-adjustment"));
currentIterationValue->setText(tr("Pre-adjustment"));
} else {
int displayIteration = qMax(m_autoFitterLM ? 0 : 1, qMin(iteration, m_maxIterations));
progressBar->setValue(displayIteration);
double progress = (double)displayIteration / m_maxIterations * 100;
progressBar->setFormat(QString("%1%").arg(progress, 0, 'f', 1));
currentIterationValue->setText(QString::number(displayIteration));
}
// 更新参数显示
currentIterationValue->setText(QString::number(displayIteration));
currentComfortValue->setText(formatScientific(fitness));
// 更新最佳适应度

Loading…
Cancel
Save