jjzjj

利用 MATLAB 编程实现罚函数法法求解约束最优化问题

i道i 2024-06-06 原文

本文章包含以下内容:

1、画出外罚函数法的算法流程图;

2、MATLAB 编写外罚函数法求解无约束优化问题的函数,无约束子问题用 精确一维搜索的拟 Newton 法(函数式 M 文件,精度设为 epson 可调);编写程序 (命令式 M 文件),调用外罚函数法,求解如下问题:

精度为 10-8,初始点为(10,10)。

3、MATLAB 编写内罚函数法求解无约束优化问题的函数(分不限制一维搜 索步长和限制一维搜索步长两种情况),无约束子问题用精确一维搜索的拟 Newton 法(函数式 M 文件,精度设为 epson 可调);编写程序(命令式 M 文件), 调用内罚函数法,求解如下问题:

精度为 10-8,初始点为(10,10)。

拟 Newton 法

1、画出外罚函数法的算法流程图;

2、MATLAB 编写外罚函数法求解无约束优化问题的函数,无约束子问题用 精确一维搜索的拟 Newton 法(函数式 M 文件,精度设为 epson 可调);编写程序 (命令式 M 文件),调用外罚函数法,求解如下问题:

精度为 10-8,初始点为(10,10)。

function y=f(x)
global s;
if(length(x)==1)
    global xk;
    global pk;
    x=xk+x*pk;
end
y=x(1)^2+x(2)^2+s*(x(1)+x(2)-2)^2;

 

function xk=waifanhanshufa(e,x)
%step 1
c=10;
global s;
s=1;
global xk;
global pk;
xk=x;
%没用到k,只存储当前迭代的值。
%step 2
while 1
    H=[1 0;0 1];
    xk=DFP_hjfg(1e-4,xk,H);
    if s*(xk(1)+xk(2)-2)^2<e
        return ;
    end
    s=c*s;
end
    

3、MATLAB 编写内罚函数法求解无约束优化问题的函数(分不限制一维搜 索步长和限制一维搜索步长两种情况),无约束子问题用精确一维搜索的拟 Newton 法(函数式 M 文件,精度设为 epson 可调);编写程序(命令式 M 文件), 调用内罚函数法,求解如下问题:

 

精度为 10-8,初始点为(10,10)。

function y=f(x)
global r;
if(length(x)==1)
    global xk;
    global pk;
    x=xk+x*pk;
end
y=x(1)^2+x(2)^2+r/(x(1)-1);

 不限制一维搜索步长

function xk=neifanhanshufa(e,x)
%step 1
c=0.1;
global r;
r=10;
global xk;
global pk;
xk=x;
%没用到k,只存储当前迭代的值。
%step 2
while 1
    %拟牛顿法
    Hk=[1 0;0 1];
    xk=DFP_hjfg(1e-6,xk,Hk);
    if r/(xk(1)-1)<e
        return ;
    end
    r=c*r;
end
    

 限制一维搜索步长(这里更改了拟牛顿法函数,原函数还是看之前的代码)

function xk=neifanhanshufa(e,x)
%step 1
c=0.1;
global r;
r=10;
global xk;
global pk;
xk=x;
%没用到k,只存储当前迭代的值。
%step 2
while 1
    %拟牛顿法
    Hk=[1 0;0 1];
    xk=DFP_hjfg(1e-6,xk,Hk);
    if r/(xk(1)-1)<e
        return ;
    end
    r=c*r;
end



function x_=DFP_hjfg(e,x,Hk)
global xk;
global pk;
xk=x;
%step 1
g0=shuzhiweifenfa(x);
%没用到k,只存储当前迭代的值。
while 1
    %step 2
    pk=-(Hk*g0')';   %默认都是列向量
    %step 3
     %这两个函数见之前代码(matlab无约束最优化的一般算法)
    c_=-(xk(1)-1)/([1,0]*pk');
    a=huangjinfenge(0,abs(c_),10^-4);
    %step 4
    xk=x+a*pk;
    g1=shuzhiweifenfa(xk);
    %step 5
    %范数用的是平方和开根号
    if sqrt(sum(g1.^2))<=e
        x_=xk;
        return;
    end
    if sqrt(sum((x-xk).^2))<=e
        x_=xk;
        return;
    end
    sk=(a*pk)'; %x(k+1)-x(k)=a*pk
    yk=(g1-g0)';
    %step 6
    Hk=Hk-(Hk*yk*yk'*Hk)/(yk'*Hk*yk)+(sk*sk')/(yk'*sk);
    g0=g1;
    x=xk;
end

结果示例:

 

有关利用 MATLAB 编程实现罚函数法法求解约束最优化问题的更多相关文章

  1. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  2. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  3. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  4. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  5. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  6. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  7. ruby - 在 Ruby 中按名称传递函数 - 2

    如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只

  8. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  9. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  10. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

随机推荐