我開始在我的課程中學習使用 MATLAB 進行數值分析。到目前為止,我們已經介紹了多項式插值(樣條、polyfit、約束樣條等)。我正在做這個練習題,但我無法得到正確的答案。我已經上傳了我使用的代碼和問題,我在哪里做錯了?提前致謝!
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))
我遇到的問題如圖所示
uj5u.com熱心網友回復:
經過一番嘗試,這似乎是計算絕對誤差而不是相對絕對誤差的問題。
下面的代碼產生了所需的答案。是的,從這個問題中還不清楚是哪個錯誤。
% 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)
uj5u.com熱心網友回復:
你做錯的是:
在計算誤差以提供結果變數時混合絕對值和相對值
err
。計算錯誤時錯誤地放置
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));
您只計算
err
評估點 0.5 。為了在似乎是 MATLAB Associate 測驗多項選擇答案的可能候選者中進行選擇,需要err
在 0.5 和err
0.7 上,然后在所有提供的可能答案中以正確的順序匹配這對。盡管使用次數多項式來逼近
N
點的多項式近似是常見的做法N-1
,但通常可以使用低于N-1
.
低次多項式意味著更少的計算,更少的時間逼近點。如果一個人獲得了一個足夠公平的近似值,例如 4 次多項式,為什么要浪費時間計算一個更高次的近似值N-1
?
由于該問題沒有說明近似多項式應該具有什么度數,因此您必須找到它從 1 到一個合理的順序掃描所有多項式度數。
- 我發現的最后一個錯誤是您使用了 linspace 而沒有指定點數,然后 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
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)/(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
只有 100 分,所有錯誤都太大了,在 1e-5 或 1e-6 附近沒有一個錯誤。
這就是為什么人們無法判斷要選擇哪一對的原因,因為所有獲得的值都在距離著陸區至少 5 個數量級的地方。
我正要包含一個帶有圖例的圖,但是在這種情況下,這種特殊方法的可視化在我看來充其量是誤導性的,就像在 100 和 1000 點的圖中,乍一看,兩者看起來好像錯誤應該無論使用多少網格點,都是相似的。
但是如上圖所示,1e2 點無法逼近函式,就像在一片漆黑中,尋找某物并將手電筒 180 指向我們應該瞄準的位置,而不是發現它的機會。
然而 1e3 個網格點會產生一對與其中一個可能的答案匹配的錯誤,這是選項 D。
希望對您有所幫助,感謝您閱讀我的回答。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/505847.html
下一篇:MATLAB曲面圖中的間隙