ilovenili 发表于 2006-3-26 22:04:35

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

当使用线性优化函数 = linprog(f,A,b,[],[],lb)
求极值的时候通常在输出函数的最小值的同时输出所有自变量的值,
输出示意图如下:
x =      %最优解
    0.0000
   15.0000
    3.0000
fval =   %最优值
-78.0000

请问各位大虾能否只输出一个自变量的值,比如只输出x=0.0000???:~)

bainhome 发表于 2006-3-26 23:53:16

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

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

[ 本帖最后由 bainhome 于 2006-12-15 19:19 编辑 ]

ilovenili 发表于 2006-3-27 13:09:04

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

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

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

ilovenili 发表于 2006-3-27 20:46:23

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

呵呵,搞定了,还是要谢谢bainhome兄!

ilovenili 发表于 2006-3-27 22:10:20

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

bainhome wrote:
刚刚看到,正准备做...
呵呵...这个界面可真够朴实无华的

没办法,刚自学MATLAB一个星期,终于作出了第一个GUI,呵呵!
你也帮我做做,主要是想比较一下自己的代码和牛人的差别!

ilovenili 发表于 2006-3-28 12:42:53

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

bainhome wrote:
1.俺在这里不敢牛^_^,真牛的太多喽!
2.其实让我做和你的应该也差不多,只是我习惯不用自动生成的那种GUI,还是喜欢从底层朝上做。比较慢,但是几个版本都能通用,不像自动生成的7.0里的到6.5就有点儿不好使。今天有个APDL命令流要帮朋友做一下,过两天我再做这个GUI吧,你的如方便贴上来看看
一个星期就能作出第一个GUI,这是个很厉害的成绩!衷心祝贺老大先:D

我这个GUI太初级,还是不要献丑了!:^)
我很想知道要写底层代码的话需要看帮助文件中哪些相关的的资料?
或者说还要具备什么其他的知识?

bainhome 发表于 2006-3-28 16:21:43

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

my way show as below:
function LinprogGUI
clc
close all
global handles1
hMainFig=figure('numbertitle','off','menubar','none','units','normalized','name','线性规划GUI例子');
set(hMainFig,'units','normalized','position',[.05,.15,.85,.5]);
set(hMainFig,'defaultuicontrolfontname','隶书');
set(hMainFig,'defaultuicontrolfontsize',13);
set(hMainFig,'defaultuicontrolunits','normalized');
hPush1=uicontrol(hMainFig,'style','push','string','线性规划问题计算',...
    'tag','hPush1','position',[.03,.04,.28,.08]);
hPush2=uicontrol(hMainFig,'style','push','string','显示计算结果',...
    'tag','hPush2','position',[.36,.04,.28,.08],'enable','off');
hPush3=uicontrol(hMainFig,'style','push','string','退出程序',...
    'tag','hPush3','position',[.69,.04,.2,.08]);
hTextFTarget=uicontrol(gcf,...
    'style','text',...
    'position',[.02,.93,.16,.05],...
    'horizontal','center',...
    'string','目标函数系数f:',...
    'fontsize',13);
hEditFTarget=uicontrol(hMainFig,'style','edit','unit','normalized','fontsize',9,...
    'position',[.02,.63,.16,.29],'tag','hEditFTarget','string','[-5;-4;-6]','max',2);
delta=str2num(get(hEditFTarget,'string'));
set(hEditFTarget,'string',sprintf(FormatOutput(delta),delta));

hTextRestraint=uicontrol(gcf,...
    'style','text',...
    'position',[.21,.93,.53,.05],...
    'horizontal','center',...
    'string','约束条件矩阵A:',...
    'fontsize',13);
hEditRestraint=uicontrol(hMainFig,'style','edit','unit','normalized','fontsize',9,...
    'position',[.21,.63,.53,.29],'tag','hEditRestraint','string','','max',2);
delta=str2num(get(hEditRestraint,'string'));
set(hEditRestraint,'string',sprintf(FormatOutput(delta),delta));

hTextLimit=uicontrol(gcf,...
    'style','text',...
    'position',[.77,.93,.2,.05],...
    'horizontal','center',...
    'string','约束条件上界b:',...
    'fontsize',13);
hEditLimit=uicontrol(hMainFig,'style','edit','unit','normalized','fontsize',9,...
    'position',[.77,.63,.2,.29],'tag','hEditLimit','string','','max',2);
delta=str2num(get(hEditLimit,'string'));
set(hEditLimit,'string',sprintf(FormatOutput(delta),delta));
set(hPush3,'callback','close all');

hTextResult1=uicontrol(gcf,...
    'style','text',...
    'position',[.21,.55,.17,.05],...
    'horizontal','center',...
    'string','设计变量结果:',...
    'fontsize',13);
hEditResult1=uicontrol(hMainFig,'style','edit','unit','normalized','fontsize',9,...
    'position',[.21,.15,.17,.39],'tag','hEditResult1','max',2);

hTextResult2=uicontrol(gcf,...
    'style','text',...
    'position',[.39,.55,.17,.05],...
    'horizontal','center',...
    'string','目标函数结果:',...
    'fontsize',13);
hEditResult2=uicontrol(hMainFig,'style','edit','unit','normalized','fontsize',9,...
    'position',[.39,.15,.17,.39],'tag','hEditResult2','max',2);

hTextX0=uicontrol(gcf,...
    'style','text',...
    'position',[.57,.55,.17,.05],...
    'horizontal','center',...
    'string','初值x0:',...
    'fontsize',13);
hEditX0=uicontrol(hMainFig,'style','edit','unit','normalized','fontsize',9,...
    'position',[.57,.15,.17,.39],'tag','hEditX0','string','','max',2);
delta=str2num(get(hEditX0,'string'));
set(hEditX0,'string',sprintf(FormatOutput(delta),delta));
hTextLb=uicontrol(gcf,...
    'style','text',...
    'position',[.02,.55,.16,.05],...
    'horizontal','center',...
    'string','设计变量下界lb:',...
    'fontsize',13);
hEditLb=uicontrol(hMainFig,'style','edit','unit','normalized','fontsize',9,...
    'position',[.02,.15,.16,.39],'tag','hEditLb','string','','max',2);
delta=str2num(get(hEditLb,'string'));
set(hEditLb,'string',sprintf(FormatOutput(delta),delta));

hTextUb=uicontrol(gcf,...
    'style','text',...
    'position',[.77,.55,.2,.05],...
    'horizontal','center',...
    'string','设计变量上界ub:',...
    'fontsize',13);
hEditUb=uicontrol(hMainFig,'style','edit','unit','normalized','fontsize',9,...
    'position',[.77,.15,.2,.39],'tag','hEditUb','max',2);
delta=str2num(get(hEditUb,'string'));
set(hEditUb,'string',sprintf(FormatOutput(delta),delta));

set(hPush3,'callback','close all');

handles1=guihandles(hMainFig);
guidata(hMainFig,handles1);

set(hPush1,'callback','MainCompute');
set(hPush2,'callback','DisplayResult')

% 矩阵输出显示格式函数
function str=FormatOutput(InputMatrix)
str=[];
for i=1:size(InputMatrix,2)-1
    str=;
end
str=;
function MainCompute
global handles1
f=str2num(get(handles1.hEditFTarget,'string'));
A=str2num(get(handles1.hEditRestraint,'string'));
b=str2num(get(handles1.hEditLimit,'string'));
lb=str2num(get(handles1.hEditLb,'string'));
ub=str2num(get(handles1.hEditUb,'string'));
= linprog(f,A,b,[],[],lb,ub);
if exitflag<0
    errordlg('优化失败,请检查!')
else
    set(handles1.hPush2,'enable','on')
    set(handles1.hEditResult2,'userdata',fval)
    set(handles1.hEditResult1,'userdata',x)
end
function DisplayResult
global handles1
x=get(handles1.hEditResult2,'userdata');
set(handles1.hEditResult2,'string',sprintf(FormatOutput(x),x));
fval=get(handles1.hEditResult1,'userdata');
set(handles1.hEditResult1,'string',sprintf(FormatOutput(fval),fval));

% 矩阵输出显示格式函数
function str=FormatOutput(InputMatrix)
str=[];
for i=1:size(InputMatrix,2)-1
    str=;
end
str=;
存成三个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,自己跟着作几个,应当可以满足实际工程的需要。原来还写过一个不同界面传递参数的代码,初学时对于比较难掌握的参数传递或许有帮助,附如下:
function MainFunctionFigure
clc
close all
global handles1 handles2
hMainFig=figure('numbertitle','off','menubar','none','units','normalized','tag','hMainFig');
set(hMainFig,'units','normalized','position',[.2,.2,.6,.6]);
set(hMainFig,'defaultuicontrolfontname','隶书');
set(hMainFig,'defaultuicontrolfontsize',13);
set(hMainFig,'defaultuicontrolunits','normalized');
hPush1=uicontrol(hMainFig,'style','push','string','参数设定',...
    'tag','hPush1','position',[.1,.1,.2,.1]);
hPush2=uicontrol(hMainFig,'style','push','string','退出程序',...
    'tag','hPush2','position',[.6,.1,.2,.1]);
hEditShow=uicontrol(hMainFig,'style','edit','unit','normalized',...
    'position',[.4,.4,.2,.1],'tag','hEditShow','string','0');
set(hPush2,'callback','close all');
set(hPush1,'callback','SubFunctionFigure');
handles1=guihandles(hMainFig);
guidata(hMainFig,handles1);

function SubFunctionFigure(handles)
global handles1 handles2
hParFig=figure('numbertitle','off','menubar','none');
hParEdit=uicontrol(hParFig,'style','edit','units','normalized','position',...
[.4,.4,.2,.1],'tag','hParEdit','string','12');
hParPush3=uicontrol(hParFig,'style','push','string','参数传递','tag',...
'hParPush3','units','normalized','position',[.1,.1,.2,.1]);
set(hParPush3,'callback',[...
    'global handles1 handles2,',...
    'set(handles1.hEditShow,''userdata'',get(handles2.hParEdit,''string''));',...
    'strPar=get(handles2.hParEdit,''string'');',...
    'set(handles1.hEditShow,''string'',strPar);',...
    'close gcf,',...
    ]);

handles2=guihandles(hParFig);
guidata(hParFig,handles2);

优化例子的抓图(与参数传递代码无关):

ilovenili 发表于 2006-3-28 20:48:41

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

果然出手不凡!领教了!

ilovenili 发表于 2006-3-29 13:07:42

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

可能是心太急,呵呵!
看来这个玩意还是得慢慢来!
帮兄弟申请加分,以表谢意!

ilovenili 发表于 2006-4-2 22:59:22

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

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


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

[ 本帖最后由 bainhome 于 2007-1-1 13:11 编辑 ]

hjp 发表于 2007-1-6 18:55:07

怎么用全局变量呢?

怎么用全局变量呢?不太好,能否用 varargout 来处理?

gqjneu 发表于 2009-2-21 17:00:25

解决了一大难题,谢谢:victory:
页: [1]
查看完整版本: 做线性优化时能否单独输出一个自变量x的值?