lsqcurvefit拟合结果为复数_非线性拟合怎么转化为线性拟合?
生活随笔
收集整理的這篇文章主要介紹了
lsqcurvefit拟合结果为复数_非线性拟合怎么转化为线性拟合?
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1. 前言
對(duì)于多項(xiàng)式函數(shù),可以用最小二乘法求得精確的擬合結(jié)果,使得擬合函數(shù)具有全局最優(yōu)的擬合誤差;對(duì)于某些非線性函數(shù),如指數(shù)函數(shù)
,也可以對(duì)函數(shù)轉(zhuǎn)化后,求得精確的擬合結(jié)果,如上述指數(shù)函數(shù)可轉(zhuǎn)化為 ,同樣可以求得具有全局最優(yōu)擬合誤差的擬合函數(shù)。上述函數(shù)都可以用MATLAB的regress函數(shù)或者polyfit函數(shù)求得最優(yōu)的擬合結(jié)果,或者可以用廣義逆矩陣的最小二乘解計(jì)算而得。但是,對(duì)于大多數(shù)非線性函數(shù),難以求得擬合誤差全局最優(yōu)的擬合結(jié)果,形如 。這一類函數(shù),一般做法是首先預(yù)估擬合函數(shù)的參數(shù),以此作為初始值,采用迭代優(yōu)化的方法求出局部最優(yōu)的擬合參數(shù),MATLAB中用lsqcurvefit或者nonlinfit函數(shù)求出擬合函數(shù),擬合結(jié)果的準(zhǔn)確性由選取的初始點(diǎn)決定,初始點(diǎn)的選取極為困難。
2. 非線性擬合轉(zhuǎn)化為線性擬合
對(duì)于大多數(shù)指數(shù)函數(shù)、三角函數(shù)、多項(xiàng)式函數(shù)通過四則運(yùn)算或者復(fù)合得到的函數(shù),通常可以用線性微分方程來表示,形如
的常系數(shù)線性微分方程則可以表示以下形式的函數(shù):① ② ③ 。對(duì)于上述非線性函數(shù),則可以通過擬合線性微分方程的系數(shù),再計(jì)算出對(duì)應(yīng)的非線性函數(shù)的參數(shù),并利用樣本數(shù)據(jù)作為初始條件,擬合出函數(shù)中的其他常數(shù)項(xiàng),如下面步驟。
微分方程需要轉(zhuǎn)化為差分方程:① ;② 。
通過擬合方程 則可得到a和b,再通過求解二次方程 ,得到兩個(gè)解r1和r2。
當(dāng)r1和r2不相等時(shí),則可得到函數(shù) ,再利用樣本數(shù)據(jù)線性擬合則可得到C1和C2。
當(dāng)r1=r2時(shí),可得到函數(shù) ,再利用樣本數(shù)據(jù)線性擬合則可得到C1和C2。
當(dāng)r1和r2為共軛復(fù)數(shù)時(shí),可得函數(shù) ,其中a和b分別為r1的實(shí)部和虛部,再利用樣本數(shù)據(jù)線性擬合則可得到C1和C2。
實(shí)例MATLAB代碼如下:
% 產(chǎn)生樣本數(shù)據(jù) x = linspace(0,98,50)'; y = 0.9*exp(-0.2*x)-0.3*exp(-0.06*x)+10.57; plot(x,y) % 計(jì)算差分 dyx = (y(3:end) - y(1:end-2))./(x(3:end) - x(1:end-2)); ddyx = (y(3:end) - 2*y(2:end-1) + y(1:end-2))./(x(3:end) - x(1:end-2)).^2*4; % 擬合微分方程系數(shù) A = [dyx,y(2:end-1),-1*ones(length(dyx),1)]; b = -ddyx; a = (A.'*A)A.'*b; a(3) = a(3)/a(2); % 求解二次方程 syms r r0 = double(solve(r^2+a(1)*r+a(2))) % 線性擬合得到常數(shù)項(xiàng)C1,C2 A = [exp(r0(1)*x),exp(r0(2)*x)]; C = (A.'*A)A.'*(y-a(3)) % 作圖 hold on plot(x,C(1)*exp(r0(1)*x)+C(2)*exp(r0(2)*x)+a(3),'r.')最后,還可以用lsqcurvefit函數(shù)進(jìn)一步優(yōu)化擬合結(jié)果,采用上述方法得到的參數(shù)作為初始點(diǎn),可以修正差分方程擬合導(dǎo)致的誤差。
f = @(b,x)b(1)*exp(b(2)*x)+b(3)*exp(b(4)*x)+b(5); b0 = [C(1);r0(1);C(2);r0(2);a(3)]; b1 = lsqcurvefit(f,b0,x,y) hold on plot(x,f(b1,x),'k.')總結(jié)
以上是生活随笔為你收集整理的lsqcurvefit拟合结果为复数_非线性拟合怎么转化为线性拟合?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 100行的python作品详解_不到 1
- 下一篇: 二分类最优阈值确定_机器学习 | 详解G