matlab中的lsqcurvefit 擬合

2021-08-14 00:18:21 字數 2038 閱讀 1071

非線性曲線擬合是已知輸入向量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^2+x(2)*sin(xdata)+x(3)*xdata^3

即表示式的引數為[x(1),x(2),x(3)]。

目標函式為: minς( f(x,xdata) - ydata )^2

其中:f(x,xdata) = x(1)*xdata^2 + x(2)*sin(xdata) + x(3)*xdata^3

初始解向量為x0=[0.3, 0.4, 0.1]。

:先建立擬合函式檔案,並儲存為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解值處的目標最小二乘表示式值。即所謂殘差。

Matlab中的括號()

matlab中經常會用到括號去引用某array或者是cel l的內容,但三者有什麼具體區別呢?中括號用來構建向量 vectors 或者是矩陣 matrices 如 6.9 9.64 sqrt 1 就是乙個有三個元素的向量。11 12 13 21 22 23 是乙個二乘三的矩陣.分號 用來結束一行。中...

Matlab中的括號()

標籤 matlab 括號 cell array 分類 matlab matlab中經常會用到括號去引用某array或者是cell的內容,但三者有什麼具體區別呢?中括號用來構建向量 vectors 或者是矩陣 matrices 如 6.9 9.64 sqrt 1 就是乙個有三個元素的向量。11 12 ...

Matlab中的括號()

matlab中經常會用到括號去引用某array或者是cell的內容,但三者有什麼具體區別呢?中括號用來構建向量 vectors 或者是矩陣 matrices 如 6.9 9.64 sqrt 1 就是乙個有三個元素的向量。11 12 13 21 22 23 是乙個二乘三的矩陣.分號 用來結束一行。中括...