我了解到chebvander2d
和chebval2d
返回2D输入的Vandermonde矩阵和拟合值,而chebfit
返回1D输入序列的系数,但是如何获得系数二维输入系列?
答案 0 :(得分:0)
简短的回答:在我看来,这尚未实现。整个2D多项式看起来更像是具有某些存根函数的草稿(截至2020年6月)。
长答案(我是在寻找相同的东西,所以我挖得更深一些):
首先,这不仅适用于chebyshev
的所有多项式类,因此您也无法拟合“普通”多项式(幂级数)。实际上,您甚至无法构建一个。
要了解编程问题,让我以2级多项式为例,重新捕捉一下2D多项式作为数学公式的样子:
p(x,y)= c_00 + c_10 x + c_01 y + c_20 x ^ 2 + c11 xy + c02 y ^ 2
这里的c的索引是指x和y的幂(指数之和必须为<=度)。
首先要注意的是,对于度d,有(d + 1)(d + 2)/ 2个系数。
它们可以存储在矩阵的左上部分或一维数组中,例如按照上面的公式排列。
函数numpy.polynomial.polynomial.polyval2d之类的文档表明numpy需要矩阵变量:p(x,y)= sum_i,j c_i,j * x ^ i * y ^ j。
旁注:将矩阵的行索引i(“ y坐标”)用作x而不是y的指数可能会造成混淆;如果最终实现了i和j的角色,也许应该切换它,或者至少在文档中有注释。
这导致了核心问题:二维系数的数据结构没有在任何地方定义;像上面一样,只能间接地使用矩阵。但是与一维数组相比,这是浪费空间,多项式的求值采用两个嵌套循环,而不是一个。另外:是否必须使用np.zeros
初始化矩阵,或者所实现的函数是否确保不触摸右下部分以便可以使用np.empty
?
如果使用整个(d + 1)^ 2矩阵,如polyval2d
函数文档所建议,则多项式的次数实际上为d * 2(如果c_d,d!= 0)
为了对此进行测试,我想构造一个numpy.polynomial.polynomial.Polynomial
(是的,是多项式的三倍)并检查degree
属性:
import numpy as np
import numpy.polynomial.polynomial as poly
coef = np.array([
[5.00, 5.01, 5.02],
[5.10, 5.11, 0. ],
[5.20, 0. , 0. ]
])
polyObj = poly.Polynomial(coef)
print(polyObj.degree)
在到达打印语句之前,这给了ValueError: Coefficient array is not 1-d
。因此,尽管polyval2d
期望使用2D系数数组,但目前尚无法构造这样的多项式-至少不能像这样手动构建。有了这种见识,没有任何函数可以计算2D多项式的拟合度也就不足为奇了。