Matlab实现黄金分割法一维搜索

鹅毛在路上了
Matlab领域优质创作者
2023-09-20 19:34:51
clc,clear,close all;
a = -1; b =3;
ep = 0.08*(b-a);
x = a:0.1:b;
f_x = x.^2-x+2;
plot(x, f_x, 'linewidth', 1.5)
axis([-1, 3, 0, 8])
title('f(x)=x^2-x+2')
grid on;
flag = 0;
cnt = 0;
pause(0.5)
while 1
    fprintf('第%d次迭代:\n', cnt)
    if flag==0
        x2 = a + 0.618*(b-a);
        f2 = x2.^2-x2+2;
        x1 = a + b - x2;
        f1 = x1.^2-x1+2;
        fprintf('a = %f, b = %f\n', a, b)
        fprintf('x1 = %f, x2 = %f, f1 = %f, f2 = %f\n', x1, x2, f1, f2)
        hold on
        stem([x2, x1], [f2, f1], '--', 'linewidth', 0.8)
        pause(1)
    elseif flag==1
        x1 = a + b - x2;
        f1 = x1.^2-x1+2;
        fprintf('a = %f, b = %f\n', a, b)
        fprintf('x1 = %f, x2 = %f, f1 = %f, f2 = %f\n', x1, x2, f1, f2)
        stem([x2, x1], [f2, f1], '--', 'linewidth', 0.8)
        pause(1)
    elseif flag==2
        x2 = a + 0.618*(b-a);
        f2 = x2.^2-x2+2;
        fprintf('a = %f, b = %f\n', a, b)
        fprintf('x1 = %f, x2 = %f, f1 = %f, f2 = %f\n', x1, x2, f1, f2)
        stem([x2, x1], [f2, f1], '--', 'linewidth', 0.8)
        pause(1)
    end
    if abs(b-a)<ep
        xb = (a+b)/2;
        disp('最优解为:')
        fprintf('xb = %f, f(xb) = %f\n', xb, xb.^2-xb+2)
        disp('黄金分割法一维搜索完毕.')
        break
    elseif f1<f2
        disp('f1<f2')
        b = x2;
        x2 = x1;
        f2 = f1;
        flag = 1;
    elseif f1==f2
        disp('f1=f2')
        a = x1;
        b = x2;
        flag = 0;
    elseif f1>f2
        disp('f1>f2')
        a = x1;
        x1 = x2;
        f1 = f2;
        flag = 2;
    end
    cnt = cnt + 1;
end
pause(0.5)
stem(xb, xb^2-xb+2, 'r', 'linewidth', 2)

 

 

...全文
256 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

183

社区成员

发帖
与我相关
我的任务
社区描述
欢迎加入Matlab编程社区,支持各专业领域有关Matlab的博文、编程知识、经验分享,感谢每一份支持,您的鹅毛在路上了~
matlab 个人社区 山东省·潍坊市
社区管理员
  • Wayne_Fine
  • 数学建模加油站
  • MATLAB码农
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧