MATLAB - 尝试进行多项式插值,但我得到一个全是零的矩阵(几乎)

MATLAB - Trying to do polynomial interpolation but I get a matrix full of zeros (almost)

我正在尝试编写一些执行多项式插值的代码,但我无法让它工作。我是一名学生,我遵循此视频 https://www.youtube.com/watch?v=VpI-wC94RKw 中的逻辑,以便在 Matlab 中以代码形式重新创建它,但每当我尝试创建我自己的视频中显示的矩阵版本时,我都会得到几乎完全由零填充的矩阵(一个元素除外)。我不明白为什么会这样。

我的代码:

x=[150, 200, 300, 500, 1000, 2000, 99999]';
y=[2, 3, 4, 5, 6, 7, 8]';

function f = interPoly(x,y)
    % Skapar en matris A var varje rad är [x_1^6, x_1^5,..., 1] till [x_n^6, x_n^5,..., 1]
    A = [x.^6 x.^5 x.^4 x.^3 x.^2 x ones(numel(x),1) y];
    % Gaussar matris A
    R = rref(A);
    % Plockar sista kolumnen ur R
    c = R(:,end);
    f = c(1)*x.^6+c(2)*x.^5+c(3)*x.^4+c(4)*x.^3+c(5)*x.^2+c(6)*x+c(7);
end

(矩阵 'A' 是这里有问题的一个。我最后得到的函数也只是用零作为值填充。也很抱歉评论是瑞典语)

我在 x 和 y 中有 7 个值,因此是一个 6 阶多项式,但我真的不知道倒数第二列中的常量应该是什么,所以我只是在那里放了一堆(我是对此很陌生,所以我对逻辑有点不确定)。

无论如何,我已经尝试过将相同的函数与其他一些输入数据一起使用,并且效果很好。

替代输入数据:

x=[0, 0.5, 1, 1.5, 2, 2.99, 3]';
y=[0, 0.52, 1.09, 1.75, 2.45, 3.5, 4]';

是否因为元素溢出而给我零(例如 99999^6 是一个非常大的数字)?我真的不明白这里发生了什么,以及为什么它在处理一组不同的输入数据时工作得很好。帮忙?

谢谢!

编辑:这项任务的全部意义(由我的学校提供​​)是将 "least squares" 方法(我也为其编写了代码但未发布)与多项式插值方法(在上面的代码)。上面 'x' 中的最后一个值应该是无穷大 (f(inf)=8) 所以我只是用一个非常大的数字替换它,因此它不是 "evenly" 分布的原因。有更好的方法吗?

在您的示例中,您得到以下 R 的矩阵:

   1.00000   0.00000  -0.00000  -0.00000  -0.00000  -0.00000  -0.00000  -0.00000   1.6925e-05
   0.00000   1.00000   0.00051   0.00000   0.00000   0.00000   0.00000   0.00000   7.1286e-05
   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   5.4078e-04
   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   6.9406e-03
   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   2.2098e-01
   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   7.0000e+00
   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   8.0000e+00

如果您定义的方程组有一个唯一解,那么您应该有一个单位矩阵(右边有这个附加列)。在你的情况下,你有(从前两行开始)方程式

0 == 5.4078e-04
0 == 6.9406e-03
0 == 2.2098e-01
0 == 7.0000e+00
0 == 8.0000e+00

这表明您的系统承认解决方案。这是由于您选择的输入在理论上可能有解,但实际上数值属性非常糟糕。事实上,如果我们计算条件数 cond(A),我们会得到一个 4.3691e+06 的值,这对于如此小的矩阵来说非常糟糕。这很可能是由于您的 x 值分布不均所致。 (您正在尝试解决 Vandermonde system。)如果您以更 "evenly" 的分布式方式解决问题,事情看起来会好很多。

除此之外,您的代码看起来还不错,但您可能想要使用用于定义它们的值以外的值来评估 插值函数。此外,这种 "exact" 方法在数值上不是很理想,因此可能值得使用比 rref 更稳定的算法来求解系统,例如 qr 分解。我建议进行以下更改:

function f = interPoly(x,y,xnew)
    A = [x.^6 x.^5 x.^4 x.^3 x.^2 x ones(numel(x),1)];
    [q,r] = qr(A);
    c = r\(q' * y);
    disp(cond(A));
    f = c(1)*xnew.^6+c(2)*xnew.^5+c(3)*xnew.^4+c(4)*xnew.^3+c(5)*xnew.^2+c(6)*xnew+c(7);
end

x=[150, 200, 300, 500, 1000, 2000, 99999]';
y=[2, 3, 4, 5, 6, 7, 8]';


disp(interPoly(x,y,x+eps));

Try it online!