function [ fv, bestx, iter_num ] = ConjungateGradient(f, x, x0, epsilon, show_detail )
%conjungate gradient method
% Input:
% f - syms function
% x - row cell arrow for input syms variables
% x0 - init point
% epsilon - tolerance(公差)
% show_detail - a boolean value for whether for print details
% Output:
% fv - minimum f value
% bestx - mimimum point
% inter_num - iteration count
%%
syms lambdas %suffix(后缀,下标) s indicates this is a symbol variable
% n is the dimension
n = length(x);
% compute differential of function f stored in cell nf
nf = cell(1, n); % using row cells column cells will result in error
for i = 1 : n
nf{i} = diff(f, x{i});
end
% $\nabla f(x_0)$
nfv = subs(nf, x, x0);
% init $\nabla f(x_k)$
nfv_pre = nfv;
% init count, k and xv for x value
count = 0;
k = 0;
xv = x0;
%initial search direction
d = -nfv;
% show initial info
if show_detail
fprintf('Initial:\n');
fprintf('f = %s, x0 = %s, epsilon = %f\n\n', char(f), num2str(x0), epsilon)
end
%% loop
while(norm(nfv) > epsilon) %norm函数 计算范数
%% one-dimensional search
%define $x_{k+1} = x_{k} + \lambda d$
xv = xv + lambdas * d;
%define $\phi$\phi$ and do 1-dim search
phi = subs(f, x, xv);
nphi = diff(phi);
lambda = solve(nphi);
%get rid of complex and minus solution
lambda = double(lambda);
if length(lambda) > 1
lambda = lambda(abs(imag(lambda)) < 1e-5); %imag 求复数虚数部分
lambda = lambda(lambda > 0);
lambda = lambda(1);
end
% if $\lambdas$ is too samll, stop iteration
if lambda < 1e-5
break;
end
%% update
% update $x_{k+1} = x_{k} + \lambds d$
xv = subs(xv, lambdas, lambda);
%convert sym to double
xv = double(xv);
%compute the differential
nfv = subs(nf, x, xv);
%update counters
count = count + 1;
k = k + 1;
%compute alpha based on FR formula
alpha = sumsqr(nfv) / sumsqr(nfv_pre);
% show iteration info
if show_detail
fprintf('Iteration: %d\n', count);
fprintf('x(%d) = %s, lambda = %f\n', count, num2str(xv), lambda);
fprintf('nf(x) = %s, norm(nf) = %f\n', num2str(double(nfv)), norm(double(nfv)));
fprintf('d = %s, alpha = %f\n', num2str(double(d)), double(alpha));
fprintf('\n');
end
%update conjungate direction
d = -nfv + alpha * d;
% save the previous $$\nabla f(x_k)$$
nfv_pre = nfv;
% reset the conjungate direction and k if k >= n
if k >= 0
k = 0;
d = -nfv;
end
end % while
%% output
fv = double(subs(f,x,xv));
bestx = double(xv);
iter_num = count;
end

田问渠Carlnait
- 粉丝: 55
- 资源: 3
最新资源
- 基于多目标优化的物流与冷链车辆路径规划与优化研究:考虑时间窗、成本与碳排放的遗传算法改进及多配送中心策略,基于多目标优化的物流与冷链车辆路径规划与优化算法研究,matlab车辆路径优化vrp,车辆路径
- 零基础入门转录组下游分析-机器学习算法之boruta(筛选特征基因)教程配套资源
- 基于Comsol的三维晶体轴压模拟:应用三维Voronoi算法与泰森多边形晶格分布的模型研究,基于三维Voronoi算法的comsol模型中三维晶体轴压模拟与泰森多边形晶格分布研究,comsol三维晶
- 双极性SPWM单相全桥逆变电路仿真模型:电压电流双闭环控制,直流输入电压范围广泛,输出交流峰值电压可调,高效频率控制技术在1-200hz之间 ,双极性SPWM单相全桥逆变电路仿真模型:电压电流双闭环控
- MATLAB程序实现:多无人船协同围捕控制算法-3船围捕运动船只仿真,距离监控与学习参考,MATLAB程序实现:多无人船协同围捕控制算法-3船围捕运动船只仿真与距离动态调整,MATLAB程序:多个
- QQPinyin QQ拼音输入法安装包版本,主要用于在Windows系统上安装和使用QQ拼音输入法
- log4cplus-2.0.8动态库,静态库
- FX3U定位与气缸FB块直接调用修改范例:新颖写法展现清晰思路,FB块学习宝典 ,FX3U定位与气缸FB块编程范例:开放访问,新颖写法展现清晰思路,FX3U的定位和气缸的FB块,没有密码,可以随便直接
- 2018年世界排名前50的餐厅.zip
- 六电池智能均衡系统:高精度、快速均衡的Buck-Boost电路解决方案,高效电池均衡技术:快速精准调节BuckBoost电路,提升电池性能与寿命,6个电池均衡,buckboost电路,精度高,均衡速度
- 零基础入门转录组下游分析-机器学习算法之boruta(训练模型)教程配套资源
- springboot091创新创业教育中心项目申报管理系统a_zip.zip
- 智能同步控制程序:S7-200 Smart在卷板材生产线与造纸设备的应用,多机同步控制与速度频率同步程序-专为卷板材生产线和造纸设备设计,速度同步频率同步程序 s7-200smart程序 适合卷板材
- 2021年世界幸福指数.zip
- file-download sftp
- MATLAB环境下多领域应用的高效变分模态分解算法优化研究:涵盖金融时间序列、地震微震信号、机械振动等多类信号的处理,MATLAB环境下多领域应用的高效变分模态分解算法优化研究:涵盖金融时间序列、地震
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


