利用上一篇中介绍的VC和MATLAB图形库和数学库,对MATLAB常用的图形库函数和数学库函数进行封装,改变成为C++习惯的接口形式,调用命令和MATLAB绘图命令完全相同,这样可以省去使用MATLAB图形库和数学库数据mwArray的操作,非常方便使用,即使对MATLAB图形库和数学库完全不熟悉,也同样能够在VC++中绘制精美的数学图形。以下是示例:
More details could be found in my published book:
MATLAB编程基础与典型应用
北京:人民邮电出版社,2008
ISBN:978-7-115-17932-6/TP
Pls contact me with Email:lhd06@mails.tsinghua.edu.cn
Wednesday, April 15, 2009
VC++调用MATLAB图形库和数学库演示
Friday, March 13, 2009
MATLAB BP神经网络编程(4)
MATLAB BP神经网络编程(4)
在MATLAB工具箱bp神经网络应用介绍(1),(2)和(3)中介绍了三个
BP神经网络的训练函数,这里接着介绍第四个人工神经网络训练函数traingdm函数。
(4)traingdm函数
同traingd函数相似,traingdm函数采用动量梯度下降法训练人工bp网络,通过设置net.trainParam.mc来设置动量因子的大小。
net=newff(minmax(P),[5,1],{'logsig','purelin'},'traingdm');
net.trainParam
ans =
epochs: 100
goal: 0
lr: 0.0100
max_fail: 5
mc: 0.9000
min_grad: 1.0000e-010
show: 25
time: Inf
在Mathlab的命令行窗口中输入:
net=newff(minmax(P),[5,1],{'logsig','purelin'},'traingdm');
net.trainParam.show = 50;
net.trainParam.lr = 0.1;
net.trainParam.mc = 0.9;
net.trainParam.epochs = 300;
net.trainParam.goal = 0.01;
[net,tr]=train(net,P,T);
%回代检验
A=sim(net,P);
%测试样本检验
a=sim(net,p);
训练后的人工神经网络对测试样本的输出为:
a =
0.6104 0.5641 0.4307
更多MATLAB BP神经网络编程资源:
More details could be found in my published book:
MATLAB编程基础与典型应用
北京:人民邮电出版社,2008
ISBN:978-7-115-17932-6/TP
Pls contact me with Email:lhd06@mails.tsinghua.edu.cn
Thursday, March 12, 2009
二次规划问题MATLAB求解
二次规划问题MATLAB求解
标准的二次规划问题形式要求目标函数是关于优化变量的二次函数,而约束条件只包含线性等式不等式约束和优化变量自身的上下限约束。对于二次规划问题,如果将目标函数看着非线性函数,那么二次规划问题则可以使用fmincon函数来进行求解。在Matlab优化工具箱中,提供了quadprog函数,求解具有标准二次规划问题。quadprog函数的调用格式如下:
x = quadprog(H,f,A,b)
x = quadprog(H,f,A,b,Aeq,beq)
x = quadprog(H,f,A,b,Aeq,beq,lb,ub)
x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0)
x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)
[x,fval] = quadprog(...)
[x,fval,exitflag] = quadprog(...)
[x,fval,exitflag,output] = quadprog(...)
[x,fval,exitflag,output,lambda] = quadprog(...)
在quadprog函数输入变量中,H和f分别为二次项系数矩阵和一次项系数向量。在对二次规划问题求解时,首先需要将目标函数转化为二次规划问题标准形式,得到系数矩阵H和系数向量f。
【演示实例】求解二次规划问题
在Matlab命令窗口中输入以下程序段:
H=[2 -1;-1 2]; %标准变换后的H矩阵
f=[-10;4]; %标准变换后的f向量
lb=zeros(2,1); %下限约束
A=[-1 -1]; %线性不等式系数矩阵
b=-8; %线性不等式右侧常数向量
[x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,[ ],[ ],lb) %二次规划求解
返回结果如下:
x =
6.3333
1.6667
fval =
-24.3333
exitflag =
1
退出标志exitflag表明函数收敛与极值点。同样,将目标函数看着是非线性函数时,可以使用fmincon函数对二次规划问题进行求解,程序代码如下:
A=[-1 -1];
b=[-8];
lb=[0 0];
x0=[0;0];
fun=@(x)(x(1)^2-10*x(1)-x(1)*x(2)+x(2)^2-4*x(2)); %@函数句柄
options=optimset('Display','iter','MaxFunEvals',1e5);
[x,fval,exitflag,output,lambda,grad,hessian]=fmincon(fun,x0,A,b,[],[],lb,[],[],options)
返回结果,显示的迭代过程如下:
max Line search Directional First-order
Iter F-count f(x) constraint steplength derivative optimality Procedure
0 3 0 8 Infeasible
1 6 -40 -4 1 36 6 start point
2 10 -50.7721 -6.9 0.5 0.864 1.57
3 13 -51.9816 -5.743 1 0.337 0.204
4 16 -52 -6 1 4.26e-008 4.45e-006
经过4代迭代后,方向导数为4.26e-8,因此搜索方向导数过小导致搜索过程结束,退出标志exitflag=5。输出结果如下:
x =
8.0000
6.0000
fval =
-52.0000
exitflag =
5
由于fmincon函数退出标志exitflag=5,因此无法判断此求解结果是否为全局极值点,但是比较fmincon函数和quadprog函数二者求解结果可以看出,fmincon函数的求解结果比quadprog函数要好。
More details could be found in my published book:
MATLAB编程基础与典型应用
北京:人民邮电出版社,2008
ISBN:978-7-115-17932-6/TP
Pls contact me with Email:lhd06@mails.tsinghua.edu.cn
Saturday, February 21, 2009
Simulink库文件的建立
Simulink仿真平台可以建立用户自定义的库文件,并将它们显示在Library Browser窗口下,方便用户进行模块的操作。用户可以将一些平时使用比较频繁,或者自己建立的一些封装子模块集中在一块,方便使用。要建立Simulink库文件,首先启动Simulink工作窗口,单击菜单栏【File】下的【New】选项,选择【library】选项,打开一个新的Library窗口界面,此时,用户可以将自己需要添加的一些模块加入到新的窗口中。然后保存为所需要定义的库文件名称。这样,就建立了一个自定义的库文件。
虽然按照上述的方法,将一些用户常用的模块集中在一块,可以方便使用,但是,每次使用都需要打开自定义模块的窗口,而无法象Simulink仿真模块一样显示在Library Browser窗口下。按照以下步骤可以实现该功能:
•首先建立一个库文件,将自定义的封装模块加入库文件中,保存文件,在这里,命名为:own_definition.lib。
•在MATLAB路径下创建存放库文件的路径,也即自定义的模块库在Library Browser下的显示位置。注意在MATLAB中,每一个模块库文件所在的路径必须不同。创建的Maltab路径是:D:\MATLAB\R2006a\toolbox\Simulink\myLibrary(根据自己的MATLAB安装路径来确定),其中myLibrary为自定义的文件夹。
•将第一步中建立的库文件拷贝到新建的Matlab路径下。在MATLAB主窗口的【File】菜单栏下选择【Set Path】选项,然后单击【Add Folder】按钮,将新建的路径添加进来,然后保存(Save),退出(Close)。
• 要显示自定义的模块库,还需要拷贝slblocks.m函数到新建的路径下。在MATLAB的命令窗口中输入:
这样就可以打开slbocks.m文件模板,为了将自定义的模块库显示在Library Browser窗口下,需要对该程序进行修改。在本演示中,模块库的名称为own_definition.lib,因此对应的slbocks.m文件为:
按照以上的代码修改文件后,将其拷贝到自定义的路径下,这样在原来自定义的路径下就包含有两个文件,一个是自定义模块库文件,另一个则是slbocks.m文件。
•重新启动MATLAB环境,启动Simulink仿真平台,可以发现在Simulink Library Browser窗口下增加了一个新的模块库,名称是own Definition Library,展开后,可以看到内部的自定义模块。那么用户可以方便地进行拖放模块,就可以使用自定义的封装模块了。
More details could be found in my published book:
MATLAB编程基础与典型应用
北京:人民邮电出版社,2008
ISBN:978-7-115-17932-6/TP
Pls contact me with Email:lhd06@mails.tsinghua.edu.cn
更多MATLAB交流资源,欢迎访问:
MATLAB工具箱BP神经网络应用介绍(3)
MATLAB工具箱BP神经网络应用介绍(2)
MATLAB工具箱BP神经网络应用介绍(1)
Solve nonlinear least-squares (nonlinear data-fitt...
非线性最小二乘曲线拟和问题
Visual C++中创建MAT文件
Visual C++中使用MATLAB语言C,C++数学函数库
Visual C++中调用MATLAB引擎配置
MATLAB引擎技术介绍
MATLAB里关于集合运算和二进制数的运算的函数
在Matlab图形中怎样输入特殊符号
怎么把Matlab中数组元素写入到文本文档中
在同一个M文件中,怎样实现参数的传递
虽然按照上述的方法,将一些用户常用的模块集中在一块,可以方便使用,但是,每次使用都需要打开自定义模块的窗口,而无法象Simulink仿真模块一样显示在Library Browser窗口下。按照以下步骤可以实现该功能:
•首先建立一个库文件,将自定义的封装模块加入库文件中,保存文件,在这里,命名为:own_definition.lib。
•在MATLAB路径下创建存放库文件的路径,也即自定义的模块库在Library Browser下的显示位置。注意在MATLAB中,每一个模块库文件所在的路径必须不同。创建的Maltab路径是:D:\MATLAB\R2006a\toolbox\Simulink\myLibrary(根据自己的MATLAB安装路径来确定),其中myLibrary为自定义的文件夹。
•将第一步中建立的库文件拷贝到新建的Matlab路径下。在MATLAB主窗口的【File】菜单栏下选择【Set Path】选项,然后单击【Add Folder】按钮,将新建的路径添加进来,然后保存(Save),退出(Close)。
• 要显示自定义的模块库,还需要拷贝slblocks.m函数到新建的路径下。在MATLAB的命令窗口中输入:
>> which('slblocks.m', '-all')
>> open('D:\MATLAB\R2006a\toolbox\Simulink\blocks\slblocks.m')
这样就可以打开slbocks.m文件模板,为了将自定义的模块库显示在Library Browser窗口下,需要对该程序进行修改。在本演示中,模块库的名称为own_definition.lib,因此对应的slbocks.m文件为:
function blkStruct = slblocks
%SLBLOCKS Defines a block library.
% Library's name. The name appears in the Library Browser's
% contents pane.
blkStruct.Name = ['own Definition' sprintf('\n') 'Library']; % 模块库的显示名称
% The function that will be called when the user double-clicks on
% the library's name. ;
blkStruct.OpenFcn = 'own_definition'; %自定义的模块库名称
% The argument to be set as the Mask Display for the subsystem. You
% may comment this line out if no specific mask is desired.
% Example: blkStruct.MaskDisplay =
'plot([0:2*pi],sin([0:2*pi]));';
% No display for now.
% blkStruct.MaskDisplay = '';
% End of blocks
按照以上的代码修改文件后,将其拷贝到自定义的路径下,这样在原来自定义的路径下就包含有两个文件,一个是自定义模块库文件,另一个则是slbocks.m文件。
•重新启动MATLAB环境,启动Simulink仿真平台,可以发现在Simulink Library Browser窗口下增加了一个新的模块库,名称是own Definition Library,展开后,可以看到内部的自定义模块。那么用户可以方便地进行拖放模块,就可以使用自定义的封装模块了。
More details could be found in my published book:
MATLAB编程基础与典型应用
北京:人民邮电出版社,2008
ISBN:978-7-115-17932-6/TP
Pls contact me with Email:lhd06@mails.tsinghua.edu.cn
更多MATLAB交流资源,欢迎访问:
Wednesday, February 11, 2009
MATLAB工具箱BP神经网络应用介绍(3)
在MATLAB工具箱bp神经网络(1)和(2)中介绍了两个BP神经网络的训练函数,这里接着介绍第三个人工神经网络训练函数traingdx函数。
traingdx函数
traingdx函数结合了自适应改变学习速率和动量法,和traingda函数完全相同,只是增加了一个动量因子参数mc。
net=newff(minmax(P),[5,1],{'logsig','purelin'},'traingdx');在MATLAB命令行窗口中输入:
net.trainParam
ans =
epochs: 100
goal: 0
lr: 0.0100 %学习速率基值
lr_dec: 0.7000 %学习速率减少率
lr_inc: 1.0500 %学习速率增加率
max_fail: 5
max_perf_inc: 1.0400
mc: 0.9000 %动量因子
min_grad: 1.0000e-006
show: 25
time: Inf
net=newff(minmax(P),[5,1],{'logsig','purelin'},'traingdx');下图所示为traingdx函数bp神经网络训练过程曲线,测试样本的输出结果为:
net.trainParam.show = 50;
net.trainParam.lr = 0.1;
net.trainParam.lr_inc = 1.05;
net.trainParam.lr_dec = 0.85;
net.trainParam.mc = 0.9;
net.trainParam.epochs = 300;
net.trainParam.goal = 0.01;
[net,tr]=train(net,P,T);
%回代检验
A=sim(net,P);
%测试样本检验
a=sim(net,p);
TRAINGDX-calcgrad, Epoch 0/300, MSE 5.70591/0.01, Gradient 7.94678/1e-006
TRAINGDX-calcgrad, Epoch 50/300, MSE 0.0185869/0.01, Gradient 0.0617651/1e-006
TRAINGDX-calcgrad, Epoch 72/300, MSE 0.00997184/0.01, Gradient 0.0194848/1e-006
TRAINGDX, Performance goal met.
a =
0.5880 0.6223 0.5236
More details could be found in my published book:
MATLAB编程基础与典型应用
北京:人民邮电出版社,2008
ISBN:978-7-115-17932-6/TP
Pls contact me with Email:lhd06@mails.tsinghua.edu.cn
更多MATLAB资源,欢迎访问:
Tuesday, February 10, 2009
MATLAB工具箱BP神经网络应用介绍(2)
在上一篇MATLAB工具箱bp神经网络应用介绍中,已经介绍了traingd函数的使用。这一节将继续介绍MATLABBP神经网络训练函数。
(2)traingda函数
当BP神经网络使用traingd函数和traingdm函数训练时,学习速率在训练过程中保持恒定不变,那么训练结果对学习速率的灵敏度大,不同的学习速率对网络的训练结果影响大,如果学习速率过大,那么网络将变得不稳定,如果学习速率过小,那么网络收敛速度慢,训练时间大大加长。因此,对于给定训练样本和目标样本,必须首先确定最优的学习速率。而traingda函数在人工神经网络训练中采用变学习速率的网络训练算法,可以有效地克服学习速率难以确定的缺点,在训练过程中自适应改变学习速率的大小。
net=newff(minmax(P),[5,1],{'logsig','purelin'},'traingda');在MATLAB命令行窗口中输入以下程序段:
net.trainParam
ans =
epochs: 100
goal: 0
lr: 0.0100 %学习速率基值
lr_inc: 1.0500 %学习速率增加率为1.05
lr_dec: 0.7000 %学习速率减少率为0.7
max_fail: 5
max_perf_inc: 1.0400
min_grad: 1.0000e-006
show: 25
time: Inf
net=newff(minmax(P),[5,1],{'logsig','purelin'},'traingda');下图所示为traingda函数bp神经网络训练过程曲线,BP神经网络对测试样本的输出结果为:
net.trainParam.show = 50;
net.trainParam.lr = 0.1;
net.trainParam.lr_inc = 1.05;
net.trainParam.lr_dec = 0.85;
net.trainParam.epochs = 300;
net.trainParam.goal = 0.01;
[net,tr]=train(net,P,T);
%回代检验
A=sim(net,P);
%测试样本检验
a=sim(net,p);
TRAINGDA-calcgrad, Epoch 0/300, MSE 0.784702/0.01, Gradient 1.98321/1e-006
TRAINGDA-calcgrad, Epoch 36/300, MSE 0.00993732/0.01, Gradient 0.0156508/1e-006
TRAINGDA, Performance goal met.
a =
0.4192 0.5750 0.7746
More details could be found in my published book:
MATLAB编程基础与典型应用
北京:人民邮电出版社,2008
ISBN:978-7-115-17932-6/TP
Pls contact me with Email:lhd06@mails.tsinghua.edu.cn
更多MATLAB交流,欢迎访问:
Subscribe to:
Posts (Atom)