matlab中的lsqcurvefit使用

2021-06-26 17:39:06 字數 2031 閱讀 7086

非線性曲線擬合是已知輸入向量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解值處的目標最小二乘表示式值。即所謂殘差。

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 是乙個二乘三的矩陣.分號 用來結束一行。中括...