1. 程式人生 > >matlab_最小二乘優化問題

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