0.618法的matlab实现

一、题目: 0. 618法寻最优解←

问题描述:←

求函数f(x)= 3x2- 2 tan x在区间[0, 1]上的极小值,其中容许误差ε= 10-4。《●实验的基本 要求<

1、输出最优解、函数的最优值、终止条件; k

2、画图显示其寻优过程。

可以这么写

f = @(x)3*x.^2- 2*tan(x); %目标函数
ratio = 0.618;
left = 0;
right = 1;
epsil = right-left;
count = 0;
xp = linspace(0,1,101);
yp = f(xp);
plot(xp,yp,'b-'); hold on;
sol = [(left+right)/2,f((left+right)/2)];
 fprintf('迭代次数\t误差\t\t\t\t最优解位置\t最优值\n')%打印输出(表头)
while (epsil>1e-4)
    count = count + 1;
    a = left + (1-ratio)*(right-left);
    b = left + ratio*(right-left);
    f1 = f(a);
    f2 = f(b);
    if(f1<f2)
        right = b;
    else
        left = a;
    end
    epsil = right-left;
    solution = (left+right)/2;
    sol = [sol;solution, f(solution)]; %保存每次的最优解
    fprintf('%d\t\t%E\t%f\t%f\n',count, epsil, solution, f(solution))%打印输出
end
for i = 1:1:size(sol,1)-1
plot(sol(i:i+1,1),sol(i:i+1,2),'r-o','markerfacecolor','r')
pause(0.1)
end

然后输出每一步

迭代次数    误差                最优解位置    最优值
1        6.180000E-01    0.309000    -0.352007
2        3.819240E-01    0.427038    -0.362997
3        2.360290E-01    0.354091    -0.363202
4        1.458659E-01    0.399172    -0.365620
5        9.014515E-02    0.371312    -0.365129
6        5.570970E-02    0.388529    -0.365808
7        3.442860E-02    0.399170    -0.365620
8        2.127687E-02    0.392594    -0.365791
9        1.314911E-02    0.388530    -0.365808
10        8.126148E-03    0.391042    -0.365805
11        5.021960E-03    0.389490    -0.365810
12        3.103571E-03    0.390449    -0.365808
13        1.918007E-03    0.389856    -0.365810
14        1.185328E-03    0.389490    -0.365810
15        7.325329E-04    0.389716    -0.365810
16        4.527053E-04    0.389576    -0.365810
17        2.797719E-04    0.389490    -0.365810
18        1.728990E-04    0.389543    -0.365810
19        1.068516E-04    0.389510    -0.365810
20        6.603429E-05    0.389490    -0.365810

可见最优解位置是x=0.389490,最优解是f=-0.365810,终止条件是k=count=20

img

img