📄 onedimensionalsearch.m
字号:
function [x_star,f_star]=OneDimensionalSearch(alpha,method,eps)
%一维搜索计算程序
%x_star,f_star--------- 最优解
%alpha----------------- 对于牛顿-芮弗逊法为初始点,对于弦位法和0.618法
% 为区间的上下界(一个只有2个元素的数组)
%method-----------------求解方法:=1,牛顿-芮弗逊法;=2,弦位法;=3,0.618法。
%eps--------------------解的收敛精度
%该函数可以直接引用以下函数:
%f=fun(x) --------------目标函数
%g1=grad1(x)------------一阶导数
%g2=grad2(x)------------二阶导数
if nargin<3
eps=1.0e-6;
end
%以下为求解部分
switch method
case 1
for i=1:200
g1=grad1(alpha);
g2=grad2(alpha);
x_star=alpha-g1/g2;
if abs(x_star-alpha)<=eps
break;
else
alpha=x_star;
end
end
f_star=fun(x_star);
case 2
g(1)=grad1(alpha(1));
g(2)=grad1(alpha(2));
alpha0=alpha(1);
for i=1:10000
rho=g(1)/(g(2)-g(1));
alpha(3)=alpha(1)-rho*(alpha(2)-alpha(1));
g(3)=grad1(alpha(3));
if g(3)<0
alpha(1)=alpha(3);
g(1)=g(3);
else
alpha(2)=alpha(3);
g(2)=g(3);
end
if (alpha(3)-alpha0)<eps
break
end
alpha0=alpha(3);
end
i
x_star=alpha(3);
f_star=fun(x_star);
% %for k=1:100
% % alpha(k+2)=alpha(k+1)-grad1(alpha(k+1))./(grad1(alpha(k+1))-g1(k)).*(alpha(k+1)-alpha(k));
% %if abs(alpha(k+2))<eps
% break
% end
% end
case 3
a=alpha(1);
b=alpha(2);
x=a+0.382*(b-a);
y=a+0.618*(b-a);
q1=fun(x);
q2=fun(y);
while abs(x-a)>eps
if q1<q2
b=y;
else
a=x;
end
x=a+0.382*(b-a);
y=a+0.618*(b-a);
q1=fun(x);
q2=fun(y);
end
x_star=x
f_star=q1
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -