資源簡(jiǎn)介
1.用加步探索法確定一維最優(yōu)化問題程序代碼:
function [minx,maxx] = minJT(f,x0,h0,eps)
%進(jìn)退方法求解極值區(qū)間
%目標(biāo)函數(shù):f
%初始點(diǎn):x0
%初始步長(zhǎng):h0
%精度:eps
%區(qū)間左端點(diǎn):minx
%區(qū)間右端點(diǎn):maxx
format long;
if nargin == 3
eps = 1.0e-6;
end
x1 = x0;
k = 0;
h = h0;
while 1
x4 = x1 h;
k = k 1;
f4 = subs(f, findsym(f),x4);
f1 = subs(f, findsym(f),x1);
if f4 < f1
x2 = x1;
x1 = x4;
f2 = f1;
f1 = f4;
h = 2*h;
else
if k==1
h = -h;
x2 = x4;
f2 = f4;
else
x3 = x2;
x2 = x1;
x1 = x4;
break;
end
end
end
minx = min(x1,x3);
maxx = x1 x3 - minx;
format short;
2.用對(duì)分法求解該題的程序代碼如下:
function [xmin,ymin] = minDF(f,x0,x1,eps)
%對(duì)分法求解極值
%目標(biāo)函數(shù):f
%搜索右區(qū)間:x0
%搜索左區(qū)間:h0
%精度:eps
%極小值點(diǎn):xmin
%極小值:ymin
format long;
if nargin == 3
eps = 1.0e-6;
end
k=1;
plot(x0,subs(f , findsym(f),x0),'ro');
plot(x1,subs(f , findsym(f),x1),'ro');
while (x1-x0)>eps && k<100000
xm=(x1 x0)/2;
xl=(x0 xm)/2;
xr=(x1 xm)/2;
fm = subs(f , findsym(f),xm);
fl = subs(f , findsym(f),xl);
fr = subs(f , findsym(f),xr);
plot(x0,subs(f , findsym(f),x0),'ro');
plot(x1,subs(f , findsym(f),x1),'ro');
plot(xm,fm,'ro');
if fl < fm
x0 = xl;
x1 = xm;
else
if fr < fm
x0 = xm;
x1 = xr;
else
x0 = xl;
x1 = xr;
end
end
k = k 1;
end
if k == 100000
disp('找不到最小值!');
x = NaN;
minf = NaN;
return;
end
k
xmin = (x1 x0)/2;
ymin = subs(f, findsym(f),xmin);
format short;
3.用Newton法求解該題的程序代碼如下:
function [x,minf] = minNT(f,x0,var,eps)
%牛頓方法
%目標(biāo)函數(shù):f
%初始點(diǎn):x0
%自變量向量:var
%精度:eps
%極值點(diǎn):x
%極值:minf
format long;
if nargin == 3
eps = 1.0e-6;
end
tol = 1;
x0 = transpose(x0);
gradf = jacobian(f,var);
jacf = jacobian(gradf,var);
while tol>eps
v = Funval(gradf,var,x0);
tol = norm(v);
pv = Funval(jacf,var,x0);
p = -inv(pv)*transpose(v);
p = double(p);
x1 = x0 p;
x0 = x1;
end
x = x1;
minf = Funval(f,var,x);
format short;
3實(shí)驗(yàn)結(jié)果
1.用加步探索法確定一維最優(yōu)化問題的實(shí)驗(yàn)結(jié)果截圖如下:
2.用對(duì)分法求解的實(shí)驗(yàn)結(jié)果截圖如下:
精度
代碼片段和文件信息
評(píng)論
共有 條評(píng)論