多项式逼近

计算科学 数值分析 统计数据 回归 多项式
2021-11-28 17:12:05

是否有任何通用方法可以为任何值填充此矩阵:n

A=[nxixi2xinxixi2xi3xin+1xinxin+1xin+2xin+n]

或者,使用 Vandermonde 矩阵计算多项式系数可能更容易?

我将不胜感激任何建议和 Fortran 代码。

2个回答

A是一个(n+1)×(n+1)矩阵。可以通过以下方式获得:

A=[1111x0x1x2xnx0nx1nx2nxnn][1x0x02x0n1x1x12x1n1xnxn2xin]

请注意,分解不涉及任何求和,并且可以使用简单的索引和幂运算轻松计算。矩阵乘法是计算最终矩阵的有效算子A. 这既有效又易于实施。

右边的矩阵只是一个添加了列(最右边)的Vandermonde 矩阵。这是实现此功能的 MATLAB 2-liner:

% x is the input column vector, n is the number of elements e.g. n=length(x)
W = [ fliplr(vander(x)) (x.^n)];
A = W'*W;

这应该比 MATLAB 中的 for 循环更快,因为vander函数不包含任何循环。它也绝对更短更干净。

我认为在这里快速发表评论很重要。与普遍的看法不同,当正确实施矩阵乘法时,O(N3), 但<O(N2.4). 许多可用的软件包已经非常优化。使用向量指令集以及并行化带来了进一步的加速。然而,理论上的复杂性从未达到O(N2)这是通过for循环实现的。这种方法在 MATLAB 中仅适用于小型矩阵(高达 ~ N<1500)。

还要注意,即使这里使用了矩阵表示法,乘法仍然可以从这些矩阵的特殊结构中受益。如果要利用这一特性,可以获得类似的复杂性。

您可以使用 for 循环轻松完成此操作。只需用于n定义您的循环限制。这是 MATLAB 的全功能解决方案(只需先定义 n 和 x):

%pre-allocate A
A = zeros(n+1);

%first row:
for j=0:n
    A(1,j+1)=sum(x.^j);
end

%rows 2 through n
for i=1:n
    A(i+1,1:n)=A(i,2:n+1); %copy from previous row
    A(i+1,n+1)=sum(x.^(n+i)); %compute last entry in row
end

此方法需要(2*n+1)*(2*numel(x))操作,因此如果x有大约n值该方法是O(n2)