1樓:匿名使用者
求解曲線擬合問題的一般過程是,先通過觀察曲線形狀大致確定函式的形式,然後對函式的引數有個大概的估計作為初值,擬合後畫出曲線來看看效果,如果效果不理想,就考慮修改初值或函式的形式再試。有時候需要經過多次嘗試才能得到滿意的結果。
需要特別注意以下兩點:
1、與擬合函式的形式有關,如果函式形式選擇不當,不可能得到理想的結果。
例如,對於反比例函式,比較一般的情況應該考慮取1/(c1*x+c2)+c3。
2、擬合問題與初值關係很大,不是隨便指定什麼初值都行的通的。
例如,對於本題,初值如果選擇[0.5 -0.1 1],得到的結果就不太理想;但取[1 1 1]得到的結果就比較滿意。
**及擬合結果如下:
x=1:5;
y=[1 0.83 0.75 0.71 0.68];
f=@(c,x)1./(c(1)*x+c(2))+c(3);
c0=[1 1 1];
[c,resnorm]=lsqcurvefit(f,c0,x,y);
plot(x,y,'.-',x,f(c,x),'r:x')
legend('原始資料','擬合資料')
2樓:shine戚七七
採用matlab的lsqcurvefit函式進行非線性擬合:
1、首先編寫fun.m檔案
function [ f ] = fun( c,x )
%untitled3 summary of this function goes here
% detailed explanation goes here
f=1-8/9.8696.*exp(-9.8696.*c(1).*x/(c(2).^2));
end2、然後編寫data.m進行擬合
clc;clear;
data=[0 0
1 27.33333333
2 37.46666667
3 48.5
4 57.6
5 66.53333333
6 74.43333333
8 85.33333333
10 91.1
12 95.5
14 96.53333333
17 97.3
20 97.93333333
24 98.33333333];
xdata=data(:,1);
ydata=data(:,2)./100;
c0=[1 1];
for i=1:100
c = lsqcurvefit ('fun', c0, xdata, ydata) ;
c0 = c; %以計算出的 c為初值進行迭代;
endc
x=0:0.5:25;
y1=1-8/9.8696.*exp(-9.8696.*c(1).*x/(c(2).^2));
plot(xdata, ydata,'o',x,y1,'r');
legend ('實驗資料 ','擬合曲線');
3、擬合結果
d= 0.0241 l=1.1436
3樓:白肚河蟹不讓說
非線性曲線擬合是已知輸入向量xdata和輸出向量ydata,並且知道輸入與輸出的函式關係為ydata=f(x, xdata),但不知道係數向量x。今進行曲線擬合,求x使得輸出的如下最小二乘表示式成立:
min σ(f(x,xdatai)-ydatai)^2
函式 lsqcurvefit
格式 x = lsqcurvefit(fun,x0,xdata,ydata)
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub)
x = lsqcurvefit(fun,x0,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(…)
引數說明:
x0為初始解向量;xdata,ydata為滿足關係ydata=f(x, xdata)的資料;
lb、ub為解向量的下界和上界lb≤x≤ub,若沒有指定界,則lb=[ ],ub=[ ];
options為指定的優化引數;
fun為待擬合函式,計算x處擬合函式值,其定義為 function f = myfun(x,xdata)
resnorm=sum ((fun(x,xdata)-ydata).^2),即在x處殘差的平方和;
residual=fun(x,xdata)-ydata,即在x處的殘差;
exitflag為終止迭代的條件;
output為輸出的優化資訊;
lambda為解x處的lagrange乘子;
jacobian為解x處擬合函式fun的jacobian矩陣。
例 求解如下最小二乘非線性擬合問題
已知輸入向量xdata和輸出向量ydata,且長度都是n,待擬合函式的表示式為
ydata(i)=x(1)-xdata(i)^2+x(2)-sin(xdata(i))+x(3)-xdata^3
即目標函式為min σ(f(x,xdata(i))-ydata(i))^2
其中:f(x,xdata) = x(1)*xdata^2 + x(2)*sin(xdata) + x(3)*xdata^3
初始解向量為x0=[0.3, 0.4, 0.1],即表示式的 個引數[x(1),x(2),x(3)]。
解:先建立擬合函式檔案,並儲存為myfun.m
function f = myfun(x,xdata)
f = x(1)*xdata.^2 + x(2)*sin(xdata) + x(3)*xdata.^3;
然後給出資料xdata和ydata
>>xdata = [3.6 7.7 9.3 4.1 8.6 2.8 1.3 7.9 10.0 5.4];
>>ydata = [16.5 150.6 263.1 24.7 208.5 9.9 2.7 163.9 325.0 54.3];
>>x0 = [10, 10, 10]; %初始估計值
>>[x,resnorm] = lsqcurvefit(@myfun,x0,xdata,ydata)
結果為:
optimization terminated successfully:
relative function value changing by less than options.tolfun
x = 0.2269 0.3385 0.3021
=>即解出的係數最優估計值
resnorm = 6.2950
=>在x解值處的目標最小二乘表示式值。即所謂殘差。
4樓:匿名使用者
1、與擬合函式的形式有關,如果函式形式選擇不當,不可能得到理想的結果。例如,對於反比例函式,比較一般的情況應該考慮取1/(c1*x+c2)+c3。
2、擬合問題與初值關係很大,不是隨便指定什麼初值都行的通的。例如,對於本題,初值如果選擇[0.5 -0.1 1],得到的結果就不太理想;但取[1 1 1]得到的結果就比較滿意。
5樓:
首先 看你的資訊說明優化過程並沒有完全失敗 但是你可以用擬合出來的結果自己畫圖看一看,有可能效果不佳。
解決方案:1 調整你的初值 2 擬合方程分母是線性函式,建議把y取倒數後做線性擬合,這樣很容易得到比較精確的結果。
6樓:我行我素
要學習這個函式的用法,可在命令窗中輸入help lsqcurvefit檢視、學習。如有應用問題,可說明是啥問題,便於解答。
7樓:
這句話只是matlab告訴你程式終止的原因,並不
是什麼錯誤。你可以輸入c和resnorm看看,應該有結果的。但是,matlab並不能保證擬合結果一定就符合你的要求,所以你要將c的值代回擬合函式,plot出擬合曲線,看看擬合的效果如何。
8樓:手機使用者
lsqcurvefit(....),具體函式說明見matlab help
lsqcurvefit = least square curve fit(最小二乘曲線擬合),當然你要先確定曲線的形式,函式可以幫你求出待定引數
matlab中自相關函式,matlab中自相關函式xcorr
自相關函式是描述隨機訊號x t 在任意兩個不同時刻t1,t2的取值之間的相關程度.設原函式是f t 則自相關函式定義為r u f t f t 其中 表示卷積.給個例子 dt 1 t 0 dt 100 x cos t a,b xcorr x,unbiased plot b dt,a 上面 是求自相關函...
matlab中1什麼意思,matlab中a,13是什麼意思
1,表示 矩陣的第一行。2,表示 矩陣的第二行。依次類推 x,表示 矩陣的第x行。而 y 表示 矩陣的第y列。1 6 其中1 6是由123456六個數 組成的行向量,單引號轉置 所以是由123456六個數 組成的列向量,或者說乙個6 1矩陣 就是說取第一行的所有列 取乙個矩陣中第一行所有資料 表示x...
matlab中edge的用法,matlab中的edge函式入口引數如何設定?
bw edge i 採用灰度或一個二值化影象i作為它的輸入,並返回一個與i相同大小的二值化影象bw,在函式檢測到邊緣的地方為1,其他地方為0。bw edge i,sobel 自動選擇閾值用sobel運算元進行邊緣檢測。bw edge i,sobel thresh 根據所指定的敏感度閾值thresh,...