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