MATLAB二分法求最优解
【菜狗bb】emm…原理挺简单的,应该没啥不明白的。就是给一个函数f以及区间[a,b]和精确度esp,对区间的中间值进行求导,小于0就把中间值赋给a,大于0就把中间值赋给b。如果导数等于0或者b-a的值小于esp了就不再判断了,中间值就是最优解的横坐标。
不磨叽了,看代码吧还是:
下面展示一些 。
function [k,y]=erfenfa1(f,a,b,esp)
syms x;
% f是所给的函数 a,b 为所给区间,eps为精确度
% 返回值[k,y]是最优解的横纵坐标
while b-a > esp
%求出在a,b中间点的导数
zhong = (b+a)/2;
dao = subs(diff(f),x,zhong);
%如果倒数为0,则a,b中间值zhong 就是最优解横坐标
if dao == 0
k=zhong;
y = subs(f,x,zhong);
break;
else
%导数小于0 将zhong赋值给a,大于0就赋值给b
if(dao<0)
a = zhong;
else
b = zhong;
end
end
%当b-a小于esp时,将a,b中点作为最优解横坐标,y为纵坐标
if b-a<=esp
k =(b+a)/2;
y = subs(f,x,k);
end
end
emm…再看个简单的测试用例:
>> clear
>> syms x;
f = x^2 + 2*x -1;
[x,y] = erfenfa1(f,-2,0,0.1);
>> [x,y]
ans =
[ -1, -2]
emm…还有一块,,,给个赞再给你看吧,如何。。(手动骗赞)
拜拜,嘿嘿。