【代码】二分法求最小值

仅适用于以下情况:区间内单调或者最多一个极小值

代码

以[0,pi]内的三角函数为例

clc
clear
close all

x=0:pi/1000:pi;
y=test(x);
figure()
plot(x,y,'.')

cutnum=100;

x1=x(1);
x2=x(end);
error_max=10^-1000;%能接受的误差上限
for i=1:cutnum%这里cutnum是取值上限
    num=(x(end)-x(1))/(2^i);%每次迭代的步长

    x0=(x1+x2)/2;%中心点
    x01=x1+(x2-x1)/8;%取中心点左边的某一个点的横坐标
    x02=x2-(x2-x1)/8;%取中心点右边的某一个点的横坐标
    res0=test(x0);
    res1=test(x01);%取中心点左边的某一个点的纵坐标
    res2=test(x02);%取中心点右边的某一个点的纵坐标
    
    error=abs(res1-res2);%计算误差
    if error<=error_max
        break
    end 
    if res1<res2%左边的点的值较小,下一轮迭代取左边的“半边”
        x1=x0-num;
        x2=x0;
    elseif res1>res2%右边的点的值较小,下一轮迭代取右边的“半边”
        x1=x0;
        x2=x0+num;
    end
    xxx0(i)=x0/pi;
    xxx1(i)=x1/pi;
    xxx2(i)=x2/pi;
end
%% 显示结果
i%循环次数
error%误差
bestans=x0%最优解

test.m

function y=test(x)
y=5*sin(x)+3*cos(0.5*x)+2*sin(4*x)-4*sin(8*x)-9*sin(7*x);

效果

正确

1.多个极小值点,运气好

y=5sin(x)+3cos(0.5x)+2sin(4*x);
输出最小值解为2.9824,实际最小值解应该为2.9824
在这里插入图片描述

2.一个极小值点,计算正确

y=-5sin(x)-3cos(0.5*x);
输出最小值解为1.3788,实际最小值解应该为1.3788
在这里插入图片描述

3.没有极小值点,计算正确

y=5sin(x)+3cos(0.5*x);
输出最小值解为3.1416,实际最小值解应该为3.1416
在这里插入图片描述

有误:多个极小值点,可能会干扰计算精度

y=5sin(x)+3cos(0.5x)+2sin(4x)-4sin(8x)-9sin(7*x);
输出最小值解为2.8913,实际最小值解应该为0.1885
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值