接此;
https://blog.csdn.net/bcbobo21cn/article/details/106674597
假设要自己编程实现Matlab仿真功能;那么,必然要实现一个一个的仿真组件;就是可拖动到仿真窗口的一个一个小方块组件;有共用
基本库;还有进一步的具体库;
其中每一个组件,其实质是实现一种数学运算;目前这块没听说有类库之类的可调用的组件开发出来;
先来看一个最最基本问题;如果实现一些基本组件的话,一般的数学和逻辑运算,原理还是不难,要具体编程实现一个个组件然后可连
线运算,初想一下巨复杂;
基本加减乘除和逻辑与或非原理还是好理解;
但是仿真必然包含的基本组件有积分器和微分器;就像学电路原理时,里面都有积分和微分组件;
我们知道;常用基本函数的微分和积分都有固定公式;先看微分器;
sin(x)的微分是cos(x);x平方的微分是2x,x^2 = 2x;斜线的微分是一根横线,y=3+4t,微分是,y=3;
仿真组件就要实现一个微分器;如何编程实现一个微分器呢?
这个并不是按前面公式来的;一个电路的微分器来说,它输入端有一个输入,瞬间同时,输出端就有一个值;如果输入端的序列是sin
(x),输出端的序列自然就是cos(x);如果输入端的序列是x^2,输出端的序列自然就是2*x;如果输入端的序列是x^3,输出端的序列自然就
是3*x^2;如果输入端的序列是一根斜线,输出端的序列自然就是一根横线;
并不能等到输入端的值都收集齐,判断这是一个正弦序列,然后再在输出端输出一个余弦序列;
就是不能按初等函数的微积分公式做这玩意;得按学微积分时 dy/dx 类似的那一套来;这块上学的时候好像听懂的人不多,都辜负了教授;
或者按数值微分的计算方法,如下图的公式来;或者按微积分数值计算方法,算来的也是一样;
下面来看一下初步的编程实现微分器的思路,并用mschart控件绘制曲线验证一下;
每个窗体使用2个mschart控件;第一个控件绘制一条数学曲线;然后按数值微分的计算方法对第一条曲线计算微分,结果绘制第二条曲线;看第二条曲线是否是第一条曲线的微分;
按数值微分的含义,一个函数某点的微分,等于 (y值增量-y值) / x变化量;程序里面直接算Y值增量,X变化量绘制到控件上都是1;然后把各点的微分值连接起来;Y纵轴,X横轴;
看sin(x)的微分;代码如下;
private double pi = 3.14159265;
......
chart1.Series["Series1"].ChartType=SeriesChartType.Line;
chart1.Series["Series1"].BorderWidth = 3;
chart1.Series["Series1"].Points.AddY(Math.Sin(0));
chart1.Series["Series1"].Points.AddY(Math.Sin(pi/8));
chart1.Series["Series1"].Points.AddY(Math.Sin(pi*2/8));
chart1.Series["Series1"].Points.AddY(Math.Sin(pi*3/8));
chart1.Series["Series1"].Points.AddY(Math.Sin(pi*4/8));
chart1.Series["Series1"].Points.AddY(Math.Sin(pi*5/8));
chart1.Series["Series1"].Points.AddY(Math.Sin(pi*6/8));
chart1.Series["Series1"].Points.AddY(Math.Sin(pi*7/8));
chart1.Series["Series1"].Points.AddY(Math.Sin(pi*8/8));
chart1.Series["Series1"].Points.AddY(Math.Sin(pi*9/8));
chart1.Series["Series1"].Points.AddY(Math.Sin(pi*10/8));
chart1.Series["Series1"].Points.AddY(Math.Sin(pi*11/8));
chart1.Series["Series1"].Points.AddY(Math.Sin(pi*12/8));
chart1.Series["Series1"].Points.AddY(Math.Sin(pi*13/8));
chart1.Series["Series1"].Points.AddY(Math.Sin(pi*14/8));
chart1.Series["Series1"].Points.AddY(Math.Sin(pi*15/8));
chart1.Series["Series1"].Points.AddY(Math.Sin(pi*16/8));
chart2.Series["Series1"].ChartType=SeriesChartType.Line;
chart2.Series["Series1"].BorderWidth = 3;
double d1 = Math.Sin(pi/8) - Math.Sin(0);
double d2 = Math.Sin(pi*2/8) - Math.Sin(pi/8);
double d3 = Math.Sin(pi*3/8) - Math.Sin(pi*2/8);
double d4 = Math.Sin(pi*4/8) - Math.Sin(pi*3/8);
double d5 = Math.Sin(pi*5/8) - Math.Sin(pi*4/8);
double d6 = Math.Sin(pi*6/8) - Math.Sin(pi*5/8);
double d7 = Math.Sin(pi*7/8) - Math.Sin(pi*6/8);
double d8 = Math.Sin(pi*8/8) - Math.Sin(pi*7/8);
double d9 = Math.Sin(pi*9/8) - Math.Sin(pi*8/8);
double d10 = Math.Sin(pi*10/8) - Math.Sin(pi*9/8);
double d11 = Math.Sin(pi*11/8) - Math.Sin(pi*10/8);
double d12 = Math.Sin(pi*12/8) - Math.Sin(pi*11/8);
double d13 = Math.Sin(pi*13/8) - Math.Sin(pi*12/8);
double d14 = Math.Sin(pi*14/8) - Math.Sin(pi*13/8);
double d15 = Math.Sin(pi*15/8) - Math.Sin(pi*14/8);
double d16 = Math.Sin(pi*16/8) - Math.Sin(pi*15/8);
chart2.Series["Series1"].Points.AddY(d1);
chart2.Series["Series1"].Points.AddY(d1);
chart2.Series["Series1"].Points.AddY(d2);
chart2.Series["Series1"].Points.AddY(d3);
chart2.Series["Series1"].Points.AddY(d4);
chart2.Series["Series1"].Points.AddY(d5);
chart2.Series["Series1"].Points.AddY(d6);
chart2.Series["Series1"].Points.AddY(d7);
chart2.Series["Series1"].Points.AddY(d8);
chart2.Series["Series1"].Points.AddY(d9);
chart2.Series["Series1"].Points.AddY(d10);
chart2.Series["Series1"].Points.AddY(d11);
chart2.Series["Series1"].Points.AddY(d12);
chart2.Series["Series1"].Points.AddY(d13);
chart2.Series["Series1"].Points.AddY(d14);
chart2.Series["Series1"].Points.AddY(d15);
y=3+3t的微分;t横轴;
chart1.Series["Series1"].ChartType=SeriesChartType.Line;
chart1.Series["Series1"].BorderWidth = 3;
chart1.Series["Series1"].Points.AddY(0);
chart1.Series["Series1"].Points.AddY(3);
chart1.Series["Series1"].Points.AddY(6);
chart1.Series["Series1"].Points.AddY(9);
chart1.Series["Series1"].Points.AddY(12);
chart1.Series["Series1"].Points.AddY(15);
chart1.Series["Series1"].Points.AddY(18);
chart1.Series["Series1"].Points.AddY(21);
chart1.Series["Series1"].Points.AddY(24);
chart1.Series["Series1"].Points.AddY(27);
chart1.Series["Series1"].Points.AddY(30);
chart1.Series["Series1"].Points.AddY(33);
chart1.Series["Series1"].Points.AddY(36);
chart1.Series["Series1"].Points.AddY(39);
chart1.Series["Series1"].Points.AddY(42);
chart1.Series["Series1"].Points.AddY(45);
chart1.Series["Series1"].Points.AddY(48);
double d1 = 3-0;
double d2 = 6-3;
double d3 = 9-6;
double d4 = 12-9;
double d5 = 15-12;
double d6 = 18-15;
double d7 = 21-18;
double d8 = 24-21;
double d9 = 27-24;
double d10 = 30-27;
double d11 = 33-30;
double d12 = 36-33;
double d13 = 39-36;
double d14 = 42-39;
double d15 = 45-42;
double d16 = 48-45;
chart2.Series["Series1"].ChartType=SeriesChartType.Line;
chart2.Series["Series1"].BorderWidth = 3;
chart2.Series["Series1"].Points.AddY(d1);
chart2.Series["Series1"].Points.AddY(d1);
chart2.Series["Series1"].Points.AddY(d2);
chart2.Series["Series1"].Points.AddY(d3);
chart2.Series["Series1"].Points.AddY(d4);
chart2.Series["Series1"].Points.AddY(d5);
chart2.Series["Series1"].Points.AddY(d6);
chart2.Series["Series1"].Points.AddY(d7);
chart2.Series["Series1"].Points.AddY(d8);
chart2.Series["Series1"].Points.AddY(d9);
chart2.Series["Series1"].Points.AddY(d10);
chart2.Series["Series1"].Points.AddY(d11);
chart2.Series["Series1"].Points.AddY(d12);
chart2.Series["Series1"].Points.AddY(d13);
chart2.Series["Series1"].Points.AddY(d14);
chart2.Series["Series1"].Points.AddY(d15);
chart2.Series["Series1"].Points.AddY(d16);
y=x^2的微分;按初等函数微分公式是2x;看下按数值微分思路算出来的情况;
chart1.Series["Series1"].ChartType=SeriesChartType.Line;
chart1.Series["Series1"].BorderWidth = 3;
chart1.Series["Series1"].Points.AddY(0);
chart1.Series["Series1"].Points.AddY(2);
chart1.Series["Series1"].Points.AddY(4);
chart1.Series["Series1"].Points.AddY(9);
chart1.Series["Series1"].Points.AddY(16);
chart1.Series["Series1"].Points.AddY(25);
chart1.Series["Series1"].Points.AddY(36);
chart1.Series["Series1"].Points.AddY(49);
chart1.Series["Series1"].Points.AddY(64);
chart1.Series["Series1"].Points.AddY(81);
chart1.Series["Series1"].Points.AddY(100);
chart1.Series["Series1"].Points.AddY(121);
chart1.Series["Series1"].Points.AddY(144);
chart1.Series["Series1"].Points.AddY(169);
chart1.Series["Series1"].Points.AddY(196);
chart1.Series["Series1"].Points.AddY(225);
chart1.Series["Series1"].Points.AddY(256);
double d1 = 2-0;
double d2 = 4-2;
double d3 = 9-4;
double d4 = 16-9;
double d5 = 25-16;
double d6 = 36-25;
double d7 = 49-36;
double d8 = 64-49;
double d9 = 81-64;
double d10 = 100-81;
double d11 = 121-100;
double d12 = 144-121;
double d13 = 169-144;
double d14 = 196-169;
double d15 = 225-196;
double d16 = 256-225;
chart2.Series["Series1"].ChartType=SeriesChartType.Line;
chart2.Series["Series1"].BorderWidth = 3;
chart2.Series["Series1"].Points.AddY(d1);
chart2.Series["Series1"].Points.AddY(d1);
chart2.Series["Series1"].Points.AddY(d2);
chart2.Series["Series1"].Points.AddY(d3);
chart2.Series["Series1"].Points.AddY(d4);
chart2.Series["Series1"].Points.AddY(d5);
chart2.Series["Series1"].Points.AddY(d6);
chart2.Series["Series1"].Points.AddY(d7);
chart2.Series["Series1"].Points.AddY(d8);
chart2.Series["Series1"].Points.AddY(d9);
chart2.Series["Series1"].Points.AddY(d10);
chart2.Series["Series1"].Points.AddY(d11);
chart2.Series["Series1"].Points.AddY(d12);
chart2.Series["Series1"].Points.AddY(d13);
chart2.Series["Series1"].Points.AddY(d14);
chart2.Series["Series1"].Points.AddY(d15);
chart2.Series["Series1"].Points.AddY(d16);
到此;从曲线看,计算数值微分的基本思路是没有问题的;第一个点有点问题,可能是第一个点算的不对,也可能是控件的使用有点问题;
把上面思路理清,做出一个通用数值微分计算函数,一个基本的微分器就实现了;或者完全理解一种数值微分的计算方法,做一个通用函数也一样;