梯度算法的matlab程序,基于MATLAB的梯度法源代码
話不多說,直接上干貨。這是基于MATLAB的源代碼,目標函數(shù)我選擇了一個二維函數(shù),根據(jù)自己需求,更改目標函數(shù),初始迭代點以及收斂精度
第一部分:目標函數(shù) ??根據(jù)自己需求,更改目標函數(shù)!!!
function y=ObjFun(x)
%目標函數(shù) 根據(jù)實際情況修改
%輸入?yún)?shù)x[x1,x2,...,xn];
%輸出參數(shù)y
%二維目標函數(shù)
y =60-10*x(1)-4*x(2)+x(1)*x(1)+x(2)*x(2)-x(1)*x(2);
end
第二部分:求解最優(yōu)步長函數(shù) ? 不需要更改!!!
function a=OptStep(x,S)
%一維搜索,求最優(yōu)步長
syms b
x=x+b.*S;
y=ObjFun(x);
Y=diff(y); %求導(dǎo),導(dǎo)數(shù)為0的點,即為所求最優(yōu)步長
a=solve(Y==0);
a=double(a);
end
第三部分:主體程序,根據(jù)自己需求,更改函數(shù)中的初始迭代點,收斂精度,梯度,梯度的模以及里面的目標函數(shù)!!!
function [X,F]=GradientMethod
%梯度法,又稱為最速下降法
%X是最優(yōu)解
%F是最優(yōu)解函數(shù)值
%% 第一步:給定初始迭代點x,收斂精度err,k=1
k=1;
x(:,k)=[0;0];
err=0.001;
syms x1 x2
f=60-10*x1-4*x2+x1*x1+x2*x2-x1*x2; %目標函數(shù)
%% 第二步:計算梯度和模并取搜索方向
FG=gradient(f,[x1 x2]); %f的梯度
fg=sqrt(FG(1)^2+FG(2)^2); %梯度的模
while(1)
S=-double(subs(FG,[x1,x2],x(:,k)')); %搜索方向
%% 第三步:進行收斂判斷
fgvalue=double(subs(fg,[x1,x2],x(:,k)'));
if fgvalue<=err
X=x(:,k);
F=ObjFun(X);
break
else
%% 第四步求最優(yōu)步長以及求新迭代點
a=OptStep(x(:,k),S);
x(:,k+1)=x(:,k)+a.*S;
k=k+1;
end
end
end
ok,直接在命令窗口上運行 ?[X,F]=GradientMethod ? 就ok啦,看我不上傳到資源上,索要積分,直接公開代碼,點個贊,給個評論唄。
總結(jié)
以上是生活随笔為你收集整理的梯度算法的matlab程序,基于MATLAB的梯度法源代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新唐c语言怎么计算指数运算,C语言位域精
- 下一篇: qpsk matlab仿真,QPSK 调