如何编程实现一个基本的微分器
接此;
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);
到此;从曲线看,计算数值微分的基本思路是没有问题的;第一个点有点问题,可能是第一个点算的不对,也可能是控件的使用有点问题;
把上面思路理清,做出一个通用数值微分计算函数,一个基本的微分器就实现了;或者完全理解一种数值微分的计算方法,做一个通用函数也一样;
如何编程实现一个基本的微分器相关推荐
- python任意输入一个正整数、判断该数是否为素数_Python编程判断一个正整数是否为素数的方法,python素数...
Python编程判断一个正整数是否为素数的方法,python素数 本文实例讲述了Python编程判断一个正整数是否为素数的方法.分享给大家供大家参考,具体如下: import string impor ...
- java练习: 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
import java.util.ArrayList; import java.util.Scanner;/*** 7. 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:* 原始字 ...
- 编程第一个Apple Watch程序创建项目
编程第一个Apple Watch程序创建项目 2.4 编程第一个程序 本节将通过编写第一个程序,为开发者讲解如何添加Watch应用对象.运行程序.界面设计.编写代码等内容本文选自Apple Watc ...
- java报告(一)编程打印一个三角形的乘法口诀表
编程打印一个三角形的乘法口诀表(注意对齐),并练习对程序进行单步运行.断点调试等. 实验要求: 1. 在实验报告中给出程序运行结果截图. 2. 源程序代码附到实验报告的最后. 3. 认真填写实验报告并 ...
- 4.编程打印一个二维数组中所有元素的和,并打印最大值,最小值(以及它们所在的行号和列号)
/*晕呀,竟然做了一天,还不知道怎样做出来的.....*/ package HomeWork; import java.util.Arrays; /*4.编程打印一个二维数组中所有元素的和,并打印最大 ...
- python计算长方体体积编程_计算体积 编程创建一个Box类(长方体) 联合开发网 - pudn.com...
计算体积 所属分类:Windows编程 开发工具:Java 文件大小:4KB 下载次数:0 上传日期:2019-12-08 16:53:01 上 传 者:洛水天依- 说明: 编程创建一个Box类(长 ...
- 尾调用优化 java_基于Java8函数式编程求一个List的全部子集|尾调用优化解决递归性能问题...
目录 基于函数式编程求一个List的全部子集 代码来自<Java8 in Action>,思路和其他递归解决方法一致,但不同的地方在concat方法 public static List& ...
- python任意输入一个正整数、判断该数是否为素数_Python编程判断一个正整数是否为素数的方法...
本文实例讲述了Python编程判断一个正整数是否为素数的方法.分享给大家供大家参考,具体如下: import string import math #判断是否素数的函数 def isPrime(n): ...
- sql编程接收一个集合_T-SQL是基于集合的编程方法的资产
sql编程接收一个集合 介绍 (Introduction) This article is the third and last one of a series of articles that ai ...
最新文章
- matlab 时间序列模型稳定度检验
- java----代理机制或动态类的生成
- E. 存储过程(procedure)
- AI人的Home—TechBeat!!!
- 关于Apache Tomcat解决localhost was unable to start within 45 seconds
- 解决:mysql 连接报错 Authentication plugin ‘caching_sha2_password‘cannot be loaded
- jmeter远程启动命令_Jmeter命令行方式启动
- 国内第四大运营商中国广电成立:5G 192号段要来了!
- OpenGL学习(二)第一个OpenGL程序,绘制三角形
- python线程安全_线程,线程安全与python的GIL锁
- 九大类背包问题专题1---01背包问题(二维和优化一维法附代码)
- 34.Odoo产品分析 (四) – 工具板块(5) – 设备及联系人目录(1)
- 处置Linux下Oracle Tomcat 8080端口辩说
- Srm32 dwm1000 tdoa定位源码
- Clearcase no version selected issue
- MFC 通用对话框之字体对话框
- linux脚本 加密失效,shell脚本加密(使用shc)
- Java实现自动发送电子邮件 发送邮件验证码(附全部源码)
- 刷题笔记——青蛙跳台阶问题汇总
- 关于Python中rank()函数的理解
热门文章
- 用java做出32选7_用java做的一个彩票32选7的简单程序
- 纯CSS画的基本图形(矩形、圆形、三角形、多边形、爱心、八卦等),里面很多涉及到CSS3的一些属性。
- Windows 技巧篇-电脑蓝光过滤,颜色校准调节蓝光,电脑源头过滤蓝光,保护眼睛,护眼软件原理
- 操作系统中的零拷贝与java中的使用
- 结构对齐--__packed与#pragma pack
- x VDC(x=3、5、6、8、12、24、48)继电器的引脚连接方式
- MATLAB 求图像的极大值极小值,平均值
- 一二三维矩阵的拼接问题
- android网页无法定位吗,在android中,js 无法定位 html页面的某元素
- 微信小微商户获取申请状态