|
|
|
|
@ -6568,15 +6568,17 @@ double nmCalculationAutoFitPSO::calculateLogLogCurveError(
|
|
|
|
|
// 无法比较的采样行先跳过;有限但非正的导数无法进入双对数空间,
|
|
|
|
|
// 当前数据又没有逐点有效掩码,因此遇到这种导数时判本次评价无效。
|
|
|
|
|
auto prepareCurve = [valueFloor](const QVector<QVector<double> >& data,
|
|
|
|
|
int firstIndex,
|
|
|
|
|
QVector<QPointF>* pressure,
|
|
|
|
|
QVector<QPointF>* derivative) -> bool {
|
|
|
|
|
if(!pressure || !derivative || data.size() < 3 ||
|
|
|
|
|
data[0].size() != data[1].size() ||
|
|
|
|
|
data[0].size() != data[2].size()) {
|
|
|
|
|
data[0].size() != data[2].size() ||
|
|
|
|
|
firstIndex < 0 || firstIndex >= data[0].size()) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for(int i = 0; i < data[0].size(); ++i) {
|
|
|
|
|
for(int i = firstIndex; i < data[0].size(); ++i) {
|
|
|
|
|
if(!isFiniteNumber(data[0][i]) ||
|
|
|
|
|
!isFiniteNumber(data[1][i]) ||
|
|
|
|
|
!isFiniteNumber(data[2][i]) ||
|
|
|
|
|
@ -6624,8 +6626,9 @@ double nmCalculationAutoFitPSO::calculateLogLogCurveError(
|
|
|
|
|
QVector<QPointF> targetDerivative;
|
|
|
|
|
QVector<QPointF> resultPressure;
|
|
|
|
|
QVector<QPointF> resultDerivative;
|
|
|
|
|
if(!prepareCurve(target, &targetPressure, &targetDerivative) ||
|
|
|
|
|
!prepareCurve(result, &resultPressure, &resultDerivative)) {
|
|
|
|
|
// 模拟结果已跳过 DLL 首点,因此误差计算同步忽略目标曲线首点。
|
|
|
|
|
if(!prepareCurve(target, 1, &targetPressure, &targetDerivative) ||
|
|
|
|
|
!prepareCurve(result, 0, &resultPressure, &resultDerivative)) {
|
|
|
|
|
return invalidLoss;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -6721,7 +6724,14 @@ double nmCalculationAutoFitPSO::calculateLogLogCurveError(
|
|
|
|
|
(targetLogMaxX - targetLogMinX) /
|
|
|
|
|
(numPoints - 1);
|
|
|
|
|
commonLogX[i] = logX;
|
|
|
|
|
commonX[i] = qExp(logX);
|
|
|
|
|
// 首尾直接使用原始端点,避免 exp(log(t)) 的舍入误差越过严格插值边界。
|
|
|
|
|
if(i == 0) {
|
|
|
|
|
commonX[i] = targetMinX;
|
|
|
|
|
} else if(i == numPoints - 1) {
|
|
|
|
|
commonX[i] = targetMaxX;
|
|
|
|
|
} else {
|
|
|
|
|
commonX[i] = qExp(logX);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(!interpolateLogValue(
|
|
|
|
|
targetPressure, commonX[i],
|
|
|
|
|
@ -7017,10 +7027,14 @@ double nmCalculationAutoFitPSO::calculateLogLogCurveError(
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double shiftedX = qExp(
|
|
|
|
|
qBound(resultLogMinX,
|
|
|
|
|
shiftedLogX,
|
|
|
|
|
resultLogMaxX));
|
|
|
|
|
// 对数时间还原后再次限制到原始端点,避免 exp(log(t)) 的
|
|
|
|
|
// 舍入误差越过严格插值边界。
|
|
|
|
|
double shiftedX = qBound(
|
|
|
|
|
resultMinX,
|
|
|
|
|
qExp(qBound(resultLogMinX,
|
|
|
|
|
shiftedLogX,
|
|
|
|
|
resultLogMaxX)),
|
|
|
|
|
resultMaxX);
|
|
|
|
|
double resultLogPressure = 0.0;
|
|
|
|
|
double resultLogDerivative = 0.0;
|
|
|
|
|
if(!interpolateLogValue(
|
|
|
|
|
|