C#调用MATLAB画图实现到达过程的模拟

    这是一个课题系统中的实验,基于Visual C#和MATLAB的对到达过程模拟生成系统,本文主要记录一下自己实现产生符合log-normal随机数的时间点序列,并调用MATLAB进行画图的过程。界面比较简陋,主要为了实现这个过程,如下图:

C#调用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的属性自己设定,怎么好看怎么整就行,在后续的过程中,我会完善自己的界面。

          此时,模拟产生随机数的这个功能就实现了,点击产生随机数按钮,效果如下图:

C#调用MATLAB画图实现到达过程的模拟

            

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);

             这样就实现画图了,效果如下:

               C#调用MATLAB画图实现到达过程的模拟

            因为调用的是接口,所以它的执行过程比较慢。

            在我们实现调用的过程中,可能会出现一个参数没有传递成功的错误,这个时候我们把项目属性编程.NET Framework4.0既可,我会把源码的地址发一下。第一次写博客,写的不好请包涵。这里首要要感谢我们学院的安老师在整个过程中给我的帮助,让我开拓了建模的思想。