matlab 当我试图用多项式来逼近这个数据时,我哪里做错了?

ffdz8vbo  于 2022-11-15  发布在  Matlab
关注(0)|答案(2)|浏览(123)

在我的课程中,我开始学习使用MatLab进行数值分析。到目前为止,我们已经介绍了多项式插值(样条线、多边形拟合、约束样条线等)。我正在做这道练习题,我得不到正确的答案。我已经上传了我使用的代码和问题,我哪里做错了?提前谢谢!

close all; clear all; clc;
format long e

x = linspace(0,1,8);
xplot = linspace(0,1);
f = @(x) atan(x.*(x+1));
y_val = f(xplot);
c = polyfit(x,f(x),7);
p = polyval(c,0.7);
err = abs(f(0.7)-p)/(f(0.7))

我遇到的问题在图中可见

e4yzc0pl

e4yzc0pl1#

经过一番尝试后,这似乎是一个计算绝对误差的问题,而不是相对绝对误差的问题。
下面的代码将生成所需的答案。是的,从问题中很不清楚哪个错误是故意的。

% Definitions
format long e
x = linspace(0,1,8)';
xplot= linspace(0,1);
f = @(x) atan(x.*(x+1));
y_val = f(xplot);

% Degree of polynomial
n = 7;

% Points to evaluate function
point1 = 0.5;
point2 = 0.7;

% Fit
c= polyfit(x,f(x),n);

% Evaluate
approxPoint1 = polyval(c, point1);
approxPoint2 = polyval(c, point2);

% Absolute errors
errPoint1 = abs( f(point1) - approxPoint1)
errPoint2 = abs( f(point2) - approxPoint2)
nhaq1z21

nhaq1z212#

你做的错事是:
1.在计算误差时混合绝对值和相对值,以输入结果变量err
1.计算错误时不正确地放置abs()括号:您的abs()只修复分子,然后修复分母。要获得|f(0.7)|,还需要另一个abs(f(0.7))
用于点x=0.7而不是

err = abs(f(0.7)-p)/(f(0.7))

很可能仅仅是

err = abs(f(.7)-p));

1、考核点0.5只计算err。为了从可能的候选答案中进行选择,我们需要在0.5上选择err,在0.7上选择err,然后在所有提供的可能答案中,以正确的顺序匹配这两个对。
1.虽然用N-1次多项式逼近N点的多项式是很常见的,但用比N-1低的多项式来逼近低于满意的误差通常是可能的。
低次多项式意味着计算量更少,逼近点所花费的时间更少。如果一个人得到了一个足够公平的近似值,例如一个4次多项式,为什么要浪费时间计算一个一直到N-1的高次近似值?
因为这个问题没有说明什么次数应该有逼近多项式,所以你必须发现它覆盖了从1到合理阶数的所有多项式次数。
1.我发现的最后一个错误是,您使用了线性空间,但没有指定点数,然后,MatLab默认情况下会取100点,希望它会没事。
那么,在你的问题中,100分是一个太低的点数,我将在提供以下几行之后展示,就像前面提到的,横扫所有可能的近似多项式,而不是默认的你默认选择的100分。

np=8;                                  % numel(x) amount supplied points
N=1e3;                              % amount points x grid we build to measure f(x)
x= linspace(0,1,np);

xplot = linspace(0,1,N);
f = @(x) atan(x.*(x+1));       % function to approximate
y_val = f(xplot);                   % f(x)

xm=[.5 .7];                         % points where to asses error

% finding poly coeffs

err1=zeros(2,np+2);          % 1st row are errors on x=.5, 2nd row errors on x=.7

figure(1);
ax1=gca
hp1=plot(xplot,y_val)
grid on;
hp1.LineWidth=3;
hp1.Color='r';
hold on

for k=1:1:np+2
    
c = polyfit(x,f(x),k);   

p_01 = polyval(c,xm(1));
err1(1,k) = abs(f(xm(1))-p_01);
% err(1,k) = abs((f(0.5)-p_05)/(f(0.5)))

p_02 = polyval(c,xm(2));
err1(2,k) = abs(f(xm(2))-p_02);
% err(2,k) = abs((f(0.7)-p_07)/(f(0.7)))

plot(x,polyval(c,x),'LineWidth',1.5); %'Color','b');

end

err1



唯一按正确顺序匹配的误差对确实是7阶多项式误差,但总的最小误差对应于6阶逼近多项式。
在没有定义足够大的点数的情况下取linspace会发生什么情况?让我们来看看:

np=8;                                  % numel(x) amount supplied points
% N=1e3;                              % amount points x grid we build to measure f(x)
x= linspace(0,1,np);

xplot = linspace(0,1); %,N);
f = @(x) atan(x.*(x+1));       % function to approximate
y_val = f(xplot);                   % f(x)

xm=[.5 .7];                         % points where to asses error

% finding poly coeffs

err1=zeros(2,np+2);          % 1st row are errors on x=.5, 2nd row errors on x=.7

figure(1);
ax1=gca
hp1=plot(xplot,y_val)
grid on;
hp1.LineWidth=3;
hp1.Color='r';
hold on

for k=1:1:np+2
    
c = polyfit(x,f(x),k);   

p_01 = polyval(c,xm(1));
err1(1,k) = abs(f(xm(1))-p_01);
% err(1,k) = abs(f(0.5)-p_05)/abs(f(0.5))

p_02 = polyval(c,xm(2));
err1(2,k) = abs(f(xm(2))-p_02);
% err(2,k) = abs(f(0.7)-p_07)/abs(f(0.7))

plot(x,polyval(c,x),'LineWidth',1.5); %'Color','b');

end

err1

只有100分,所有的错误都太大了,没有一个错误接近1e-5或1e-6。
这就是为什么人们不知道该选哪一对,因为所有的值都是在距离着陆区至少5个数量级的地方获得的。
我正要添加一个带有图例的图,但这种特定方法的可视化在这种情况下是最具误导性的,因为在100点和1000点的两个图中,乍一看,无论使用多少网格点,误差都应该是相似的。
但如上所述,1E2点不能近似函数,就像一片漆黑,寻找什么东西,并从我们应该瞄准的地方指向180号手电筒,没有机会发现它。
然而,1e3网格点会产生一对与可能答案之一匹配的错误,这就是选项D。
我希望这对我有帮助,谢谢你阅读我的回答。

相关问题