Skip to content

一元线性分段函数 ​

UnivariateLinearPiecewiseFunction 表示对连续采样点 (ti,fi) 逐段线性插值得到的函数图形。采样点至少有两个,ti 必须有限且严格递增;[t0,tm] 之外的求值未定义。

求解器数学模型 ​

Kotlin 为每条线段创建二元选择变量 zj。令该段的仿射公式为 gj(x)=ajx+bj,实现强制 ∑jzj=1,用有限 Big-M 把 x 限制到所选区间,并门控 y=gj(x)。

Rust 使用采样点权重 λi∈[0,1] 和相同的一热段选择变量 zj∈{0,1},并强制

∑iλi=1,∑jzj=1,x=∑itiλi,y=∑ifiλi.

相邻性约束为

λ0≤z0,λm≤zm−1,λi≤zi−1+zi(0<i<m).

因此只有所选线段的两个端点可以具有正权重。两边内部公式虽然不同,但现在都表示单一激活线段,并排除任意混合不相邻采样点的凸包行为。

Kotlin/Rust 示例 ​

kotlin
val piecewise = UnivariateLinearPiecewiseFunction.fromPoints(
    x = input,
    points = points,
    converter = IntoValue.Identity,
    name = "ulp"
)
rust
let piecewise = UnivariateLinearPiecewiseFunction::new(
    1,
    "ulp",
    input,
    vec![
        Point2::new(0.0, 0.0),
        Point2::new(1.0, 2.0),
        Point2::new(2.0, 0.0),
    ],
);
assert_eq!(piecewise.selector_variables().len(), 2);

求值与边界 ​

在 [ti,ti+1] 上,直接求值采用

y=fi+x−titi+1−ti(fi+1−fi).

输入缺失或超出采样点定义域时,Kotlin 返回 null,Rust 返回 None。重复、降序、非有限或数量不足的采样点会被拒绝。

测试与参考 ​

独立聚焦测试会断言辅助变量数量和每一条选择/分段图形约束行,并覆盖端点、定义域外求值及非法采样点校验。

点形式和线段形式共享严格递增的断点契约。Kotlin 直接接收 breakpoints/slopes/intercepts;Rust 还提供 UnivariateLinearPiecewiseFunction::from_segments,并要求每个相邻断点对 对应一个斜率和截距。非法值会在注册辅助变量前拒绝。