今天早上接到師姐的緊急傳呼,說是將一組資料按照確定的公式進行指數擬合。可是來北京後就沒用過matlap,很多基礎的東西都忘 了,沒事,有事無事找度娘啊!話不多說,說正事。我仔細閱讀了要求文件,核心有兩個,1:方程的構建,:2:計算流程
先拿公式:
已知資料:每個波段所對應的ad(λ)值和ad(440)(波長為440的值),λ為400-700 nm的波長,間隔1 nm
求解sd
波段資料如下:
資料特點是由很多site,每個site都要分別計算,想了下簡單,乙個迴圈的事,難點是如何動態設定已知變數a
d(440),查了一些,自己試驗了一下發現也挺簡單 。
不多說先放**,下面是計算每個site擬合方程的**:
function =caculatersd()
data=xlsread('nihe.xlsx'); %這是波段的原始資料
[r,c]=size(data);
result=zeros(r+2,c);
for i=2:c
a=data(1,i);
x=data(2:r,1);
y=data(2:r,i);
x0=0; %因為估算了一下,0值比較接近真實的sd值,所以選擇0了
%定義擬合函式
f=@(sd,x)a*exp(sd*(440-x));
sd=lsqcurvefit(f,x0,x,y);
y1=a*exp(sd*(440-x));
% -----計算r方方法一------------
r2=norm(y1-mean(y1))^2/norm(y-mean(y))^2;
% -----計算r方 方法二------------
% ss0=0;
% ss1=0;
% for k=1:r-1
% ss0=(y(k)-mean(y))*(y1(k)-mean(y1))+ss0;
% ss1=(y(k)-mean(y))^2*(y1(k)-mean(y1))^2+ss1;
% end
% r2=(ss0/sqrt(ss1))^2;
%-----------------------------------
%存入sd、ad、r2
result(r+1,i)=sd;
result(r+2,i)=r2;
result(2:r,i)=y1;
endxlswrite('result_sd_a8.xls',result)
end
計算完後,得檢視一下擬合效果吧
這個也簡單,上**
function =plotfun()
data=xlsread('nihe.xlsx'); %讀取原始資料
excutedata=xlsread('result_sd_a7.xls'); %讀取處理資料
[r,c]=size(data);
x=data(2:r,1);%獲取波段號
y=data(2:r,3); %讀取site2的波段值
y1=excutedata(2:r,3);%讀取處理後site2的波段值
plot(x,y,'-or',x,y1,'-*b');legend('實際值','計算值')
end
看了下圖,擬合效果很不錯啊
MATLAB 曲線擬合
x0.1 0.20.15 0.0 0.2 0.3y 0.95 0.84 0.86 1.06 1.50 0.72 函式功能多項式的擬合運算 呼叫方法polyfit x,y,n x為橫座標,y為縱座標,n為擬合階數。例子x 0 0.1 2.5 1y erf x p polyfit x,y,6 p 0.0...
matlab 曲線擬合
在matlab中經常需要對資料進行曲線擬合,如最常見的多項式擬合,一般可以通過cftool呼叫曲線擬合工具 curve fit tool 通過圖形介面可以很方便的進行曲線擬合,但是有些時候也會遇到不方便用圖形工具。因此這裡簡單的記下兩種常用的擬合方法。1 多項式擬合 polyfit和polyval ...
Python曲線擬合
z1 np.polyfit x,y,5 用3次多項式擬合 p1 np.poly1d z1 print p1 在螢幕上列印擬合多項式 yvals p1 x 也可以使用yvals np.polyval z1,x plot1 plt.plot x,y,k.markersize 16,label origi...