MATLAB制定基金最优投资计划

目前国内CPI连月下降,但是各种迹象表明,下半年国家将会依然保持宽松的财政政策和货币政策。再这样的情况下,通货膨胀的预期必然离我们越来越 近。那么,面对即将到来的通胀,我们将如何应对呢?对于参加工作不久的同胞们,我个人觉得基金是最好的投资方式。那么买基金必然会存在投资风险,如何规避或降低风险至最小呢?

我们可以通过数学优化模型来制定基金存取计划,让投资风险减小到最低程度。大家都知道凡是涉及组合优化问题MATLAB和LINGO是最理想的建模和求解软件。所以对于基金投资组合的问题我们不妨用MATLAB来进行建模。

今天在万方数据库里查资料时恰好碰到了一篇介绍MATLAB优化基金存取计划的论文,利用该文章介绍的方法,根据组合投资中"存款期长者优先"的投资准则.可以利用MATLAB建立线性代数基金投资的最优化模型,我明天会把这篇文章里讲到的基金投资的最优化模型介绍一下,并给出源文件和详细的教程,希望对打算买基金或想对自己的基金投资进行优化的朋友有所帮助。

本来昨天接到这个话题的邀请是准备今天写一个详细教程的,今天工作占用了很多的时间,回家都已经10点多了。只有明天再继续把基金投资优化模型写出来供大家参考了。

Posted in Matlab | Tagged , , | 1 Comment

MATLAB博客推荐

大家在初学MATLAB的时候肯定会想:“要是能把这些知识点都用一个趣味的实例来练习一下那该多好啊”。现在就推荐大家看看Quan Quach博客 ,也许会对你有所帮助吧。在他的MATLAB板块,你可以看到很多教程,尤其是关于MATLAB GUI方面的。

    另外他和Sol会在每两周的礼拜一轮流举办一次趣味数学比赛,当然推荐大家使用MATLAB来 解决咯。获胜者会得到10美金的奖励哦。

    最近一期的问题可以访问这里

Posted in Blogroll, Matlab | Tagged | Leave a comment

Matlab GUI编程教程(适用于初学者)

Matlab GUI 编程(适用于Matlab的初学者)

介 绍

什么是GUI呢 ? GUI是Graphical User Interface 图形用户界面的意思,象很多高级编程语言一样,Matlab也有图形用户界面开发环境,随着计算机技术的飞速发展,人与计算机的通信方式也发生的很大的变化,从原来的命令行通讯方式(例如很早的DOS系统)变化到了现在的图形界面下的交互方式,而现在绝大多数的应用程序都是在图形化用户界面下运行的。

记得读书的时候,大学开学不久,学校很多同学就开始报考全国计算机等级考试了,当然我也是其中的一分子,其中C语言是大多数人选择的科目,当时在学C语言的时候,经常也会遇到人机交互的例子,譬如一个计算两个数相加的程序,运行程序后便切换到了Dos模式,然后在此模式下输入两个数,再回车,才能返回运算结果。当时就觉得很不方便,也不友好,后来才得知C语言是面向过程的语言,是非面向对象的语言(VC++,VB,Matlab等是面向对象的)。那么下面我们就来看看Matlab是如何简单、快速而友好地解决这类问题的吧。

Matlab GUI编程教程(适用于初学者)

1.首先我们新建一个GUI文件:File/New/GUI 如下图所示;

example1

选择Blank GUI(Default)

2.进入GUI开发环境以后添加两个编辑文本框,6个静态文本框,和一个按钮,布置如下图所示;

2

布置好各控件以后,我们就可以来为这些控件编写程序来实现两数相加的功能了。

3.我们先为数据1文本框添加代码;

1

点击上图所示红色方框,选择edit1_Callback,光标便立刻移到下面这段代码的位置。

function edit1_Callback(hObject, eventdata, handles)

% hObject handle to edit1 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit1 as text

% str2double(get(hObject,'String')) returns contents of edit1 as a double

然后在上面这段代码的下面插入如下代码:

%以字符串的形式来存储数据文本框1的内容. 如果字符串不是数字,
则现实空白内容
input = str2num(get(hObject,'String')); 
%检查输入是否为空. 如果为空,则默认显示为0
if (isempty(input))
     set(hObject,'String','0')
end
guidata(hObject, handles);

这段代码使得输入被严格限制,我们不能试图输入一个非数字。

4.为edit2_Callback添加同样一段代码

5 现在我们为计算按钮添加代码来实现把数据1和数据2相加的目的。

3中同样的方法在m文件中找到pushbutton1_Callback代码段 如下;

function pushbutton1_Callback(hObject, eventdata, handles)

% hObject handle to pushbutton1 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

在上面这段代码后添加以下代码;

a = get(handles.edit1,'String');
b = get(handles.edit2,'String');
% a and b are variables of Strings type, and need to be
% converted to variables of Number type before they can
% be added together% 
 total = str2num(a) + str2num(b);
c = num2str(total);
% need to convert the answer back into String type to
% display it
set(handles.text1,'String',c);
guidata(hObject, handles);
下面我们来对上面这段程序分析一下;
a = get(handles.edit1,'String');
b = get(handles.edit2,'String');
上面这行代码把用户输入的数据存入到变量a,变量b中;
% a,b是字符型变量,在计算两者相加之前需把他们转换为数字型
total = str2num(a) + str2num(b);
这段代码实现两数相加
c = num2str(total);
set(handles.text3,'String',c);
guidata(hObject, handles);

以上两行代码分别用来更新计算结果文本框和图形对象句柄,一般Callback回调函数都以guidata(hObject, handles);j结束以更新数据

程序运行如下:

3

如果你仍然有疑问可以留言~

[知识点]

图形用户界面(GUI)--包括窗口、图标、菜单、工具条等对象的用户界面。

Posted in Matlab, Matlab GUI, Matlab基础, Matlab教程 | 34 Comments

Simulink输出指定状态变量的值

今天游览Doug’s Pick of the Week的时候发现Matlab公司有一位应用工程师刚建了一个博客,此博客专门用于介绍Simulink和一些Mathworks工具基于模型的设计.这个博客也许会对正在使用Simulink的人有所帮助吧. 说到Simulink,我做的第一个Simulink模型是一个曲柄滑块的仿真系统,就整个Simulink而言,其实我觉得它的出现使得我们能更加清晰的思考复杂的系统,使得整个系统内个分散繁多的元件看起来更加有条例,可以很容易的看出它们之间的存在什么样的关系. 下面看看Simulink输出指定状态变量的值是如何实现的:

下面是Help文件中的一个例子:

This command creates an options structure called myopts that defines values for the MaxDataPoints and Refine parameters, using default values for other parameters.

myopts = simset('MaxDataPoints', 100, 'Refine', 2);

This command simulates the vdp model for 10 seconds and uses the parameters defined in myopts.

[t,x,y] = sim('vdp', 10, myopts);

Seth那也有一个例子.

Posted in Matlab, Matlab基础, simulink | Tagged , | Leave a comment

解决自己遇到的Matlab问题

我在yo2 上写了到目前为止10篇文章。这些文章都只涉及我所在的领域(机械或者优化方面)覆盖面有限。我希望大家可以共同来建立一个资源圈或者说是一个互帮互助的集体,大家在其中就能更好的得到帮助或找到自己需要的资料,因为很多人问过我一些问题,而我大多都帮不上他们什么,因为所在领域不同,我不可能帮一个完全不是一个专业的人解决他的建模问题。所以我想把当我遇到问题时如何查找资料和解决Matlab问题的过程和方法告诉大家:

  1. 首先当你遇到Matlab问题时你应尽量利用软件自带的帮助文件寻求帮助(F1直接进入),有人埋怨自己的Matlab是英文版的,看不懂帮助文档,其实很多大型软件都没有汉化,再者英语地位不用多说,这个问题自己得克服。
  2. 你可以去Matlab官方的社区去寻求帮助地址:MATLAB Central
  3. 你可以去Matlab工作人员的官方Blog寻求帮助:Art of MATLABDoug's Pick of the WeekImage ProcessingMATLAB Desktop等等
  4. 在世界范围寻求帮助。很多Matlab使用者都是在自己的Blog中涉及到自己的使用体会和自己遇到的问题,你可以在他们的Blog中逛逛,说不定会收获以外。我的方法是利用Google Reader订阅Technorati上搜索到的Matlab结果,这样可以使你在Google阅读器中就能看到大量关于Matlab相关内容的博客更新了。
  5. 买参考资料来解决你的问题,我遇到的很多Matlab资料介绍的都比较全,但是很少有针对某一学科很详细的参考书籍市场上能找到。

最后我想如果你的博客中也时常会涉及到一些 Matlab的内容不如把你的Rss地址或者博客地址与大家共享一下。

首先我把我的博客订阅地址共享一下: http://feed.feedsky.com/matlab

 

Posted in Matlab, 杂谈 | Tagged , , , | Leave a comment

为GUI设置背景图片

方法如下:

  1. 创建一个GUI。
  2. 拖入一个坐标轴到工作区。
  3. 为坐标轴加入函数,做法:在坐标轴上右击鼠标 View Callbacks-->CreateFcn.
  4. 在函数区写入下面代码:

axes(hObject)
imshow('matlab.png')

11-02-2007 09_14 上午

 

具体操作如下:

 

[ratings]
Posted in Matlab, Matlab GUI, Matlab图形图像, Matlab基础 | Tagged , , | 5 Comments

把弧度转化为角度

Matlab绘制三角函数是以弧度作为自变量的,这也是所有高级语言采用的共同方法。下面是一个例子:

在命令行中输入:

x=0:pi/100:2*pi;

plot(x,sin(x));

可以得到0~2π区间内sinx的函数图像,可是这个图像横坐标是弧度形式。对于读者来说更希望看到的是角度表示的横坐标。下面的方法可以实现转换:

图1是曲柄滑块机构的滑块位移随曲柄转角变化的曲线,可以看到横坐标是以弧度来表示的。现在我们进行转换,进入Figure编辑器——>点击show plot tool按钮(见图2)——>点击Ticks...(见图2)——>在图3界面里为弧度加上相应的角度——>效果图(见图5)

滑块位移曲线1

图 1

09-12-2007 11_23 下午

图 2

fig2

图 3

滑块位移曲线2

图 4

[ratings]

Posted in Matlab, Matlab图形图像, Matlab基础 | Tagged , , | Leave a comment

怎样将CONSTR函数 转换成 FMINCON函数?

最近发现目前还有不少期刊文献中利用Constr来求解约束优化问题,事实上当你把其文章中的那段含有Contr函数的代码在Matlab R14 或者新出来的Maltab 2007中运行时就会报错,根源在于Mathworks在Matlab 4以后将Constr函数改成了Fmincon函数.当然,相应的格式也发生了变化. 具体如何转换可以参考官方网站公布的一个例子:

原 CONSTR function调用:

OPTIONS = foptions;
OPTIONS(13) = 2; % Two equality constraints
OPTIONS(1) = 1;
OPTIONS(9) = 1;
A1 = [ 1 4 -3]; b1 = 2;
A2 = [ 2 5 0]; b2 = 9;
x0 = [1; .5; .8];
LB = []; UB = [];
[X,OPTIONS,LAMBDA,HESS] = ...
constr('myfuncon',x0,OPTIONS,LB,UB,'mygradcon',A1,b1,A2,b2);
% myfuncon.m
[F, C] = myfuncon(x,A1,b1,A2,b2)
F = x(1) + 0.0009*x(2)^3 + sin(x(3));
C(1,1) = A1*x-b; % Equality linear constraint
C(2,1) = 3*x(1)^2-1; % Equality nonlinear constraint
C(3,1) = A2*x-b2; % Inequality linear constraint
C(4,1) = 7*sin(x(2))-1; % Inequality nonlinear constraint
% mygradcon.m
[G, DC] = mygradcon(x,alpha)
G = [1; % Gradient of the objective
3*0.0009*x(2)^2;
cos(x(3))];
DC(:,1) = A1'; % Gradient of the constraints
DC(:,2) = [6*x(1); 0; 0];
DC(:,3) = A2';
DC(:,4) = [0; 7*cos(x(2)); 0];

新FMINCON调用:

OPTIONS = optimset(...
'Display', 'iter', ...
'GradCheck', 'on', ... % Check gradients.
'GradObj', 'on', ... % Gradient of objective is provided.
'GradConstr', 'on'); % Gradient of constraints is provided.
A1 = [ 1 4 -3]; b1 = 2; % Linear equalities
A2 = [ 2 5 0]; b2 = 9; % Linear inequalities
x0 = [1; .5; .8];
LB = []; UB = [];
[X,FVAL,EXITFLAG,OUTPUT,LAMBDA,GRAD,HESSIAN] = ...
fmincon(@myfun,x0,A2,b2,A1,b1,LB,UB,@mycon,OPTIONS);
% myfun.m
function [F,G] = myfun(x)
F = x(1) + 0.0009*x(2)^3 + sin(x(3));
G = [1;
3*0.0009*x(2)^2;
cos(x(3))];
% mycon.m
function [C,Ceq,DC,DCeq]= mycon(x)
Ceq(1,1) = 3*x(1)^2-1; % Equality nonlinear constraint
C(1,1) = 7*sin(x(2))-1; % Inequality nonlinear constraint
DCeq(:,1) = [6*x(1); 0; 0]; % Gradient of equality
% nonlinear constraint
DC(:,1) = [0; 7*cos(x(2)); 0]; % Gradient of inequality
% nonlinear constraint

另外本站重新开通了留言系统,大家可以方便留言了.[进入留言]

[ratings]

Posted in Matlab, Matlab基础 | Tagged , | 1 Comment

编写简单的计算器程序

从今天开始我会抽出一些时间来介绍如何利用Maltab来进行可视化编程使您的工作更加直观。今天我介绍如何编写简单的计算器程序。首先应设计好计算器的GUI界面 如下图所示,然后分别设置‘数据1’、‘数据2’、‘计算结果’的tag值为num1、num2和shuchu 当然你要是愿意也可以定义加减乘除按钮的tag属性,tag属性值也就是你的控件名字,给它取了名字就可以赋予它使命,要它执行命令了。

08-25-2007 03_39 下午

接着为加减乘除按钮编写回调函数:

加法按钮回调函数:

% --- Executes on button press in plus.
function plus_Callback(hObject, eventdata, handles)
% hObject handle to plus (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
shuchu = handles.num1+handles.num2;
set(handles.shuchu, 'String', shuchu);

减法按钮回调函数:

% --- Executes on button press in pushbutton7.
function pushbutton7_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton7 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
shuchu = handles.num1-handles.num2;
set(handles.shuchu, 'String', shuchu);

乘法按钮回调函数:

% --- Executes on button press in pushbutton5.
function pushbutton5_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton5 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
shuchu = handles.num1*handles.num2;
set(handles.shuchu, 'String', shuchu);

除法按钮回调函数:

% --- Executes on button press in pushbutton6.
function pushbutton6_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton6 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

shuchu = handles.num1/handles.num2;
set(handles.shuchu, 'String', shuchu);

回调函数的名字结构是由控件名字(tag值)与Callback通过‘—’连接而成

回调函数的作用是实现当控件被触发时执行函数命令

当然你也可以象我一样为你的GUI加一个退出按钮实现退出窗口;

退出窗口回调函数:

% --- Executes on button press in tuichu.
function tuichu_Callback(hObject, eventdata, handles)
% hObject handle to tuichu (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
close('AandB');

计算器GUI编程是Matlab GUI应用的基础,希望你在学会它之后,能够得以启发编写满足自己需求的图形用户界面程序,如果你对此程序还有疑问,可以在这里留言。

[ratings]
Posted in Matlab, Matlab GUI | Tagged , , | 4 Comments

使您输出的maltab图像更具有可读性

我们不仅需要plot命令来显示数据,有时我们甚至需要把图像最重要的部分突出显示给图像的读者。ShadePlotForEmphasis(目标另存为)帮我们做到了这一点。你可以用以下代码进行检验:

% DEFINE DATA
P=[ ...
98 98 94 91 84 83 82 87 88 89 91 91 90 89 89 90 91 91 87 86 87 84 79 80 ...
85 86 86 85 93 93 93 93 97 97 95 93 93 94 95 96 96 92 89 90 91 91 91 92 ...
93 95 99 98 99 97 95 95 94 90 92 93 93 95 94 95 93 92 92 92 91 90 89 89 ...
90 89 90 89 88 84 84 83 84 85 85 84 82 82 82 79 80 79 80 78 78 81 83 82 ...
81 79 77 77 78 77 78 79 79 81 81 81 78 78 78 78 77 78 79 79 79 79 81 85 ...
86 86 86 87 85 84 85 86 88 88 90 88 88 87 86 86 85 87 87 87 86 85 84 83 ...
82 81 81 82 81 80 82 81 79 80 81 80 80 79 85 85 82 83 84 85 86 87 86 86 ...
85 85 85 83 79 81 83 83 84 82 80 80 80 80 84 81 80 76 71 70 70 69 69 68 ...
67 68 68 68 67 68 68 70 70 72 72 71 69 68 68 68 67 68 67 66 67 67 67 66 ...
65 66 65 62 60 60 59 59 59 59 65 66 63 65 68 68 68 68 69 73 74 71 71 69 ...
71 72 72 76 76 74 77 80 82 80 78 80 80 80 80 81 80 79 77];
T=today-length(P)+1:today;
Y={today-[13 74],today-[142 172]};
G={today-[30 51]};
% PLOT THE DATA
plot(T,P);
datetick;
line(get(gca,'Xlim'),[80 80])
line(get(gca,'Xlim'),[68 68])%
title({'ShadePlotForEmphasis','(P<80 yellow, P<68 green)'});
% DRAW SOME YELLOW BARS
ShadePlotForEmpahsis(Y,'y',0.5);
% DRAW A GREEN BAR
ShadePlotForEmpahsis(G,'g',0.5);

shading

[Source from: Doug’s Pick of the Week]

[ratings]
Posted in Matlab, Matlab图形图像 | Tagged , , | Leave a comment