【问题标题】:Cubic spline interpolation of function函数的三次样条插值
【发布时间】:2013-10-08 20:40:03
【问题描述】:

我正在尝试使用 MATLAB 函数 spline 插入以下函数,

在等距点xi = i./ni = 0,1,...,nn = 2^jj = 4,5,...,14

对于每个计算,我记录点 x = 0:0.001:1 的最大误差,并使用 loglog 绘图将这些误差与 n 进行对比。

下面是代码,

index=1

for j = 4:1:14;
    n = 2^j;
    i = 0:1:n;
    xi = i./n;
    yi = ((exp(3*xi))*sin(200.*(xi.^2))) ./(1+20.*(xi.^2));
    x = 0:.001:1;
    ye = ((exp(3*x))*sin(200*x.^2)) ./(1+20*x.^2);
    yp = spline(x,xi,yi);
    err = ye - yp;
    merr(index) = max(err);
    index = index+1;
end

n1 = 10:10:170;
loglog(n1, merr,'.')
xlabel('n');
ylabel('errors');
title('Cubic Splines');

但是当我运行代码时,我得到了以下错误:

错误使用 * 内矩阵尺寸必须一致。

(第 9 行)错误 yi = ((exp(3*xi))sin(200.(xi.^2))) ./(1+20.*(xi.^2));

我刚开始学习 MatLab,有人可以帮忙吗?

【问题讨论】:

  • 请注意,通常使用mean squared error 或至少使用abs 函数计算错误。在您的代码中,err = ye - yperr = abs(ye - yp) 给出不同的结果。
  • 你的'loglog'命令会抛出一个错误,因为numel(n1)~=numel(merr),但除此之外,我认为我的回答解释了你得到的错误信息和你会得到的spline错误。

标签: matlab interpolation


【解决方案1】:

您希望 element-wise multiplication (.*) 获得以下代码部分:

yi = ((exp(3*xi))*sin(200.*(xi.^2))) ./(1+20.*(xi.^2));

应该是

yi = ((exp(3*xi)).*sin(200.*(xi.^2))) ./(1+20.*(xi.^2));

ye 的计算也存在同样的问题。

当您使用 mtimes (*) 时,MATLAB 会尝试进行矩阵乘法,在您的情况下(1×n 乘以 1×n)是无效的。

然后你会遇到spline 命令的问题。将其更改为 yp = spline(xi,yi,x);,以便您要插入的值 (x) 是最后一个参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多