MATLAB的lsqcurvefit函數擬合非線性式子中的未知參數

2022-01-31 雲龍派

往往在實際問題中都存在exp(x)、lnx、sinx等多種函數組合的非線性經驗公式。

對此我們就可以通過lsqcurvefit函數進行求解,該函數的方法被稱為非線性最小二乘,損失函數一樣,只不過類似於優化算法,給定參數初始值,然後優化參數,非線性最小二乘模型如下,即目標函數。

lsqcurvefit函數擬合格式

格式 

x = lsqcurvefit(fun,a0,xdata,ydata)

x = lsqcurvefit(fun,a0,xdata,ydata,lb,ub)

x = lsqcurvefit(fun,a0,xdata,ydata,lb,ub,options)

[x,resnorm] = lsqcurvefit(…)

[x,resnorm,residual] = lsqcurvefit(…)

[x,resnorm,residual,exitflag] = lsqcurvefit(…)

[x,resnorm,residual,exitflag,output] = lsqcurvefit(…)

[x,resnorm,residual,exitflag,output,lambda]= lsqcurvefit(…)

[x,resnorm,residual,exitflag,output,lambda,jacobian] =lsqcurvefit(…)

參數說明:

在lsqcurvefit函數中,有trust-region-reflective和levenberg-marquardt兩種算法可以求解參數,其中默認採用信賴域(trust-region-reflective)算法。

a0為初始解向量, 因為求解是一個迭代的過程,需要先給定一個初始參數,再逐步修改參數的過程。所以要對a0初始化,一般而言,可以隨機,但是經驗上取與解接近的值會提高計算速度。

xdata,ydata為滿足關係ydata=F(a, xdata)的數據;

lb、ub為解向量的下界和上界lb≤a≤ub,若沒有指定界,則lb=[ ],ub=[ ];

options為指定的優化參數;

fun為待擬合函數,計算x處擬合函數值,其定義為 function F = myfun(a,xdata)

resnorm=sum ((fun(a,xdata)-ydata).^2),即在a處殘差的平方和;

residual=fun(a,xdata)-ydata,即在x處的殘差;

exitflag為終止迭代的條件;

output為輸出的優化信息;

lambda為解x處的Lagrange乘子;

jacobian為解x處擬合函數fun的jacobian矩陣。

f:符號函數句柄,如果是以m文件的形式調用的時候,別忘記加@.這裡需要注意,f函數的返回值是和y匹對的,即擬合參數的標準是(f-y)^2取最小值,具體看下面的例子

實例1:

clc;clear%清除變量y=[100.3    101.1   102.1   101.1   101.6   104.4   102.5   102.1   103.9   103.9];xdata=1:length(y);a0=[1,3,7,5,7];      %初始估計值,隨便寫  這個是4次擬合 ,具體表達式可以隨便改options=optimset('Tolfun',1e-15); %方法設定for i=1:1000x=lsqcurvefit(@fun1,a0,xdata,y,[],[],options);   %確定待定係數a0=x;%以計算出的x為初值,循環迭代1000次enddisp(x);%輸出係數yy = fun1(x,xdata);%利用已經擬合好的模型預測y值len=[1:20];len1 = fun1(x,len);%預測走勢result=[y;yy]%實際值與預測值error=abs(y-yy);%誤差bfb=error./y%相對誤差errorsum=sum(error)/length(y)%平均誤差bfbsum=sum(bfb)/length(y)%平均相對誤差figure(1)plot(xdata,y,'r-',xdata,yy,'b-')legend('實際值','擬合值')title('實際值與預測值的比較','fontsize',15)ylabel('Y','fontsize',15)xlabel('X','fontsize',15)%axis([1 10 1 200]);%坐標範圍%set(gca,『xtick』,[1 2 …10]);%X軸設定%set(gca,『ytick』,[1 20 40 …200]);%Y軸設定figure(2)plot(len,len1,'r-')legend('擬合曲線')title('擬合曲線圖','fontsize',15)ylabel('Y','fontsize',15)xlabel('X','fontsize',15)function y = fun1(a, x);y = a(1) + a(2)*x + a(3)*x.^2 + a(4)*x.^3 + a(5)*x.^4;end

結果:

實例2:

程序:

clc;clear all;close all;xdata = ... [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3];ydata = ... [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];fun = @(x,xdata)x(1)*exp(x(2)*xdata);x0 = [100,-1];x = lsqcurvefit(fun,x0,xdata,ydata)times = linspace(xdata(1),xdata(end));plot(xdata,ydata,'ko',times,fun(x,times),'b-')legend('Data','Fitted exponential')title('Data and Fitted Curve')

結果:

實例3:

用MATLAB程序擬合Logistic函數:

程序:

clearclcxdata=0:10:180;ydata=[0 0 0.45 2.7 5.4 5.7 10.5 10.8 9.6 12.15 16.65 18.15 19.05 28.2 29.1 21.1 19.95 22.05 25.2];%% 指定非線性函數擬合曲線X0=[100 10 0.2];[parameter,resnorm]=lsqcurvefit(@fun,X0,xdata,ydata); %指定擬合曲線A=parameter(1);B=parameter(2);C=parameter(3);fprintf('擬合Logistic曲線的參數A為:%.8f,B為:%.8f,C為:%.8f', A, B, C);fit_y=fun(parameter,xdata);figure(1)plot(xdata, ydata, 'r*');hold onplot(xdata,fit_y,'b-');xlabel('t');ylabel('y');legend('觀測數據點','擬合曲線', 'Location', 'northwest');saveas(gcf,sprintf('Logistic曲線.jpg'),'bmp');%% Logistic函數% y=A/(1+B*exp(-C*t))function f=fun(X,t)f=X(1)./(1+X(2).*exp(-X(3).*(t)));end

結果:

MATLAB內容往期回顧:

MATLAB中繪製三維圖形

MATLAB的輸入輸出input函數

matlab詳細介紹畫柱形圖

matlab中矩陣的入門知識

matlab中legend函數的用法

matlab繪圖--線性規劃圖解法示意

Matlab 進度條的製作

Matlab對fig文件導出數據

Matlab中plot函數全功能解析

Matlab的fmincon函數求解非線性規劃

MATLAB線性規劃函數求解線性規劃

MATLAB求解混合整數線性規劃

電子書推薦(一)《MATLAB在數學建模中的應用》

matlab GUI實現導入txt文件(含字符和數據的文本)

matlab 畫圖——誤差條圖errorbar函數(含視頻講解)

matlab多項式(定義、四則計算、求根)

Matlab中繪製不同坐標的圖形

Matlab 多項式擬合函數關係

層次分析法(AHP)在MATLAB中的應用

END

本文部分內容來源於網絡,僅供參考學習,如內容、圖片有任何版權問題,請聯繫處理,24小時內刪除。

相關焦點

  • MATLAB中的數據插值函數
    MATLAB的輸入輸出input函數matlab詳細介紹畫柱形圖matlab中矩陣的入門知識matlab中legend函數的用法matlab繪圖--線性規劃圖解法示意Matlab 進度條的製作Matlab對fig文件導出數據Matlab中plot函數全功能解析
  • MATLAB繪製區域圖形
    相關內容往期回顧MATLAB中繪製三維圖形MATLAB的輸入輸出input函數matlab詳細介紹畫柱形圖matlab中矩陣的入門知識matlab中legend函數的用法matlab繪圖--線性規劃圖解法示意Matlab 進度條的製作Matlab對
  • Matlab編程並繪製函數或者信號包絡線
    MATLAB的輸入輸出input函數matlab詳細介紹畫柱形圖matlab中矩陣的入門知識matlab中legend函數的用法matlab繪圖--線性規劃圖解法示意Matlab 進度條的製作Matlab對fig文件導出數據Matlab中plot函數全功能解析Matlab的fmincon
  • Matlab非線性方程求解器fsolve總結
    MATLAB相關內容往期回顧MATLAB中繪製三維圖形MATLAB的輸入輸出input函數matlab詳細介紹畫柱形圖matlab中矩陣的入門知識matlab中legend函數的用法matlab繪圖--線性規劃圖解法示意Matlab 進度條的製作Matlab對fig文件導出數據Matlab中plot函數全功能解析Matlab的fmincon函數求解非線性規劃MATLAB線性規劃函數求解線性規劃
  • matlab、excel數據擬合
    函數1x = lsqcurvefit(fun,x0,xdata,ydata)x = lsqcurvefit(fun,x0,xdata,ydata,options)x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub)x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options
  • MATLAB處理NAN數據程序(含實例)
    中矩陣的入門知識MATLAB的輸入輸出input函數Matlab對fig文件導出數據matlab多項式(定義、四則計算、求根)MATLAB的switch選擇語句和input輸入語句視頻講解MATLAB的switch選擇語句和input輸入語句matlab中的歸一化處理的三種方法MATLAB求函數的導數和偏導
  • MATLAB中圖片保存的五種方法(二)
    Matlab對fig文件導出數據matlab多項式(定義、四則計算、求根)MATLAB的switch選擇語句和input輸入語句視頻講解MATLAB的switch選擇語句和input輸入語句matlab中的歸一化處理的三種方法MATLAB求函數的導數和偏導視頻講解MATLAB求函數的導數和偏導2、電子書
  • Matlab擬合詳解
    函數一維多項式擬合(曲線) clearx = linspace(0,4*pi,10)';y = sin(x);f=fit(x,y,'poly7') % 最大可到poly9
  • 數據擬合
    數據擬合數據擬合1.問題描述2.三種數據分析軟體的數據擬合實現2.1 matlab的數據擬合實現2.2 root中的數據擬合實現
  • Matlab曲線擬合和插值
    MATLAB軟體提供了基本的曲線擬合函數的命令.
  • MATLAB萬能實用的非線性曲線擬合方法
    在科學計算和工程應用中,經常會遇到需要擬合一系列的離散數據,最近找了很多相關的文章方法,在這裡進行總結一下其中最完整、幾乎能解決所有離散參數非線性擬合的方法根據你的實際問題得到一系列的散點例如:根據上述的實際散點確定應該使用什麼樣的曲線,或者說是想要模擬的曲線
  • OpenCV中實現曲線與圓擬合
    使用OpenCV做圖像處理與分析的時候,經常會遇到需要進行曲線擬合與圓擬合的場景,很多OpenCV開發者對此卻是一籌莫展,其實OpenCV中是有現成的函數來實現圓擬合與直線擬合的
  • 數據分析中的插值與擬合(3) —— 基於Matlab的實現
    :需要指出的是,Matlab有多個自帶函數可以解決類似的問題;本文僅簡要介紹最常用的函數及其基本參數設置;其他函數以及更深入的內容可參見幫助。,gof, output] = fit(x, y, fitType, fitOptions)fitType為擬合函數的類型,主要包括線性、二次、樣條、自定義函數等;fitOptions為擬合的設置,內容較多,可參閱幫助;fitobject為擬合的結果,包括擬合的曲線(面),參數的置信區間等;gof為一些統計信息,主要為誤差信息,如RMSE等;clearclc
  • 科研必備:MATLAB常用數據擬合方法(贈安裝包)
    當需要研究兩個或多個變量之間的關係時,經常要用到曲線擬合。曲線擬合不僅能給出擬合後的關係式,還能用圖形直觀的展現出變量之間的關係。下面小編介紹一下自己常用的擬合方法並分享案例程序。對於比較簡單的數據擬合,小編推薦直接用Excel,Origin或者Matlab的cftool工具箱,這個比較簡單,就不多介紹了,接下來主要分享對於複雜一些的的數據的擬合辦法。
  • 線性混合模型中畸形擬合(Singular fit)的判斷問題
    isSingular> isSingular(Model1)[1] TRUE但有時(情況較少)建模時輸出的信息和通過函數的結果不一致:> Model2 = lmer(data = DF,Y ~ A * B + (1 + A |Sub) + (1|Item))boundary (singular) fit: see ?
  • 數據擬合原理及MATLAB實現
    在MATLAB中,我們可以通過調用fit函數進行指定函數的數據擬合。其調用格式為:我們繼續通過一個實例來說明自定義函數的數據擬合實現過程,其中原始數據為:為了觀察數據分布規律,確定擬合函數形式,我們需要繪製數據分布散點圖觀察變量之間的關係。顯然,在這個示例中,自變量和因變量之間的函數關係為:接下來,我們就通過自定義函數的方式來對原始數據進行擬合。
  • 數學模型(插值、擬合和微分方程)-python實現
    試建立模型分析估計這一天中總共有多少車輛通過這座橋梁。試分析用什麼形式的曲線擬合表中所給的數據,並預測使用4.5年後轎車的平均價格大致為多少?Python 實現(關鍵程序)from scipy.optimize import curve_fitdef func(x, a, b, c):  # 指數函數擬合
  • 【數據擬合4】cftool工具箱的使用
    】matlab中的擬合功能介紹【數據擬合3】數據擬合的基本算法:最小二乘法在聲發射數據中,實際的的情況可能不是線性的,我們可以將數據進行分段,比如加載時期的數據,恆載時期的數據,卸載時期的數據等。之後對每段數據進行線性擬合。聲發射數據也可能不是標準的次方規律,可能是指數增長,可能是周期變化,也可能是多種變化的組合,那麼,本文將介紹這種情況下的擬合。本節繼續介紹matlab中非常實用的數據擬合工具箱cftool。簡單實用而強大的函數擬合工具箱,提供豐富的擬合算法,能實現多種線性、非線性的函數擬合。
  • matlab插值擬合(二)
    1 基於最小二乘法的多項式擬合函數:polyfitp = polyfit(x,y,n),待擬合的多項式為p(1)*x^n + p(2)*x^(n-1) +…+ p(n)*x + p(n+1),其中x是擬合數據的自變量,y是因變量,n是擬合多項式的階數,如當n為1時,即為一次線性擬合。
  • 使用 Python 進行響應曲線擬合 —— 一個解決初值難以確定的方案
    1. scipy libraryscipy 是 python 非常有名的一個關於數學、科學和工程計算的庫,其中我們今天要用的函數是 scipy.optimize.curve_fit,來自於 scipy.optimize.minpack 模塊,看到了 minpack 我們自然而然的想到了 R 中的 minpack.lm,我估計他們是來自 C (原諒我沒時間查找了)。