#多项式 # #曲线 #处理 #方法 # #

app polynomial_subspaces

处理环 R[X] 的子空间的一般方法,其中 R 是某个环

1 个不稳定版本

新版本 0.0.1 2024 年 8 月 23 日

#8#基础

Download history 78/week @ 2024-08-17

79 每月下载量

MIT 许可证

220KB
6K SLoC

简介

总体而言,这是关于处理环 R[X] 的子空间的一般方法。有多个功能标志,因此您可以专注于您需要的部分。

环 R 是泛型 Generic1DPoly 的一个泛型,所有主要关注对象都实现了该泛型。

它必须是一个环。这是通过其实现某些核心操作来强制执行的。

  • 克隆
  • 取反
  • 加赋值
  • 乘赋值
  • 从(i8 的别名,转换是 Z -> R 的限制,仅限于这些小整数)

可以对多项式子空间执行以下操作

  • 创建零多项式作为该子空间的一个元素
  • 尝试创建单项式 X^n,这可能失败,如果子空间不包括该特定多项式
  • 查询该多项式是否为零或常数
  • 在特定点上评估,对于 -1,0,1 有特殊版本,其中评估可能以更快的速度进行
  • 尝试取两个多项式的乘积,如果乘积会超出子空间,则可能失败
  • 求导,如果子空间在 d/dX 下不是闭合的,或者如果多项式存储的方式不利于求导,则可能失败
  • 线性近似给定的多项式,这可能因为求导失败或构造 X^1 失败而失败
  • 如果子空间明确是某个多项式基的系数,那么我们还可以列出该基并重置单个系数。如果不是以这种方式存储,则返回错误
  • 加赋值,加, 减赋值,减 用于常数多项式的加减
  • , 加赋值,减, 减赋值 对于子空间在加减下是闭合的
  • 乘赋值,乘, 取反 用于与基环中的标量相乘

零点

在这样的子空间中,我们还可以根据代数基本定理实现基本定理。对于具有这种特性的子空间,我们有一个寻找零点的方法,该方法要么返回零点及其重数(仅在T本身内部,不扩展到扩展域),要么在多项式是零多项式或零点无法确定的情况下返回FindZeroError。这种情况会在阿贝尔-鲁菲尼不可解性出现时发生。在这个方法中,我们必须提供在相关的二次方程或卡尔丹公式中需要的平方根和立方根函数。它们都返回选项,以考虑通用环R不是代数闭域/没有单位根等情况。在实现Generic1DPoly时,我们不对R的类型约束施加此类限制。复杂的平方根和立方根函数仅作为输入,并且仅在实现基本定理时相关。

单项式基

密集

DenseMonomialBasisPolynomial<const N: usize, R>提供了最明显的此类子空间,其中我们存储了从X^0到X^{N-1}的系数。const泛型意味着我们始终可以保证保持在这样一个有界度的子空间内。实现是显而易见的,并使用fast_polynomial包。

对称基

对称基在贝塞尔曲线的上下文中很有用。这是因为我们希望有一个简单的方法来优先考虑0和1作为特殊点,作为参数化曲线区间的端点。这个基是(1-t),t,(1-t)*s,t*s,(1-t)*s^2,t*s^2等等。这里s是t*(1-t)的量。

同样还有一个const泛型,描述了我们将在子空间中包含多少个这样的基向量。在贝塞尔上下文中,这通常由7个限制,所以N=8给出了类型级别的约束,即我们始终只处理这样的低阶多项式。

二维曲线

我们可以考虑这样的曲线,使用TwoPolynomials<R, P>,我们得到两个多项式表示x和y分量,这两个多项式都在P描述的子空间中。我们可以执行与单个多项式相对应的操作,这些多项式来自对每个坐标的操作。

因为这些是向量值,我们可以考虑它们的点积和叉积,以回到适当子空间中的单个多项式。

如果我们使用GADT标志,那么乘法的实现使用const泛型N上的求和操作,该泛型描述了子空间中的最大度数。然后,乘法使用编译时操作对这些界限进行操作,以获得适当的高阶。GADT标志需要不稳定泛型const_exprs,所以如果那样做的话,需要+nightly。

如果我们不使用GADT标志,那么在执行点积和叉积时发生的多项式乘法只是截断乘法,我们只是尝试乘以子空间中的两个元素,但如果我们不再在子空间内,则返回Err。

我们可以请求曲线在切线和/或法线于位移从某一点时时的参数值。此外,我们还可以找到那些与另一条曲线碰撞的参数值(不是曲线的像相交,这将是一条曲线的两个独立参数)。还有关于曲率和速度(名称来自R是实数的情况,但一般来说,函数仍然有效,尽管没有这样的可解释性)。当使用点积或叉积时,有关GADT标志的相关注意事项仍然适用。

贝塞尔

这是位于bezier功能标志之后。这不仅是因为这里的功能,还因为依赖于bezier-rs和glam。

如果我们想这样做,我们可以用上面的多项式对来描述二维到立方的贝塞尔曲线,特别是使用对称基。这提供了从使用控制点而不是分量多项式的 bezier-rs 包中的贝塞尔曲线的转换。转换后,我们可以像上面那样对 TwoPolynomials 进行所有操作。

三维曲线

与曲线作为多项式映射 R -> R^3(R 不一定是实数,但一些函数的名称在此上下文中)类似。唯一的区别是,叉积不是一个隐式乘以单位 z 向量的单一多项式。相反,它属于同一个 ThreePolynomials 的成员。否则,2D 曲线的相应描述可以不变地转换过来。

Jacobi

这对通用目的来说没有用,所以它位于 jacobi 功能标志后面。

Jacobi 多项式是一组多项式空间的常用正交基。在这里,T 更加专业化。它现在必须是一个域,因此它实现了 Div 核操作,并且它必须有特殊的常数,如 pi 的平方根。这并不意味着我们只能限于浮点数和复数这样的类型。我们仍然从剩余的泛型中获得利益,因为我们可以在不进行任何更改的情况下启用符号表达式使用相同的实现。

Jacobi 多项式的参数是 alpha 和 beta。但它们通常是半整数值,至少为 -1/2。这允许我们仍然使用 usize const 泛型来固定这些值在类型中,尽管需要进行一些移位和缩放。

这个子空间再次限制了包含在子空间中的 Jacobi 多项式的次数,从 P_0^{alpha,beta} 到 P_{N-1}^{alpha,beta}。

Gegenbauer

这提供了一个类型别名,其中 alpha 和 beta 被设置为相等。

勒让德

这提供了一个类型别名,其中 alpha 和 beta 都设置为 0。

切比雪夫

这提供了一个类型别名,其中 alpha 和 beta 都设置为 -1/2。警告:这与通常的正常化不同,因为它只是一个类型别名,并且它们实际上被当作相应的 Jacobi 多项式的系数来处理。

Pade

这位于 pade 的功能标志后面。这是 PadeApproximant 的结构体。这涵盖了 R(X) 的情况,我们描述了分子为某种类型的 P,分母为某种类型的 Q。P 和 Q 是实现 Generic1DPoly 的类型。这意味着我们可以执行所有常规评估、查询有理函数是否为 0 或常数以及尝试线性逼近它(如果 P 和 Q 描述的子空间无法因任何原因微分,则可能失败)。

内积

我们可以要求相关的子空间在某个内积下是封闭的。这在基 R 是实数且存在一些加权和积分配对的正交多项式上下文中尤其如此。

在许多应用中这不是必需的,因此这位于正交功能后面。如果您启用 jacobi,这也会被启用,因为 Jacobi 多项式是显式的正交多项式系统。

依赖项

~0.1–1.2MB
~33K SLoC