下面是 armijo线搜索+最速下降法的小程序,matlab用的很不熟,费了不少劲。

函数:

function g=fun_obj(x)
syms a b
f = 1/2*a^2+b^2-a*b-2*a;
a=x(1);b=x(2);
g=eval(f);

求梯度:

function g=fun_grad(x)
syms a b
f = 1/2*a^2+b^2-a*b-2*a;
gradient = jacobian(f,[a,b]);
a = x(1);b = x(2);
g = eval(gradient);

armijo线搜索:

function mk = armijo( xk, rho, sigma, d )

assert( rho > 0 && rho < 1 );
assert( sigma > 0 && sigma < 0.5 ); mk = 0; max_mk = 100; while mk <= max_mk
x = xk + rho^mk * d;
if fun_obj( x ) <= fun_obj( xk ) + sigma * rho^mk *fun_grad(xk)*d';
break;
end
mk = mk + 1;
end return;

主程序:

function result = armijograd(x0)

max_iter = 5000;    % max number of iterations
EPS = 1e-6; % threshold of gradient norm rho = 0.45; sigma = 0.2; % Armijo parameters k = 0; xk = x0; % initialization while k < max_iter k = k + 1; dk = fun_grad( xk ); % gradient vector
d = -1 * dk; % search direction if norm( dk ) < EPS %precision
break;
end mk = armijo( xk, rho, sigma, d); %armijo line search xk = xk + rho^mk * d; %update
end
result = xk;
return;

最终结果是:[4,2]';程序正确。

每天一个小算法(matlab armijo)的更多相关文章

  1. 每天一个小算法(Shell sort5)

    希尔排序的关键在于步长的选取. 希尔排序的复杂度比较复杂,主要跟步长的选择有关,大概是 O(n logn^2),一般认为就是介于 O(n^2) 和 O(n logn) 之间.最好步长比较复杂,一般第一 ...

  2. 每天一个小算法(Shell Sort3)

    希尔算法自己编了一个,循环很多,很不美观,不过运行正确: c语言实现: #include <stdio.h> #include <stdlib.h> #define LEN 2 ...

  3. 每天一个小算法(4)----在O(1)时间删除指定结点

    O(1)时间内删除结点的思路只能是复制该结点下一个结点的数据,然后删除该结点的下一个结点,来等效删除此结点. 需要注意的地方是删除头结点和尾结点的处理. #include <stdio.h> ...

  4. 每天一个小算法(insertion sort3)

    今天多看看插入排序的理论部分. 先贴几个概念吧: 1.伪代码(英语:pseudocode),又称为虚拟代码,是高层次描述算法的一种方法.它不是一种现实存在的编程语言(已经出现了类似伪代码的语言,参见N ...

  5. python3 自己写的一个小算法(比对中文文本相似度)

    函数使用说明: 函数的三个参数分别是“匹配语句”,“匹配语料”,“相关度”: 匹配语句,和匹配预料中的语句匹配的语句,必须为字符串: 匹配语料,被匹配语句来匹配的语句列表,必须为列表: 相关度,函数只 ...

  6. 感冒了~ vs中py和vb实现一个小算法

    1+1*2+1*2*3+--+1*2*3*n 下面是窗体,就一个按钮和编辑框. 中途还遇到了编码问题,但是感冒太难受,加上明天还要上课.就睡了~ 晚安世界.

  7. Python数学运算的一个小算法(求一元二次方程的实根)

    请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程:ax² + bx + c = 0的两个解. #!/usr/bin/env python # -*- coding: ...

  8. 每天一个小算法(Heapsort)

    #include "stdio.h" #include "stdlib.h" #define Num 10 Heap(int arr[],int i,int n ...

  9. 每天一个小算法(5)----找到链表倒数第K个结点

    估计这个问题在面试中被问烂了. 思路是先找到正数的第K个结点的指针pT,然后和指向头结点的指针pN一起向后移动,直到第K个指针指向NULL,此时pN指向的结点即倒数第K个结点. 如图: #includ ...

随机推荐

  1. bzoj 1270 DP

    w[i,j]代表高度j,第i颗树的时候的最大值 那么w[i,j]:=max(w[i,j+1],w[k,j+heigh])+sum[i,j]: 但是这样枚举是n^3的,我们发现转移的第二个选择w[k,j ...

  2. NYOJ-85 有趣的数 AC 分类: NYOJ 2014-01-17 21:42 240人阅读 评论(0) 收藏

    这道题目就是,找规律,小学奥数,找规律不难吧, #include<stdio.h> int sc(int x); int main(){ int n=0; int num,cs,k; sc ...

  3. yebis 和phyreengine的集成

    被虐了几个礼拜阿, 暗无天日阿,花样被虐阿 设置 backbuffer commandbuffer这种问题还在其次,和他们的support要phyreengine 的sample就可以了 虐我千百遍的 ...

  4. 怪物AI(复习)

    怪物AI执行 //-----------------------------------------------主动攻击---------------------------------------- ...

  5. [工作积累] Android system dialog with native callback

    JNI: invoke java dialog with native callback: store native function address in java, and invoke nati ...

  6. vs2010把项目资源打包成系统资源

      把wav格式的音频做成系统资源,根据条件播放相应的音频  System.Media.SoundPlayer spOne = new System.Media.SoundPlayer();      ...

  7. yum install 与 yum groupinstall 的区别

    原文:http://blog.51yip.com/linux/1171.html yum 提供二种安装软件的方式 1,yum install 它安装单个软件,以及这个软件的依赖关系 2,yum gro ...

  8. HDU4718 The LCIS on the Tree(LCT)

    又是一枚LCT,写一发加深一下对LCT的理解.本题的坑爹之处就在于,它实在是太坑爹了.询问的是树路径上的最长连续上升的子串,考验的是怎么样去维护.一开始的想法是维护三个变量 ls,rs,mxl,分别表 ...

  9. netaddr 0.7.12

    Pythonic manipulation of IPv4, IPv6, CIDR, EUI and MAC network addresses https://pypi.python.org/pyp ...

  10. 视频转换工具 Transmageddon

    点这里 Transmageddon 是一个采用 Python 语言开发的视频转换工具,支持输出几乎所有的视频格式,同时也可以生成指定平台下的视频格式. 软件界面如下图所示