函式逼近方法

2021-06-28 08:08:37 字數 4274 閱讀 5606

1 函式逼近 vs 函式插值

函式逼近與函式插值既有相同點,又有不同點。

1.1 相同點

二者都是對實際用的複雜函式構造乙個既能反映函式本身的特性,又便於計算的簡單函式,近似代替原來的函式[15]p137。

1.2 不同點

1.2.1  函式插值

函式插值是對一組離散點(xi, f(xi))(i = 0, 1, 2,...n),選定乙個便於計算的簡單函式形式p(x),要求簡單函式p(x)滿足p(xi) = f(xi)(i = 0, 1, 2, ..., n),由此確定函式p(x)作為f(x)的近似函式,詳見《函式插值方法》。

1.2.2 函式逼近

函式逼近式對實際中的複雜函式f(x),構造乙個簡單函式p(x),要求其誤差從整體上在某種度量意義下最小。

1.3 應用

函式逼近,比較普遍的應用就是離散資料曲線擬合。下面將重點討論如何通過matlab來實現曲線擬合。

2 二維曲線擬合

有兩種思路:(1)對應已知的x、y資料,通過擬合找到乙個標準曲線公式,這條曲線盡可能的進過已知的x、y座標點;(2)對於已知的x、y座標,通過插值的方法確定它們之間的座標。下面將分別對這兩種方法進行舉例分析。

2.1 多項式擬合——polyfit

2.1.1 **及效果    

參考資料[1][5]介紹了使用polyfit對二維離散點進行多項式擬合的方法。擬合得到的結果是多項式各項的係數(儲存在下面**中的p變數中),具體**如下所示。

clear

clc%% 原始散點

t = [1 : 16];

y = [4 6.4 8 8.4 9 9.28 9.5 9.7 9.86 10.2 10.32 10.42 10.5 10.55 10.58 10.6];

plot(t, y, 'o');

%% 二次多項式擬合

p = polyfit(t, y, 2);

hold on

plot(t, polyval(p, t), 'r'); % 畫多項式影象

%% 三次多項式擬合

p = polyfit(t, y, 3);

hold on

plot(t, polyval(p, t), 'k'); % 畫多項式影象

%% 四次多項式擬合

p = polyfit(t, y, 4);

hold on

plot(t, polyval(p, t), 'm'); % 畫多項式影象

%% 十次多項式擬合

p = polyfit(t, y, 10);

hold on

plot(t, polyval(p, t), 'c'); % 畫多項式影象

%% 圖例

legend('原始散點', '二次多項式擬合', '三次多項式擬合', ...

'四次多項式擬合', '十次多項式擬合')

擬合效果如下圖,

圖1根據上圖的結果可知,多項式的次數越高,擬合出來的曲線所經過的位置就越接近原離散點。

2.1.2 侷限

上述擬合方法只能擬合xy座標都是一一對應的資料,如果乙個x座標對應有多個y座標,擬合效果

非常差,如下圖所示。

圖22.2 非線性擬合lsqcurvefit、nlinfit

參考資料[2]介紹了使用maltab中的lsqcurvefitnlinfit這兩個函式來進行曲線擬合,主要過程是:自定義乙個曲線函式,其中的引數/係數未知(如y=a*sin(x)*exp(x)-b/log(x)中的a和b係數),通過利用已知的x、y資料進行擬合得到a、b的值,如下所示:

%% 原資料

x=2:10;

y=8*sin(x).*exp(x)-12./log(x);

a=[1 2];

%% 待擬合公式

f=@(a,x)a(1)*sin(x).*exp(x)-a(2)./log(x);

%% 第一種方法使用lsqcurvefit

lsq_fit = lsqcurvefit(f,a,x,y);

%% 第二種方法使用nlinfit

nlin_fit = nlinfit(x,y,f,a);

上述擬合得到的結果都是[8 12],和原資料中給公式指定的引數一致。

2.3 spline插值

已知道少量的x、y座標,可以通過插值的方式確定這些座標之間的其餘座標。

1.3.1 實現和效果

**如下所示。

x = 0:10;

y = sin(x);

xx = 0:.25:10;

yy = spline(x,y,xx);

plot(x, y, 'o', xx, yy, '-r')

legend('原始點','插值結果')

上述**的執行結果如下:

圖32.3.2 侷限

如果x、y座標的分布像圖2的藍色離散點那樣(x座標並非遞增的,乙個x座標有可能對應2個y座標),插值提示錯誤:

圖43 三維曲線擬合

3.1lsqcurvefit/nlinfit

根據參考資料[2]的說明,lsqcurvefitnlinfit不僅可以用於一元函式的擬合(如上述1.2小節所示),還可以對多元函式進行擬合,也就是三維擬合。例如對z=a*(exp(y)+1)-sin(x)*b進行擬合,確定引數ab,**如下:

%% 原資料

x=2:10;

y=10*sin(x)./log(x);

z=4.5*(exp(y)+1)-sin(x)*13.8;

%% 待擬合公式

f=@(a,x)a(1)*(exp(x(2,:))+1)-sin(x(1,:))*a(2);

%% 第一種方法使用lsqcurvefit

lsqcurvefit(f,[1 2],[x;y],z) %注意這裡面的[x;y],這裡的[1 2]表示我們設定f函式裡的初始值a(1)=1,,a(2)=2

%% 第二種方法使用nlinfit

nlinfit([x;y],z,f,[1 2])

擬合結果如下所示:

根據參考資料[3]的提示,我們還可以使用gui工具sftool來完成這個任務。

參考資料

[1]matlab——多項式擬合

[2]非線性擬合lsqcurvefit、nlinfit

[3]matlab多項式擬合

[4]曲線擬和函式lsqcurvefit&nlinfit

[5]matlab曲線擬合

[6]曲線擬合

[7]matlab多項式函式擬合和曲線擬合

[8]最小二乘法與曲線擬合

[9]matlab spline 三次樣條插值多項式表示式問題

[10]matlab樣條工具箱(spline toolbox)與曲線擬合

[11]三維離散點進行曲線擬合 

[12]請問將一批離散的點(二維平面上)擬合為曲線目前有哪些比較新的方法?

[13]曲線擬合 

[14]已知三個離散點,如果擬合曲線?

[15]計算方法(第2版),電子工業出版社

函式逼近問題

函式論的乙個重要組成部分,涉及的基本問題是函式的近似表示問題。在數學的理論研究和實際應用中經常遇到下類問題 在選定的一類函式中尋找某個函式g,使它是已知函式 在一定意義下的近似表示,並求出用g近似表示 而產生的誤差。這就是函式逼近問題。在函式逼近問題中,用來逼近已知函式 的函式類可以有不同的選擇 即...

用BP網路完成函式的逼近

用bp網路完成函式的逼近 此處主要為了演示效果,其中部分函式已經廢棄。具體如下 用bp網路完成函式的逼近 clf reset figure 1 p 1 1 1 t 為目標向量 t 0 0.314 6.28 t sin t plot p,t,title 訓練向量 xlabel 輸入向量 p ylabe...

BP神經網路的函式逼近

給出乙個非線性的函式,建立bp神經網路進行擬合影象,其中隱藏神經元的數目為,可以設定。bp神經網路的函式逼近k 2 x 1 05 8 f 1 sin k pi 2 x 建立bp神經網路結構 隱藏層為5 未訓練引數 n 10 net newff minmax x n,1 trainlm y1 sim ...