求平面点列的折线弧长参数方程

Author : zbzhen,        Modified : Mon Nov 20 19:39:50 2023

为了方便, 先考虑普通的折线参数方程, 对于弧长参数方程可同理类似求出.

一般折线参数方程

问题提出

已知平面点列{A1(x1,y1),A2(x2,y2),,An(xn,yn)}\{A_1(x_1,y_1),\,A_2(x_2,y_2),\,\cdots,\,A_n(x_n,y_n)\}, 求经过这nn个点的折线参数方程L(t)L(t), 使得L(k)=(xk,yk),k=1,2,nL(k)=(x_k,y_k),k=1,2,\cdots n.

问题分析

只需要求过点列{(1,x1),(2,x2),,(n,xn)}\{(1, x_1), (2, x_2),\cdots,(n,x_n)\}的折线参数方程x(t)x(t), 且满足x(k)=xkx(k)=x_k; 以及求过点列{(1,y1),(2,y2),,(n,yn)}\{(1, y_1), (2, y_2),\cdots,(n,y_n)\}的折线参数方程y(t)y(t), 且满足y(k)=yky(k)=y_k. 于是

L(t)={x(t)y(t),t[1,n]L(t)=\begin{cases}x(t)\\y(t)\end{cases},\quad t\in[1,n]

很显然, 当nn比较小的时候, 可以直接给出分段折线参数方程; 但是当nn比较大的时候, 如果继续采用分段折线参数方程, 用编程语言实现以及画图可能会有点麻烦.

问题求解

根据前面的分析, 只需考虑x(t)x(t), 参数方程y(t)y(t)可同理得出.

利用线性有限元基函数的思想, 先构造"山形"折线基函数如下

ψk(x)={x(k1),x[k1,k](k+1)x,x[k,k+1]0,else\psi_{k}(x)=\begin{cases} x - (k-1), &x\in [k-1,k]\\ (k+1)-x, &x\in[k,k+1]\\ 0, &\text{else}\end{cases}

其中k=1,2,,nk=1,2,\cdots,n,

很显然, 折线基函数ψk(x)\psi_k(x)满足ψk(k)=1\psi_k(k)=1, 并且不难验证

x(t)=k=1nxkψk(t)x(t)=\displaystyle\sum_{k=1}^n x_k\psi_k(t).

事实上, 很容易验证下面两条性质:
一是这样构造的函数是分片线性函数, 也就是函数在每个小区间[k,k+1][k,k+1]上的表达式都是一次函数;
二是这样构造的函数满足x(k)=xkx(k)=x_k.

为了使得程序的简洁性, 这里可以直接把折线基函数改写成绝对值函数的形式, 即

ψk(x)=12xk+1xk+12xk1\psi_k(x)=\frac{1}{2}|x-k+1|-|x-k|+\frac{1}{2}|x-k-1|

于是

x(t)=k=1nxk(12xk+1xk+12xk1)\begin{aligned} x(t) =&\sum_{k=1}^n x_k\left(\frac{1}{2}|x-k+1|-|x-k|+\frac{1}{2}|x-k-1|\right)\\ \end{aligned}

如果想提高程序运行的效率, 上述公式可进一步整合改写.

GeoGebra可视化

有了前面的公式, 很容易用GeoGebra实现点列的折线参数方程

给出GeoGebra示列代码如下:
试试把下列代码逐行导入到GeoGebra命令行中, 看看效果
推荐用电脑直接打开官网 https://geogebra.org/classic
或者本站制作的多页模板 https://kz16.top/ggb/

Lp={(0,0),(2,0),(2,1),(0,1)}
bx(x)=Sum(x(Lp(k))*(abs(x-k+1)/2-abs(x-k)+abs(x-k-1)/2),k,1,Length(Lp))
by(x)=Sum(y(Lp(k))*(abs(x-k+1)/2-abs(x-k)+abs(x-k-1)/2),k,1,Length(Lp))
curve((bx(t),by(t)),t,1,Length(Lp))

或者直接用内置的Function指令

Lp={(0,0),(2,0),(2,1),(0,1)}
bx(x)=Function(join({1,Length(Lp)},x(Lp)))
by(x)=Function(join({1,Length(Lp)},y(Lp)))
curve((bx(t),by(t)),t,1,Length(Lp))

折线的弧长参数方程

问题提出

已知平面点列{A1(x1,y1),A2(x2,y2),,An(xn,yn)}\{A_1(x_1,y_1),\,A_2(x_2,y_2),\,\cdots,\,A_n(x_n,y_n)\}, 求经过这nn个点的折线弧长参数方程L(s)L(s).

问题分析

只需要求过点列{(s1,x1),(s2,x2),,(sn,xn)}\{(s_1, x_1), (s_2, x_2),\cdots,(s_n,x_n)\}的折线弧长参数方程x(s),s[s1,sn]x(s), s\in [s_1,s_n], 且满足x(sk)=(sk,xk)x(s_k)=(s_k,x_k).

问题求解

同之前的一般折线参数方程一样, 这里只需要修改下基函数即可, 把之前的等距"山形"折线基函数, 改成更为一般性的非等距"山形"折线基函数

非等距"山形"折线基函数如下

ϕk(x)={1hk1(xsk1),x[sk1,sk]1hk(xsk+1),x[sk,sk+1]0,else\phi_{k}(x)=\begin{cases} \frac{1}{h_{k-1}}(x-s_{k-1}), &x\in [s_{k-1},s_k]\\ -\frac{1}{h_{k}}(x-s_{k+1}) , &x\in[s_k,s_{k+1}]\\ 0, &\text{else}\end{cases}

其中k=1,2,,nk=1,2,\cdots,n, 以及hk=sk+1skh_k=s_{k+1}-s_k, 此外h0=hn=1h_0=h_{n}=1

该基函数对应等价的绝对值函数的形式为

ϕk(x)=12hk1xsk1(12hk1+12hk)xsk+12hkxsk+1\phi_{k}(x)=\frac{1}{2h_{k-1}}|x-s_{k-1}|-\left(\frac{1}{2h_{k-1}}+\frac{1}{2h_k}\right)|x-s_k|+\frac{1}{2h_{k}}|x-s_{k+1}|

同样有

L(s)=k=1nxkϕk(s),s[s1,sn]L(s)=\displaystyle\sum_{k=1}^nx_k\phi_k(s), s\in[s_1,s_n]

应用

应用一

绘制点列{(1,1),(2,1),(3,2)}\{(1,1),(2,-1),(3,2)\}的折线图

GeoGebra代码如下

Lk = {0,-1,2}
f(x)=Sum(Lk(k)(abs(x-k+1)/2-abs(x-k)+abs(x-k-1)/2),k,1,length(Lk))

或用内置的Function指令

f(x)=Function({1,3,1,-1,2})

或用内置的LineGraph指令

f(x)=LineGraph({1,2,3},{1,-1,2})

应用二

绘制点列{(0,0),(1,0),(0,1),(1,1),(0,0)}\{(0,0),(1,0),(0,1),(-1,-1),(0,0)\}的弧长参数图

GeoGebra代码如下

Lp={(0,0),(1,0),(0,1),(-1,-1),(0,0)}
Lx=x(Lp)
Ly=y(Lp)
L1 = zip(abs(Lp(k)-Lp(k-1)),k,2..Length(Lp))
Lh = 0.5/join({1},L1,{1})
Ls = zip(polyline(take(Lp,1,k)),k,1..Length(Lp)) 
L = join({-1},Ls,{Ls(-1)+1})
bx(x)=Sum(Lx(k)*(abs(x-L(k))*Lh(k)-abs(x-L(k+1))*(Lh(k)+Lh(k+1))+abs(x-L(k+2))*Lh(k+1)),k,1,Length(Lp))
by(x)=Sum(Ly(k)*(abs(x-L(k))*Lh(k)-abs(x-L(k+1))*(Lh(k)+Lh(k+1))+abs(x-L(k+2))*Lh(k+1)),k,1,Length(Lp))
curve((bx(t),by(t)),t,0,Ls(-1))

上面的代码做成的折线弧长参数方程的GeoGebra工具参考
https://www.geogebra.org/classic/kzm9jkt3

或者直接用GeoGebra内置的LineGraph简单明了

Lp={(0,0),(1,0),(0,1),(-1,-1),(0,0)}
Ls=zip(polyline(take(Lp,1,k)),k,1..Length(Lp)) 
f(x)=LineGraph(Ls,x(Lp))
g(x)=LineGraph(Ls,y(Lp))
a=Curve(f(t),g(t),t,0,Ls(-1))

如果不要弧长参数方程, 只需简单的把Ls的值替换为

Ls=0..Length(Lp)-1

总结与反思

  • 折线动点的参数方程可以直接用绝对值基函数构造出来

  • 在GeoGebra里绘制折线参数方程, 推荐用内置的 LineGraph 函数

  • 机器学习中的折线类激活函数, 都可以用绝对值函数和线性函数表示出来, 例如

    ReLu(x)=x+x2\mathrm{ReLu}(x)=\dfrac{x+|x|}{2}

    HardTanh(x)=x+1+x12\mathrm{HardTanh}(x)=\dfrac{|x+1|+|x-1|}{2}

    所以直接用绝对值函数作为激活函数效果也会很不错, 或者选个折中方案, 就是向量的某些分量不执行激活函数, 其余的执行绝对值激活函数.


参考资料:
https://kz16.top/geogebra/pd.html
https://kz16.top/geogebra/vp.html

本文来源:https://kz16.top/geogebra/polyarc.html

本站及相关链接所有内容只用于学习交流,欢迎非商业转载

转载请指明来源