求平面点列的折线弧长参数方程
Author : zbzhen, Modified : Mon Nov 20 19:39:50 2023
为了方便, 先考虑普通的折线参数方程, 对于弧长参数方程可同理类似求出.
已知平面点列{A1(x1,y1),A2(x2,y2),⋯,An(xn,yn)}, 求经过这n个点的折线参数方程L(t), 使得L(k)=(xk,yk),k=1,2,⋯n.
只需要求过点列{(1,x1),(2,x2),⋯,(n,xn)}的折线参数方程x(t), 且满足x(k)=xk; 以及求过点列{(1,y1),(2,y2),⋯,(n,yn)}的折线参数方程y(t), 且满足y(k)=yk. 于是
L(t)={x(t)y(t),t∈[1,n]
很显然, 当n比较小的时候, 可以直接给出分段折线参数方程; 但是当n比较大的时候, 如果继续采用分段折线参数方程, 用编程语言实现以及画图可能会有点麻烦.
根据前面的分析, 只需考虑x(t), 参数方程y(t)可同理得出.
利用线性有限元基函数的思想, 先构造"山形"折线基函数如下
ψk(x)=⎩⎨⎧x−(k−1),(k+1)−x,0,x∈[k−1,k]x∈[k,k+1]else
其中k=1,2,⋯,n,
很显然, 折线基函数ψk(x)满足ψk(k)=1, 并且不难验证
x(t)=k=1∑nxkψk(t).
事实上, 很容易验证下面两条性质:
一是这样构造的函数是分片线性函数, 也就是函数在每个小区间[k,k+1]上的表达式都是一次函数;
二是这样构造的函数满足x(k)=xk.
为了使得程序的简洁性, 这里可以直接把折线基函数改写成绝对值函数的形式, 即
ψk(x)=21∣x−k+1∣−∣x−k∣+21∣x−k−1∣
于是
x(t)=k=1∑nxk(21∣x−k+1∣−∣x−k∣+21∣x−k−1∣)
如果想提高程序运行的效率, 上述公式可进一步整合改写.
有了前面的公式, 很容易用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)}, 求经过这n个点的折线弧长参数方程L(s).
只需要求过点列{(s1,x1),(s2,x2),⋯,(sn,xn)}的折线弧长参数方程x(s),s∈[s1,sn], 且满足x(sk)=(sk,xk).
同之前的一般折线参数方程一样, 这里只需要修改下基函数即可, 把之前的等距"山形"折线基函数, 改成更为一般性的非等距"山形"折线基函数
非等距"山形"折线基函数如下
ϕk(x)=⎩⎨⎧hk−11(x−sk−1),−hk1(x−sk+1),0,x∈[sk−1,sk]x∈[sk,sk+1]else
其中k=1,2,⋯,n, 以及hk=sk+1−sk, 此外h0=hn=1
该基函数对应等价的绝对值函数的形式为
ϕk(x)=2hk−11∣x−sk−1∣−(2hk−11+2hk1)∣x−sk∣+2hk1∣x−sk+1∣
同样有
L(s)=k=1∑nxkϕk(s),s∈[s1,sn]
绘制点列{(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)}的弧长参数图
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)=2x+∣x∣
HardTanh(x)=2∣x+1∣+∣x−1∣
所以直接用绝对值函数作为激活函数效果也会很不错, 或者选个折中方案, 就是向量的某些分量不执行激活函数, 其余的执行绝对值激活函数.
参考资料:
https://kz16.top/geogebra/pd.html
https://kz16.top/geogebra/vp.html
本文来源:https://kz16.top/geogebra/polyarc.html
本站及相关链接所有内容只用于学习交流,欢迎非商业转载
转载请指明来源