mysql判断是否为整数
时间: 2024-06-03 12:08:56 浏览: 8
以下是使用强Wolfe准则的FR共轭梯度算法的MATLAB代码:
function [x, f, iter] = fr_conjugate_gradient(fcn, x0, tol, maxiter)
% fcn - function handle to objective function
% x0 - initial guess of solution
% tol - tolerance for convergence
% maxiter - maximum number of iterations allowed
% initialize variables
x = x0;
f = fcn(x);
g = grad(fcn, x);
d = -g;
iter = 0;
while norm(g) > tol && iter < maxiter
% calculate step size using strong Wolfe condition
[alpha, iter_wolfe] = strong_wolfe(fcn, x, d);
% update variables
x = x + alpha*d;
f_new = fcn(x);
g_new = grad(fcn, x);
beta = (g_new'*g_new)/(g'*g);
d = -g_new + beta*d;
f = f_new;
g = g_new;
iter = iter + 1;
end
end
% gradient function
function g = grad(fcn, x)
h = 1e-8; % step size
n = length(x);
g = zeros(n, 1);
for i = 1:n
e = zeros(n, 1);
e(i) = 1;
g(i) = (fcn(x+h*e) - fcn(x-h*e))/(2*h);
end
end
% strong Wolfe condition function
function [alpha, iter] = strong_wolfe(fcn, x, d)
% initialize variables
c1 = 1e-4;
c2 = 0.9;
alpha_lo = 0;
alpha_hi = 1;
f0 = fcn(x);
g0 = grad(fcn, x)'*d;
f1 = fcn(x + alpha_hi*d);
g1 = grad(fcn, x + alpha_hi*d)'*d;
iter = 0;
while true
if f1 > f0 + c1*alpha_hi*g0 || (f1 >= f0 && iter > 0)
alpha = zoom(fcn, x, d, alpha_lo, alpha_hi);
return;
end
if abs(g1) <= -c2*g0
alpha = alpha_hi;
return;
end
if g1 >= 0
alpha = zoom(fcn, x, d, alpha_hi, alpha_lo);
return;
end
alpha_lo = alpha_hi;
alpha_hi = 2*alpha_hi;
f0 = f1;
g0 = g1;
f1 = fcn(x + alpha_hi*d);
g1 = grad(fcn, x + alpha_hi*d)'*d;
iter = iter + 1;
end
end
% zoom function for strong Wolfe condition
function alpha = zoom(fcn, x, d, alpha_lo, alpha_hi)
% initialize variables
c1 = 1e-4;
c2 = 0.9;
iter = 0;
while true
alpha = (alpha_lo + alpha_hi)/2;
f_alpha = fcn(x + alpha*d);
g_alpha = grad(fcn, x + alpha*d)'*d;
f_lo = fcn(x + alpha_lo*d);
if f_alpha > f_lo + c1*alpha*g_alpha || f_alpha >= fcn(x + alpha_lo*d)
alpha_hi = alpha;
else
if abs(g_alpha) <= -c2*grad(fcn, x + alpha*d)'*d
return;
end
if g_alpha*(alpha_hi - alpha_lo) >= 0
alpha_hi = alpha_lo;
end
alpha_lo = alpha;
end
iter = iter + 1;
end
end
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)