matlab_最小二乘優化問題
【lsqlin函式】 lsqlin函式是有約束線性最小二乘函式,用以求含參量x(向量)使得∑(Cx-d)2 , {i∈N|i=1:n}最小。 數學模型為:
min ∑ ( Cx - d )2 , { i ∈ N | i = 1:n } s.t. Ax≤b, Aeqx=beqx, LB≤x≤UB.
【例項】 函式形式: [x, resnorm, residual, exitflag, output, lambda] = lsqlin(C, d, A, b, Aeq, beq, LB, UB, x0, options);
function Example() clear all clc C = [0.9501 0.2311 0.6068 0.4859 0.8912]; d = [0.0578 0.3528 0.8131 0.0098 0.1388]; [x, fval] = lsqlin(C, d, [], [], [], [], [], []) subplot(1, 2, 1); %將多個圖畫到一個平面上 plot(C, d, 'o', C, C*x, 'r', C, C*x, '+') axis([0 1 0 1]); %繪圖時x、y軸的上下限 grid on %在畫圖的時候新增網格線。 xx = linspace(0, 1); %linspace(x1,x2,N)均分指令,其中x1、x2、N分別為起始值、終止值、元素個數。若預設N,預設點數為100。 %logspace(a, b, n)生成一個(1*n)陣列,資料的第一個元素值為10^a,最後一個元素為10^b,n是總取樣點數。 subplot(1, 2, 2); plot(C, C*x, '+', xx, x*xx, 'r') axis([0 1 0 1]) grid on end 【lsqcurvefit函式】 非線性資料(曲線)擬合函式 已知資料點: xdata = (xdata1, xdata2, …, xdatan) ydata = (ydata1, ydata2, …, ydatan) F(x, xdata) = (f1(x, xdata1), …, fn(x, xdatan) )T 中的參變數x(向量),使得
∑(F(x, xdatai) - ydatai)2 最小.
[x, fval] = lsqcurvefit(‘fun’, x0, xdata, ydata)
【例項】
function Example() clear all clc xdata = [3.6 7.7 9.3; 4.1 8.6 2.8; 1.3 7.9 10.0]; ydata = [16.5 150.6 263.1]'; x0 = [0, 0, 0]; [x, resnorml] = lsqcurvefit(@myfun, x0, xdata, ydata) end
function F = myfun(k, xdata) F = k(1)*xdata(:,1)+k(2)*xdata(:,2)+k(3)*xdata(:,3); end 【lsqnonlin函式】 非線性最小二乘(非線性資料擬合)函式 已知資料點: xdata = (xdata1, xdata2, …, xdatan) ydata = (ydata1, ydata2, …, ydatan) F(x, xdata) = (f1(x, xdata1), …, fn(x, xdatan) )T 中的參變數x(向量),使得 ∑fi(x)2 最小. 其中,fi(x) = f(x, xdatai, ydatai) = F(x, xdatai) - ydatai.
[x, fval] = lsqnonlin(‘fun’, x0)
【例項】
function Example() clear all clc x0 = [0.3 0.4]; [x, resnorml] = lsqnonlin(@myfun, x0) end
function F = myfun(x) k = 1:10; F = 2 + 2*k-exp(k*x(1))-exp(k*x(2)); end