变度量法算法(DFP)求解无约束问题

2023-11-19

%{
程序功能:
1、变度量法算法(DFP)求解无约束问题
2、调用文件夹下Newton的子函数:nfx,ndfx,ndfx2,vectorLength
3、z3=A(:,:,i)\b;%计算当前d的值
   矩阵计算可能存在奇异值
4、请根据不同的目标函数,设置精度、迭代次数、初始迭代值。
5、迭代初始点的选取很重要
Name:李承霖
Num:35020181152203
Date:2018.11.07


%}
%初始化程序

function SearchDFP()
    clear 
    clc
    syms x1 x2
    format rat

    eps=0.001;  %精度要求
    k=1;
    n=10;%设置最大迭代次数、
    x=zeros(n,2);
    % x(1,:)=[1 1];
    %设置初始迭代点
    x(1,:)=input('Please input initial point matrix:');
    d=zeros(n,2);
    dfx1=zeros(n,2);%一阶导数值fx
    A=zeros(2,2,n);%二阶导数矩阵A
    % beta=zeros(n,1);
    alpha=zeros(n,1);%搜索步长
    v=ndfx(x1,x2);%一阶导数
    z1=ndfx2(x1,x2);%二阶导数
    H=zeros(2,2,n);%置初始矩阵
    H(:,:,1)=eye(2,2);%初始化为单位矩阵
    s=zeros(n,2);
    y=zeros(n,2);

    for i=1:n

        f=subs(v,x1,x(i,1));
        dfx1(i,:)=subs(f,x2,x(i,2));%此处计算一阶导数的值
        %此处精度设置要慎重
    %     m=sqrt( dfx1(i,1)^2+dfx1(i,2)^2); %取矢量长度
        m=vectorLength(dfx1(i,:));

        if( m<eps)
            break;%程序终止
        end

        z2=subs(z1,x1,x(i,1));
    %         A=subs(z2,x2,x(i,2));
        A(:,:,i)=subs(z2,x2,x(i,2));
        %DFP 核心算法
        %------------------------------------
        g=dfx1(i,:);%
        G=A(:,:,i);
        if(i==1)

            d(i,:)=-H(:,:,i)*dfx1(i,:)';

        else
            %第二轮循环
            k=i-1;
            s(k,:)=x(i,:)-x(i-1,:);
            y(k,:)=dfx1(i,:)-dfx1(i-1,:);

            t1=y(k,:)*H(:,:,k)*y(k,:)';
            t2=s(k,:)*y(k,:)';
            m1=H(:,:,k)*y(k,:)'*y(k,:)*H(:,:,k);
            m2=s(k,:)'*s(k,:);
            H(:,:,i)=H(:,:,i-1)-m1/t1+m2/t2;
            m3=-H(:,:,i)*dfx1(i,:)'; %小心奇异矩阵
            d(i,:)=m3';

        end
         alpha(i)=-d(i,:)*g'/(d(i,:)*G*d(i,:)');

         x(i+1,:)=x(i,:)+alpha(i)*d(i,:) ; %第一轮循环


        %BFGS 核心算法
        %------------------------------------

        %第一轮循环
        %{
        g=dfx1(i,:);%
        G=A(:,:,i);
        if(i==1)

            d(i,:)=-inv(B(:,:,i))*dfx1(i,:)';

        else
            %第二轮循环
            k=i-1;
            s(k,:)=x(i,:)-x(i-1,:);
            y(k,:)=dfx1(i,:)-dfx1(i-1,:);
            t1=s(k,:)*B(:,:,k)*s(k,:)';
            t2=y(k,:)*s(k,:)';
            m1=B(:,:,k)*s(k,:)'*s(k,:)*B(:,:,k);
            m2=y(k,:)'*y(k,:);
            B(:,:,i)=B(:,:,i-1)-m1/t1+m2/t2;
            m3=-inv(B(:,:,i))*dfx1(i,:)'; %小心奇异矩阵
            d(i,:)=m3';

        end
         alpha(i)=-d(i,:)*g'/(d(i,:)*G*d(i,:)');

         x(i+1,:)=x(i,:)+alpha(i)*d(i,:) ; %第一轮循环
        %}
        %------------------------------------

        %FR 核心算法
        %------------------------------------
        %{
        %下面计算一维搜索步长
        g=dfx1(i,:);
        G=A(:,:,i);
        if(i==1)
            beta(i)=0;
            d(i,:)=-g;
        else
           beta(i)=abs( vectorLength(dfx1(i,:))^2/vectorLength(dfx1(i-1,:))^2 );  
           d(i,:)=-dfx1(i,:)+beta(i)*d(i-1,:);
        end
        d1=d(i,:);
        alpha(i)=-d1*g'/(d1*G*d1');
        x(i+1,:)=x(i,:)+alpha(i)*d1;
        %}

        %------------------------------------

        %{
        %下面是newton搜索无约束的核心算法

        %计算二阶导数方程的解
        b=-dfx1(i,:)';
        z1=ndfx2(x1,x2);
        z2=subs(z1,x1,x(i,1));
    %         A=subs(z2,x2,x(i,2));
        A(:,:,i)=subs(z2,x2,x(i,2));
        z3=A(:,:,i)\b;%计算当前d的值
        d(i,:)=z3';
        x(i+1,:)=x(i,:)+d(i,:);  %第二轮循环           



         %此处精度设置要慎重
        if(abs(x(i+1,1)-x(i,1))<eps && abs(x(i+1,2)-x(i,2))<eps)
            break;%程序终止
        end
        %}

    end
    disp('The result is:')
    % d,x,fx,A
    d=d(1:i,:)
    x=x(1:i,:)
    dfx1=dfx1(1:i,:)
    A=A(:,:,1:i)
    alpha=alpha(1:i,:)
    H=H(:,:,1:i)
    % beta=beta(1:i,:)
    fprintf('程序尝试迭代次数:%d\n',i)
    fprintf('最优解:%f ,%f\n',x(i,:))
    fprintf('最优目标函数值:y=%.3f\n',nfx(x(i,1),x(i,2)))
    
end

function y= nfx( x1,x2 )
%UNTITLED8 此处显示有关此函数的摘要
%   此处显示详细说明
    %目标函数
    y=2*x1^2-2*x1*x2+x2^2+2*x1-2*x2;
%
%     y=3*x1*x1/2+x2*x2/2-x1*x2-2*x1;
%     y=(x1^2)/3+ exp(x2);%目标函数,要避免导函数分母除0的情况出现。
   
end

function y=ndfx(x1,x2)
    y(1)=diff(nfx(x1,x2),x1);
    y(2)=diff(nfx(x1,x2),x2);  %对目标函数取一阶偏微分
      
    
end 

function y=ndfx2(x1,x2)
    %z=diff(nfx(x1,x2),x1)+diff(nfx(x1,x2),x2);  %对目标函数取二阶偏微分
    
    syms y
%     y=zeros(2,2);
%     sym(y)  
    %     z=diff((nfx(x1,x2)),x1);
%     y2=diff((nfx(x1,x2)),x2);
    z=ndfx(x1,x2);
    y(1,1)=diff(z(1),x1);%二阶
    y(1,2)=diff(z(1),x2);%二阶
    y(2,1)=diff(z(2),x1);%二阶
    y(2,2)=diff(z(2),x2);%二阶
    
%     y=[diff(nfx(x1,x2),x1,2),diff(y1,x2);diff(y2,x1),diff(nfx(x1,x2),x2,2)];
%     y=[diff(z(1),x1),diff(z(1),x2);diff(z(2),x1), diff(z(2),x2)];%构造二阶导数矩阵
    y=[y(1,1),y(1,2);y(2,1),y(2,2)];
end 

%{
程序功能:
1、计算一个矢量的长度


%}
function y=vectorLength(x)
    n=length(x);
    sum=0;
    for i=1:n
       sum=sum+x(i)*x(i); 
        
    end
    y=sqrt(sum);

end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

变度量法算法(DFP)求解无约束问题 的相关文章

  • android 最新动态,浅谈Android动态页面(一)

    这是一个很微妙的东西 可能平时经常用到 但是没注意 我想对这个内容进行一个总结并提出一些看法 谈的是动态页面 不是动态布局 一 什么是动态页面 什么是动态页面 我认为是一种在开发时的设计思想 最终展示的页面会随着数据的改变而改变 或者说会根
  • OpenCV中如何读取URL图像文件

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 由来 最近知识星球收到的提问 觉得是一个很有趣的问题 就通过搜集整理归纳了一番 主要思想是通过URL解析来生成数据 转为图像 Mat对象 但是在Python语言与C 语言
  • Java基础学习总结(1)——equals方法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 equals方法介绍 1 1 通过下面的例子掌握equals的用法 1 package cn galc test 2 3 public class TestEquals

随机推荐

  • 简单spring cloud服务升级实现

    1 升级原则 隔离性 v1升级到v2时 相互独立 互不不干扰 稳定性 服务不停止 完成升级 接口保持畅通 2 具体实现 2 1 eureka项目 搭建eureka 网上很多 就省略了 2 2 feign接口项目 2 2 1 依赖
  • React Hooks

    React Hooks 为什么使用 React Hook useState hook useReducer hook useEffect hook useRef hook useLayoutEffect hook useImperative
  • GPIO口的八种工作状态

    一直对GPIO的工作状态不是很熟悉 导致在设置IO状态时 经常会设置成推挽上拉 或者推挽下拉 开漏上拉等问题 虽然看起来没有影响MCU工作 但感觉这是一种无知的表现 现在总结下GPIO口的八种工作状态 其中四种输入状态 四种输出状态 一 输
  • (STM32笔记2)基于hc05的蓝牙实验

    实验任务 开机检测 HC05 蓝牙模块是否存在 如果检测不成功 则报错 检测成功之后 显示模块的主从状态 并显示模块是否处于连接状态 DS0 闪烁 提示程序运行正常 按 KEY0 按键 可以开启 关闭自动发送数据 通过蓝牙模块发送 按 KE
  • 简单工厂模式

    简单工厂模式 一 概念 从设计模式的类型上来说 简单工厂模式是属于创建型模式 又叫做静态工厂方法 StaticFactory Method 模式 但不属于23种GOF设计模式之一 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例 简
  • ASIC中带有MUX的时钟路径时序约束

    链接 https pan baidu com s 1BrAsabLYLGbvdXJB2LQwiA 提取码 mgrn
  • 回溯法详解

    一 回溯法 深度优先搜素 1 简单概述 回溯法思路的简单描述是 把问题的解空间转化成了图或者树的结构表示 然后使用深度优先搜索策略进行遍历 遍历的过程中记录和寻找所有可行解或者最优解 基本思想类同于 图的深度优先搜索 二叉树的后序遍历 分支
  • 旋转变换(一)旋转矩阵

    转自 https blog csdn net csxiaoshui article details 65446125 1 简介 计算机图形学中的应用非常广泛的变换是一种称为仿射变换的特殊变换 在仿射变换中的基本变换包括平移 旋转 缩放 剪切
  • Kotlin核心编程(七)

    Kotlin核心编程 七 文章目录 Kotlin核心编程 七 多继承问题 接口实现多继承问题 getter和setter 内部类解决多继承问题 内部类和嵌套类 使 委托代替多继承 数据类 Pair和Triple 数据类的约定与使 多继承问题
  • Java设计模式-装饰者模式Decorator

    介绍 装饰者模式的核心思想是通过创建一个装饰对象 即装饰者 动态扩展目标对象的功能 并且不会改变目标对象的结构 提供了一种比继承更灵活的替代方案 需要注意的是 装饰对象要与目标对象实现相同的接口 或继承相同的抽象类 另外装饰对象需要持有目标
  • mobaxterm无法连接vmware虚拟机服务器,network error:connection refused

    场景描述 电脑硬盘换了 重新安装vmware ubuntu mobaxterm 安装完ubuntu后 因为习惯了无UI的界面 所以关闭了ubuntu的桌面服务 有需要的同学可以通过sudo systemctl set default mul
  • 【Java基础】 使用POI解析excel时格式判定问题及解决方案

    写在前面 本文主要介绍在实际开发过程中使用POI工具类去解析Excel格式文件遇到的问题引发的思考 学习以及解决方案 仅供参考 有考虑不周的地方还请指正 问题描述 博主在做excel解析的时候 遇到了一个奇怪的现象 xlsx拓展名的文件使用
  • Struts2知识汇总二

    Struts2中的调试 在Struts2中可以使用
  • java8 stream流排序

    原文出处 https www cnblogs com kuanglongblogs p 11230250 html 很多情况下sql不好解决的多表查询 临时表分组 排序 尽量用java8新特性stream进行处理 使用java8新特性 下面
  • Android PowerSupply (三)power_supply_sys

    目录 Android PowerSupply 一 总概 Android PowerSupply 二 power supply core Android PowerSupply 三 power supply sys Android Power
  • 深入理解ES6箭头函数中的this

    简要介绍 箭头函数中的this 指向与一般function定义的函数不同 比较容易绕晕 箭头函数this的定义 箭头函数中的this是在定义函数的时候绑定 而不是在执行函数的时候绑定 1 何为定义时绑定 我们来看下面这个例子 1 var x
  • UNIX环境高级编程读书笔记

    主要记录关键知识点 方便日后查阅 第一章 UNIX基础知识 UNIX体系结构 书中是这样画的 这篇文章认为这样画不合理https blog csdn net lyndon li article details 116956043 应该这样
  • jsp页面兼容谷歌浏览器相关问题

    1 js按键事件兼容 function document oncontextmenu ie8可运行 谷歌改为function document onkeydown 2 触发事件对象 IE浏览器支持window event srcElemen
  • [附源码]java+ssm计算机毕业设计java儿童福利院管理系统5d7wb【源码、数据库、LW、部署】

    项目运行 项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEcl
  • 变度量法算法(DFP)求解无约束问题

    程序功能 1 变度量法算法 DFP 求解无约束问题 2 调用文件夹下Newton的子函数 nfx ndfx ndfx2 vectorLength 3 z3 A i b 计算当前d的值 矩阵计算可能存在奇异值 4 请根据不同的目标函数 设置精