分片有理函数化简与统一表达式求解(计算机图形学场景)
嘿,我太懂你这种需求了——在计算机图形学里,把分片定义的函数揉成单一表达式,不管是写代码还是做后续的计算推导,都能省不少麻烦!先把你给出的分片函数再明确列出来,方便后续分析:
$$
f(x_1,x_2) = \begin{cases}
1+\frac{(x_2-1)^2}{x_2(x_1-x_2)}& \text{if } x_1<1, x_2>1 \
1+\frac{(x_1-1)^2}{x_1(x_2-x_1)}& \text{if } x_2<1, x_1>1 \
\frac{1}{x_1x_2}&\text{if }x_1>1,x_2>1\
1&\text{if }x_1<1,x_2<1
\end{cases}
$$
你已经试过用绝对值构造,但没找到合适的形式,其实可以借助**阶跃函数(Heaviside函数)**来把四个分支组合起来——阶跃函数刚好能帮我们区分不同的区域,而且可以用绝对值/符号函数(sign)转化成常规表达式,不用引入特殊函数。
具体思路:用阶跃函数组合分支
阶跃函数$H(t)$的定义是:当$t>0$时$H(t)=1$,当$t<0$时$H(t)=0$(边界点因为你的函数连续,不用额外处理)。我们可以用它来标记每个区域的激活状态:
- $H(1-x_1)$:仅当$x_1<1$时为1,否则0
- $H(x_1-1)$:仅当$x_1>1$时为1,否则0
- $H(1-x_2)$:仅当$x_2<1$时为1,否则0
- $H(x_2-1)$:仅当$x_2>1$时为1,否则0
把每个分支乘以对应的阶跃函数组合,再加起来就能得到单一表达式:
$$
\begin{align*}
f(x_1,x_2) &= H(1-x_1)H(1-x_2) \cdot 1 \
&+ H(1-x_1)H(x_2-1) \cdot \left(1+\frac{(x_2-1)^2}{x_2(x_1-x_2)}\right) \
&+ H(x_1-1)H(1-x_2) \cdot \left(1+\frac{(x_1-1)^2}{x_1(x_2-x_1)}\right) \
&+ H(x_1-1)H(x_2-1) \cdot \frac{1}{x_1x_2}
\end{align*}
$$
转化为带绝对值的可计算形式
阶跃函数可以用符号函数$\text{sign}(t)$表示:$H(t)=\frac{1+\text{sign}(t)}{2}$,而$\text{sign}(t)=\frac{t}{|t|}$($t\neq0$时)。把这个替换进去,就能得到纯用基本运算(加减乘除、绝对值)的单一表达式:
$$
\begin{align*}
f(x_1,x_2) &= \frac{1-\text{sign}(x_1-1)}{2} \cdot \frac{1-\text{sign}(x_2-1)}{2} \cdot 1 \
&+ \frac{1-\text{sign}(x_1-1)}{2} \cdot \frac{1+\text{sign}(x_2-1)}{2} \cdot \left(1+\frac{(x_2-1)^2}{x_2(x_1-x_2)}\right) \
&+ \frac{1+\text{sign}(x_1-1)}{2} \cdot \frac{1-\text{sign}(x_2-1)}{2} \cdot \left(1+\frac{(x_1-1)^2}{x_1(x_2-x_1)}\right) \
&+ \frac{1+\text{sign}(x_1-1)}{2} \cdot \frac{1+\text{sign}(x_2-1)}{2} \cdot \frac{1}{x_1x_2}
\end{align*}
$$
如果把$\text{sign}(t)$换成$\frac{t}{|t|}$,还能写成更“代数化”的形式,不过上面这个版本已经足够直接了——在代码里,$\text{sign}$函数大部分编程语言都有实现,或者你自己用简单的条件判断也能轻松模拟。
补充说明
这个表达式虽然不是严格意义上的有理函数(因为引入了绝对值/符号函数),但完全符合你“类似有理函数”的需求,而且因为你已经确认原函数在边界连续,这个组合式在边界点也会自动匹配,不会出现跳变。
要是你想进一步简化成更紧凑的形式,可以尝试把每个分支的分子通分后合并,但可能会变得很冗长,反而不如现在的结构清晰。目前这个形式不管是理解还是代码实现,都已经很方便了~
备注:内容来源于stack exchange,提问作者sayda

