如何编程实现一个基本的微分器

65 篇文章 5 订阅

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

    到此;从曲线看,计算数值微分的基本思路是没有问题的;第一个点有点问题,可能是第一个点算的不对,也可能是控件的使用有点问题;

把上面思路理清,做出一个通用数值微分计算函数,一个基本的微分器就实现了;或者完全理解一种数值微分的计算方法,做一个通用函数也一样;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值