最速下降法汇总

1.

%zsxj.m
%td 表示梯度  fx表示目标函数 e表示迭代终止要求的最小模量
echo on
E=input('E=');       %E表示梯度的模 ≤e-6
x1=input('x1=');      %初始迭代点x1的值
x2=input('x2=');      %初始迭代点x2的值
fx0=fx(x1,x2)      %初始目标函数值 fx
td0=td(x1,x2)      %求在迭代点(x1,x2)处的梯度值  
d0=-td0
    %求关于λ的一元函数f(x0-λ*td0)
      syms r;
     rx=diff(fx(x1+r*d0(1),x2+r*d0(2)),r)  %对构造的一元函数求解驻点
     rxx=solve(rx,'r')
     for k=1:length(rxx)   
     yy(k) = isreal(rxx(k));
     end
     y=rxx(yy)
     r0=min(subs(y))     %求得最优步长最小λ
    x11=x1+r0*d0(1)      %得到新的迭代点
    x22=x2+r0*d0(2)
    td1=td(x11,x22)     
    fx1=fx(x11,x22)
    d1=-td1
    while ( norm(double(d1))> E)  
     x111=x11                                      
     x222=x22;
     fx0=fx1;
     td0=td1;
     d1=-td0;
     rx1=diff(fx(x1+r*d1(1),x2+r*d1(2)),r)
     rx2=solve(rx1,'r')
     for k=1:length(rxx)
     yy(k) = isreal(rx2(k));
     end
     y=rx2(yy)
     r1=min(subs(y))
     % f1=sym(rx1)
     %c1=sym2poly(f1)  
     %r1=min(c1)    %求得最优步长  
   x11=x111+r1*d1(1)
   x22=x222+r1*d1(2)
   fx1=fx(x11,x22)
   td1=td(x11,x22);
   d1=-td1
     end
    x11
    x22
    fx1   
%------------------------
%梯度函数
%td.m
function
f=td(x1,x2);
f=[4*(x1-1)^3+2*(x1-x2) ; 2*(x2-x1)];
end
//-----------------------------
%目标函数
%fx.m
function f=fx(x1,x2)
f=(x1-1)^4+(x1-x2)^2;
% 目标函数表达式
end

2.

% Steepest Descent Method
% By Kshitij Deshpande
clc
clear all
warning off
prompt = {'Coeficients if X1=','Coefficients of X2=','Coefficeint of X1X2=','Initial Point='};
def     = {'[2 1 0]','[1 -1 0]','2','[0 0]'};
a=inputdlg(prompt,'Data',1,def);
a=char(a);
[m,n]=size(a);
x1 = eval(a(1,1:n));x2=eval(a(2,1:n));x1x2=eval(a(3,1:n));X1=eval(a(4,1:n));
delf1(1) = polyval(polyder(x1),X1(1));
delf1(1) = (delf1(1))+(x1x2*X1(2));
delf1(2) = polyval(polyder(x2),X1(1));
delf1(2) = (delf1(2))+(x1x2*X1(1));
s=-delf1;
%%%%%%%%%%
%report
srep(1,1:2)=s;
%%%%%%%%%%
    x1new(1)=s(1)^2;x1new(2)=2*X1(1)*s(1);x1new(3) = X1(1)^2;
    x1new=x1new*x1(1);
    x1new_(2)=x1(2)*s(1);x1new_(3)=x1(2)*X1(1);
    x1new = x1new+x1new_;
  
    x2new(1)=s(2)^2;x2new(2)=2*X1(2)*s(2);x2new(3) = X1(2)^2;
    x2new=x2new*x2(1);
    x2new_(2)=x2(2)*s(2);x2new_(3)=x2(2)*X1(2);
    x2new = x2new+x2new_;
    x1x2new(1)=s(1)*s(2);x1x2new(2)=X1(1)*s(2)+X1(2)*s(1);x1x2new(3)=X1(1)*X1(2);
    x1x2new=x1x2*x1x2new;
df = polyder(x1new+x2new+x1x2new);
lambda(1) = roots(df);

X1=X1+lambda(1)*s;
Xrep(1,1:2)=X1;
delf1(1) = polyval(polyder(x1),X1(1));
delf1(1) = (delf1(1))+(x1x2*X1(2));
delf1(2) = polyval(polyder(x2),X1(2));
delf1(2) = (delf1(2))+(x1x2*X1(1));
if all(X1)== 0
    fprintf('%d %d is the optimum point',X1(1),X1(2));
end
itrep(1)=1;
it=2;
while all(delf1)==1
    s=-delf1;
    x1new(1)=s(1)^2;x1new(2)=2*X1(1)*s(1);x1new(3) = X1(1)^2;
    x1new=x1new*x1(1);
    x1new_(2)=x1(2)*s(1);x1new_(3)=x1(2)*X1(1);
    x1new = x1new+x1new_;
  
    x2new(1)=s(2)^2;x2new(2)=2*X1(2)*s(2);x2new(3) = X1(2)^2;
    x2new=x2new*x2(1);
    x2new_(2)=x2(2)*s(2);x2new_(3)=x2(2)*X1(2);
    x2new = x2new+x2new_;
    x1x2new(1)=s(1)*s(2);x1x2new(2)=X1(1)*s(2)+X1(2)*s(1);x1x2new(3)=X1(1)*X1(2);
    x1x2new=x1x2*x1x2new;
    df = polyder(x1new+x2new+x1x2new);
    lambda(it) = roots(df);
    X1=X1+lambda(it)*s;
    delf1(1) = polyval(polyder(x1),X1(1));
delf1(1) = (delf1(1))+(x1x2*X1(2));
delf1(2) = polyval(polyder(x2),X1(2));
    delf1(2) = (delf1(2))+(x1x2*X1(1));
    itrep(it)=it;
    srep(it,1:2)=s;
    Xrep(it,1:2)=X1;
    it=it+1;
end
[m,n]=size(itrep);
matrix=[itrep' srep(1:n,1) srep(1:n,2) Xrep(1:n,1) Xrep(1:n,2)];
answer = char(num2str(X1));
answer = ['The optimal point is [' answer ']'];
msgbox(answer,'Solution');
disp('     Press Any key to View Detailed Report............');
pause
echo off
report steep;
clc
3.
编写M文件detaf.m如下
function [f,df]=detaf(x);
f=x(1)^2+25*x(2)^2;
df(1)=2*x(1);
df(2)=50*x(2);
(ii)编写M文件zuisu.m
clc
x=[2;2];
[f0,g]=detaf(x);
while norm(g)>0.000001
   p=-g'/norm(g);
   t=1.0;f=detaf(x+t*p);
   while f>f0
      t=t/2;f=detaf(x+t*p);
   end
x=x+t*p
[f0,g]=detaf(x)
end
4.
MATLAB实现最速下降法.txt in MATLAB--lm.rar
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值