# 向量值函数
此示例说明如何使用向量值样条绘制穿过给定点的曲线。
曲线拟合工具箱支持向量值样条。比如,如果您想要样条曲线穿过平面点 (x[i],y[i]),i=1,...,n 则接下来的代码定义了一些数据然后构造与绘制了这样的样条曲线,这是使用弧长参数和带有非扭结断点条件的三次样条插值完成的。
using TyPlot
using TyCurveFitting
using TyMath
x = [19 43 62 88 114 120 130 129 113 76 135 182 232 298 348 386 420 456 471 485 463 444 414 348 275 192 106 30 48 83 107 110 109 92 66 45 23 22 30 40 55 55 52 34 20 16]
y = [306 272 240 215 218 237 275 310 368 424 425 427 428 397 353 302 259 200 148 105 77 47 28 17 10 12 23 41 43 77 96 133 155 164 157 148 142 162 181 187 192 202 217 245 266 303]
xy = [x;y]
df = diff(xy,dims=2)
t = cumsum(vec([0 sqrt.([1 1]*(df.*df))]))
cv = csapi(t,xy)
fnplt(cv)
hold("on")
plot(x,y,"o")
hold("off")
如果您想要知道这个曲线包围的区域,或者说计算积分
area = diff(fnval(fnint(fncmb(fncmb(cv,[0 1]),'*',fnder(fncmb(cv,[1 0])))),fnbrk(cv,"interval")),dims=2)[1]
area = 131466.5282263998
大概解释一下, y=fncmb(cv,[0 1]) 提取出了 cv 中的曲线的第二个组成部分,Dx = fnder(fncmb(cv, [1 0])) 提供了第一个组成部分的微分, yDx = fncmb(y,'*',Dx) 构造了它们的逐点乘积。IyDx = fnint(yDx) 构造了 yDx 的不定积分,最后 diff(fnval(IyDx,fnbrk(cv,"interval")),dims=2)[1] 在基本区间的端点计算不定积分并作差,由此得到了 yDx 在基本区间上的定积分。结果的正负取决于包围区域是在曲线上的点跟着参数运动时的左边还是右边。(即运动是顺时针还是逆时针)。
而且固定 Y 所有位于 cv 中的样条曲线上的点 (X,Y) 都可以由以下命令得到:
X = 250
Y = fnval(fncmb(cv,[0 1]),mean(fnzeros(fncmb(fncmb(cv,[1 0]),'-',X)),dims=1))
Y = 1×2 Matrix{Float64}:
423.49 9.48125
大概解释一下,x = fncmb(cv,[1 0]) 取出了 cv 中的曲线的第一个组成部分, xmX = fncmb(x,'-',X) 施加了 X 表示的变换。t = mean(fnzeros(xmX)) 提供了所有使得 xmX 为 0 的参数值,即,曲线的第一个组成部分等于 X 的值,y = fncmb(cv,[0 1]) 提取出了 cv 中的曲线的第二个组成部分,最后,Y = fnval(y,t) 计算出了第一个组成部分等于 X 的参数值时曲线的第二个组成部分。
向量值函数使用的另一个例子,假设您已经知道了粒子在一个特定的场中在平面的运动,即在时间