这是一个课题系统中的实验,基于Visual C#和MATLAB的对到达过程模拟生成系统,本文主要记录一下自己实现产生符合log-normal随机数的时间点序列,并调用MATLAB进行画图的过程。界面比较简陋,主要为了实现这个过程,如下图:
1.基于窗体程序实现生成符合log-normal分布的时间点
1.1界面设计
(1)添加控件
添加两个按钮控件,和一个ListView控件。分别命名为makerand,plot,biaoge。
添加一个计时器。(我想到的方法就是利用计时器响应makerand按钮的消息产生随机数)
在这个窗体类中添加产生log-normal随机数的函数,一些分布的函数可以在网上找函数,也可以利用概率密度自己得到,因为这个函数不是自己写的,我就不粘贴了。
函数声明如下:double AverageRandom(double min, double max);
double LogNormal(double x, double miu, double sigma);
double Random_LogNormal(double miu, double sigma, double min, double max);
点击按钮,在消息响应函数中添加代码:
在 private void makerand_Click(object sender, EventArgs e)中添加timer1.Start();
在计时器中添加产生随机数的过程,代码如下:
if (currentCount < 50)
{
timespace [currentCount]= Random_LogNormal(0.01, 8, 0.1, 15);
ListViewItem lvi = new ListViewItem();
lvi.Text = timespace[currentCount].ToString();
biaoge.Items.Add(lvi);
currentCount += 1;
time[currentCount] = time[currentCount - 1] + timespace[currentCount - 1];
}
else
{
timer1.Stop();
}
ListView的属性自己设定,怎么好看怎么整就行,在后续的过程中,我会完善自己的界面。
此时,模拟产生随机数的这个功能就实现了,点击产生随机数按钮,效果如下图:
2.基于C#调用MATLAB进行画图
根据生成的随机点,我们设置一个time=0,每个随机数就是一个时间间隔,进行打点,我在这里想到的是调用C#和MATLAB的接口,进行画图,因为我在调用的时候遇到了一些问题,所以说我决定记录一下我实现调用的过程。
思路就是,在窗体响应完plot消息后,c#调用已经写好的MATLAB动态链接库dll进行画图。
具体步骤如下:
在MATLAB 2016a中添加一个函数timeplot.m,在里面添加如下代码:
function plottime = timeplot(time );
plottime=time;
y=[0];
plot(plottime,y,'o');
end
保存之后,在MATLAB 2016a中的command中输入deploytool选择 library compile进行动态库的编写如下:
添加你想要做成dll的函数,然后选择.NET Assembly。这里需要注意的是 在界面中有一个class的标签,这个要写清楚,因为在你将dll添入c#中后,所调用的类就是你这个类的名字。
在把它打包成dll后放入你的C#项目中,添加引用。在c#调用MATLAB的过程中,我们会进行参数的传递,这个时候我们需要把原本在MATLAB中的NWArray.dll放入c#的项目中,进行参数的传递。
在原项目中添加如下引用:
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
using timeplot;
这个timeplot就是我生成的dll。在下面的代码中的plotthetime类就是我在MATLAB中定义的类。
MWNumericArray plot = timespace;
plotthetime pl = new plotthetime();
pl.timeplot(plot);
这样就实现画图了,效果如下:
因为调用的是接口,所以它的执行过程比较慢。
在我们实现调用的过程中,可能会出现一个参数没有传递成功的错误,这个时候我们把项目属性编程.NET Framework4.0既可,我会把源码的地址发一下。第一次写博客,写的不好请包涵。这里首要要感谢我们学院的安老师在整个过程中给我的帮助,让我开拓了建模的思想。