找回密码
 注册
Simdroid-非首页
查看: 381|回复: 11

做线性优化时能否单独输出一个自变量x的值?

[复制链接]
发表于 2006-3-26 22:04:35 | 显示全部楼层 |阅读模式 来自 湖南长沙
当使用线性优化函数[x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb)
求极值的时候通常在输出函数的最小值的同时输出所有自变量的值,
输出示意图如下:
x =      %最优解
    0.0000
   15.0000
    3.0000
fval =     %最优值
  -78.0000

请问各位大虾能否只输出一个自变量的值,比如只输出x=0.0000???:~)
发表于 2006-3-26 23:53:16 | 显示全部楼层 来自 新疆乌鲁木齐

Re:做线性优化时能否单独输出一个自变量x的值?

Simdroid开发平台
不是非常明白您的意思,x是一个整体的优化解集,每一个数组中的数据代表设计变量中某一个值的局部最优,为何要单独拿出来显示?不过可以用这样的方式来解决:
  1. function x1=LinprogPartDisplay
  2. f = [-5; -4; -6];
  3. A =  [1 -1  1;3  2  4;3  2  0];
  4. b = [20; 42; 30];
  5. lb = zeros(3,1);
  6. [x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb);
  7. x1=x(1);
复制代码
  1. >> LinprogPartDisplay
  2. Optimization terminated.
  3. ans =
  4.   3.5378e-010
复制代码

[ 本帖最后由 bainhome 于 2006-12-15 19:19 编辑 ]
 楼主| 发表于 2006-3-27 13:09:04 | 显示全部楼层 来自 湖南长沙

Re:做线性优化时能否单独输出一个自变量x的值?

感谢bainhome老大,现在赶鸭子上架,要用MATLAB遍一个计算最优值的GUI。
算法没有问题,就是不知道在GUI中怎么执行最优值的计算程序,呵呵!

老大不怕麻烦的话我就拿上面的线性规划做个简单的比方,给个建议:P
     
    我已经遍好了界面,如下:
    系数1,2,3分别是f = [-5; -4; -6]中的三个值,通过手工输入。
   右边的三个按钮分别是三个X的输出值,和函数的最小值
    关键是按钮 “计算最大值” 的回调程序不知道该怎么写?
   郁闷中....................

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 发表于 2006-3-27 20:46:23 | 显示全部楼层 来自 湖南长沙

Re:做线性优化时能否单独输出一个自变量x的值?

呵呵,搞定了,还是要谢谢bainhome兄!
 楼主| 发表于 2006-3-27 22:10:20 | 显示全部楼层 来自 湖南长沙

Re:做线性优化时能否单独输出一个自变量x的值?

bainhome wrote:
刚刚看到,正准备做...
呵呵...这个界面可真够朴实无华的
没办法,刚自学MATLAB一个星期,终于作出了第一个GUI,呵呵!
你也帮我做做,主要是想比较一下自己的代码和牛人的差别!
 楼主| 发表于 2006-3-28 12:42:53 | 显示全部楼层 来自 湖南长沙

Re:做线性优化时能否单独输出一个自变量x的值?

bainhome wrote:
1.俺在这里不敢牛^_^,真牛的太多喽!
2.其实让我做和你的应该也差不多,只是我习惯不用自动生成的那种GUI,还是喜欢从底层朝上做。比较慢,但是几个版本都能通用,不像自动生成的7.0里的到6.5就有点儿不好使。今天有个APDL命令流要帮朋友做一下,过两天我再做这个GUI吧,你的如方便贴上来看看
一个星期就能作出第一个GUI,这是个很厉害的成绩!衷心祝贺老大先:D
我这个GUI太初级,还是不要献丑了!:^)
我很想知道要写底层代码的话需要看帮助文件中哪些相关的的资料?
或者说还要具备什么其他的知识?
发表于 2006-3-28 16:21:43 | 显示全部楼层 来自 新疆乌鲁木齐

Re:做线性优化时能否单独输出一个自变量x的值?

my way show as below:
  1. function LinprogGUI
  2. clc
  3. close all
  4. global handles1
  5. hMainFig=figure('numbertitle','off','menubar','none','units','normalized','name','线性规划GUI例子');
  6. set(hMainFig,'units','normalized','position',[.05,.15,.85,.5]);
  7. set(hMainFig,'defaultuicontrolfontname','隶书');
  8. set(hMainFig,'defaultuicontrolfontsize',13);
  9. set(hMainFig,'defaultuicontrolunits','normalized');
  10. hPush1=uicontrol(hMainFig,'style','push','string','线性规划问题计算',...
  11.     'tag','hPush1','position',[.03,.04,.28,.08]);
  12. hPush2=uicontrol(hMainFig,'style','push','string','显示计算结果',...
  13.     'tag','hPush2','position',[.36,.04,.28,.08],'enable','off');
  14. hPush3=uicontrol(hMainFig,'style','push','string','退出程序',...
  15.     'tag','hPush3','position',[.69,.04,.2,.08]);
  16. hTextFTarget=uicontrol(gcf,...
  17.     'style','text',...
  18.     'position',[.02,.93,.16,.05],...
  19.     'horizontal','center',...
  20.     'string','目标函数系数f:',...
  21.     'fontsize',13);
  22. hEditFTarget=uicontrol(hMainFig,'style','edit','unit','normalized','fontsize',9,...
  23.     'position',[.02,.63,.16,.29],'tag','hEditFTarget','string','[-5;-4;-6]','max',2);
  24. delta=str2num(get(hEditFTarget,'string'));
  25. set(hEditFTarget,'string',sprintf(FormatOutput(delta),delta));
  26. hTextRestraint=uicontrol(gcf,...
  27.     'style','text',...
  28.     'position',[.21,.93,.53,.05],...
  29.     'horizontal','center',...
  30.     'string','约束条件矩阵A:',...
  31.     'fontsize',13);
  32. hEditRestraint=uicontrol(hMainFig,'style','edit','unit','normalized','fontsize',9,...
  33.     'position',[.21,.63,.53,.29],'tag','hEditRestraint','string','[1 -1  1;3  2  4;3  2  0]','max',2);
  34. delta=str2num(get(hEditRestraint,'string'));
  35. set(hEditRestraint,'string',sprintf(FormatOutput(delta),delta));
  36. hTextLimit=uicontrol(gcf,...
  37.     'style','text',...
  38.     'position',[.77,.93,.2,.05],...
  39.     'horizontal','center',...
  40.     'string','约束条件上界b:',...
  41.     'fontsize',13);
  42. hEditLimit=uicontrol(hMainFig,'style','edit','unit','normalized','fontsize',9,...
  43.     'position',[.77,.63,.2,.29],'tag','hEditLimit','string','[20;42;30]','max',2);
  44. delta=str2num(get(hEditLimit,'string'));
  45. set(hEditLimit,'string',sprintf(FormatOutput(delta),delta));
  46. set(hPush3,'callback','close all');
  47. hTextResult1=uicontrol(gcf,...
  48.     'style','text',...
  49.     'position',[.21,.55,.17,.05],...
  50.     'horizontal','center',...
  51.     'string','设计变量结果:',...
  52.     'fontsize',13);
  53. hEditResult1=uicontrol(hMainFig,'style','edit','unit','normalized','fontsize',9,...
  54.     'position',[.21,.15,.17,.39],'tag','hEditResult1','max',2);
  55. hTextResult2=uicontrol(gcf,...
  56.     'style','text',...
  57.     'position',[.39,.55,.17,.05],...
  58.     'horizontal','center',...
  59.     'string','目标函数结果:',...
  60.     'fontsize',13);
  61. hEditResult2=uicontrol(hMainFig,'style','edit','unit','normalized','fontsize',9,...
  62.     'position',[.39,.15,.17,.39],'tag','hEditResult2','max',2);
  63. hTextX0=uicontrol(gcf,...
  64.     'style','text',...
  65.     'position',[.57,.55,.17,.05],...
  66.     'horizontal','center',...
  67.     'string','初值x0:',...
  68.     'fontsize',13);
  69. hEditX0=uicontrol(hMainFig,'style','edit','unit','normalized','fontsize',9,...
  70.     'position',[.57,.15,.17,.39],'tag','hEditX0','string','[0;0;0]','max',2);
  71. delta=str2num(get(hEditX0,'string'));
  72. set(hEditX0,'string',sprintf(FormatOutput(delta),delta));
  73. hTextLb=uicontrol(gcf,...
  74.     'style','text',...
  75.     'position',[.02,.55,.16,.05],...
  76.     'horizontal','center',...
  77.     'string','设计变量下界lb:',...
  78.     'fontsize',13);
  79. hEditLb=uicontrol(hMainFig,'style','edit','unit','normalized','fontsize',9,...
  80.     'position',[.02,.15,.16,.39],'tag','hEditLb','string','[0;0;0]','max',2);
  81. delta=str2num(get(hEditLb,'string'));
  82. set(hEditLb,'string',sprintf(FormatOutput(delta),delta));
  83. hTextUb=uicontrol(gcf,...
  84.     'style','text',...
  85.     'position',[.77,.55,.2,.05],...
  86.     'horizontal','center',...
  87.     'string','设计变量上界ub:',...
  88.     'fontsize',13);
  89. hEditUb=uicontrol(hMainFig,'style','edit','unit','normalized','fontsize',9,...
  90.     'position',[.77,.15,.2,.39],'tag','hEditUb','max',2);
  91. delta=str2num(get(hEditUb,'string'));
  92. set(hEditUb,'string',sprintf(FormatOutput(delta),delta));
  93. set(hPush3,'callback','close all');
  94. handles1=guihandles(hMainFig);
  95. guidata(hMainFig,handles1);
  96. set(hPush1,'callback','MainCompute');
  97. set(hPush2,'callback','DisplayResult')
  98. % 矩阵输出显示格式函数
  99. function str=FormatOutput(InputMatrix)
  100. str=[];
  101. for i=1:size(InputMatrix,2)-1
  102.     str=[str,'%3.2e',' '];
  103. end
  104. str=[str,' ','%3.2e',' \n'];
复制代码
  1. function MainCompute
  2. global handles1
  3. f=str2num(get(handles1.hEditFTarget,'string'));
  4. A=str2num(get(handles1.hEditRestraint,'string'));
  5. b=str2num(get(handles1.hEditLimit,'string'));
  6. lb=str2num(get(handles1.hEditLb,'string'));
  7. ub=str2num(get(handles1.hEditUb,'string'));
  8. [x,fval,exitflag,output] = linprog(f,A,b,[],[],lb,ub);
  9. if exitflag<0
  10.     errordlg('优化失败,请检查!')
  11. else
  12.     set(handles1.hPush2,'enable','on')
  13.     set(handles1.hEditResult2,'userdata',fval)
  14.     set(handles1.hEditResult1,'userdata',x)
  15. end
复制代码
  1. function DisplayResult
  2. global handles1
  3. x=get(handles1.hEditResult2,'userdata');
  4. set(handles1.hEditResult2,'string',sprintf(FormatOutput(x),x));
  5. fval=get(handles1.hEditResult1,'userdata');
  6. set(handles1.hEditResult1,'string',sprintf(FormatOutput(fval),fval));
  7. % 矩阵输出显示格式函数
  8. function str=FormatOutput(InputMatrix)
  9. str=[];
  10. for i=1:size(InputMatrix,2)-1
  11.     str=[str,'%3.6e',' '];
  12. end
  13. str=[str,' ','%3.6e',' \n'];
复制代码
存成三个M文件,运行第一个
资料不用看很多,把各种常用属性了解了基本就可以做,看上两个比较经典的代码段(比如cwit同学^_^写过不少好东东,找找)就够用了
===========================================
补一段儿:
公认难的非线性有限元分析软件abaqus你都能做好,GUI应当相对容易...^_^
http://www.simwe.com/forum/post/view?bid=19&id=504196&tpg=1&ppg=1&sty=1&age=0#504196
http://bbs.matwav.com/post/view?bid=12&id=46358&sty=3&keywords=GUI
http://www.simwe.com/forum/post/view?bid=19&id=557545&tpg=1&ppg=1&sty=1&age=0#557545
http://www.simwe.com/forum/post/view?bid=19&id=540190&sty=1&tpg=1&age=100
其中最上面两个是我最初学习GUI看的资料,当时打印出来挨个作了一遍,看完之后照做照改,把它不完善的地方自己写成包含自己风格的代码,基本就ok,最后一个是cwit的一篇经验性的总结,是他的得意之作,水平再深些看看绝对有收获,因为GUI从根本上讲就两点难——外部控件的使用和参数的传递,其他的东西,看看set/get中的figure->axes->object 所有的property,了解常用的那些property,自己跟着作几个,应当可以满足实际工程的需要。原来还写过一个不同界面传递参数的代码,初学时对于比较难掌握的参数传递或许有帮助,附如下:
  1. function MainFunctionFigure
  2. clc
  3. close all
  4. global handles1 handles2
  5. hMainFig=figure('numbertitle','off','menubar','none','units','normalized','tag','hMainFig');
  6. set(hMainFig,'units','normalized','position',[.2,.2,.6,.6]);
  7. set(hMainFig,'defaultuicontrolfontname','隶书');
  8. set(hMainFig,'defaultuicontrolfontsize',13);
  9. set(hMainFig,'defaultuicontrolunits','normalized');
  10. hPush1=uicontrol(hMainFig,'style','push','string','参数设定',...
  11.     'tag','hPush1','position',[.1,.1,.2,.1]);
  12. hPush2=uicontrol(hMainFig,'style','push','string','退出程序',...
  13.     'tag','hPush2','position',[.6,.1,.2,.1]);
  14. hEditShow=uicontrol(hMainFig,'style','edit','unit','normalized',...
  15.     'position',[.4,.4,.2,.1],'tag','hEditShow','string','0');
  16. set(hPush2,'callback','close all');
  17. set(hPush1,'callback','SubFunctionFigure');
  18. handles1=guihandles(hMainFig);
  19. guidata(hMainFig,handles1);
复制代码
  1. function SubFunctionFigure(handles)
  2. global handles1 handles2
  3. hParFig=figure('numbertitle','off','menubar','none');
  4. hParEdit=uicontrol(hParFig,'style','edit','units','normalized','position',...
  5. [.4,.4,.2,.1],'tag','hParEdit','string','12');
  6. hParPush3=uicontrol(hParFig,'style','push','string','参数传递','tag',...
  7. 'hParPush3','units','normalized','position',[.1,.1,.2,.1]);
  8. set(hParPush3,'callback',[...
  9.     'global handles1 handles2,',...
  10.     'set(handles1.hEditShow,''userdata'',get(handles2.hParEdit,''string''));',...
  11.     'strPar=get(handles2.hParEdit,''string'');',...
  12.     'set(handles1.hEditShow,''string'',strPar);',...
  13.     'close gcf,',...
  14.     ]);
  15. handles2=guihandles(hParFig);
  16. guidata(hParFig,handles2);
复制代码
[code][/code]
优化例子的抓图(与参数传递代码无关):

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 发表于 2006-3-28 20:48:41 | 显示全部楼层 来自 湖南长沙

Re:做线性优化时能否单独输出一个自变量x的值?

果然出手不凡!领教了!
 楼主| 发表于 2006-3-29 13:07:42 | 显示全部楼层 来自 湖南长沙

Re:做线性优化时能否单独输出一个自变量x的值?

可能是心太急,呵呵!
看来这个玩意还是得慢慢来!
帮兄弟申请加分,以表谢意!
 楼主| 发表于 2006-4-2 22:59:22 | 显示全部楼层 来自 辽宁沈阳

Re:做线性优化时能否单独输出一个自变量x的值?

bainhome wrote:
my way show as below:
...


能否将你写的这个不同界面参数传递修改下,最好是能够将第一个界面输入的数字传递到第二个界面!

[ 本帖最后由 bainhome 于 2007-1-1 13:11 编辑 ]
发表于 2007-1-6 18:55:07 | 显示全部楼层 来自 陕西西安

怎么用全局变量呢?

怎么用全局变量呢?不太好,能否用 varargout 来处理?
发表于 2009-2-21 17:00:25 | 显示全部楼层 来自 吉林长春
解决了一大难题,谢谢:victory:
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-7 11:32 , Processed in 0.044070 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表