matalab最速下降法的实现步骤以及思路详解

首先应该有函数的编程思想,在左边建立主函数,求二阶导的函数和p的函数。
因为求二阶导是常数,不用迭代,而且相对独立于其他部分的代码,所以先写求二阶导的函数。

求二阶导函数的思考过程:
首先创建一个函数文件,
确定传入的参数。因为要求出具体的值,所以要传入具体的点和题目给的式子,具体实现步骤是先对式子的x1x2求一阶导,赋值给fx1,fx2再对fx1,fx2分别关于x1,x2求偏导。放在fx1x1,fx1x2,fx2x1,fx2x2里面。再用subs函数求出具体的值。放到矩阵n里面,具体实现如下:

function n = nabla2fx(f,a,b)%计算出二阶偏导构成的矩阵
x1 = a;%用x1x2接收参数
x2 = b;%a(x1),b(x2)是初始点的坐标
fx1 = diff(f,1,‘x1’);%求x1和x2的一阶偏导
fx2 = diff(f,1,‘x2’);
fx1x1 = diff(fx1,1,‘x1’);%求二阶偏导
fx1x2 = diff(fx1,1,‘x2’);
fx2x2 = diff(fx2,1,‘x2’);
fx2x1 = diff(fx2,1,‘x1’);
fx1x1 = subs(fx1x1);%将参数的值代入得到具体的值
fx1x2 = subs(fx1x2);
fx2x1 = subs(fx2x1);
fx2x2 = subs(fx2x2);
n = [fx1x1,fx1x2;fx2x1,fx2x2];%将二阶偏导放入矩阵

接下来实现最困难的迭代部分,新建一个函数:
首先还是要确认参数传哪些,经过分析初始点的xy坐标和要计算的式子肯定要,除此之外还要传入一个判断值,总共四个参数。
调用函数求出二阶导的矩阵,求出一阶导的矩阵,取范数得到正梯度,负梯度。判断绝对值和精确度的大小。将各个量分别迭代。

function x = countp(f,e,a,b)%计算出p的值
x1 = a;%用x1x2接收参数
x2 = b;
n = nabla2fx(f,x1,x2);%调用函数求出矩阵
x0 = [x1,x2]’;%用传入的参数设置初始点
temp = [x0];
fx1 = diff(f,‘x1’);%求一阶偏导
fx2 = diff(f,‘x2’);
p = [fx1,fx2]’;%求一阶偏导的矩阵
p1 = subs§;%代入值求得正梯度
d = - p1;%求负梯度
while (abs(norm(p1))> e)%比较梯度范数绝对值与e的大小,判断是否退出循环
alpha = (-d)’*d/((-d)'nd);%套用公式算出α
x0 = x0 - alpha *p1;%x0迭代
temp = [temp;x0];%记录每次迭代的结果
a = [1,0] * x0;%ab迭代,这里因为x0是矩阵,而要得到ab是数,所以采用这种写法。
b = [0,1] * x0;
x1 = a;
x2 = b;%x1x2迭代
p1 = subs§;%p1迭代
d = - p1;
end
x = temp;%退出循环
end

主程序,建立方程调用函数传入参数。

syms x1 x2;
X=[x1,x2];
fx=2X(1)2+4*X(2)2-6X(1)-2*X(1)*X(2);
z=countp(fx,0.01,1,1)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值