什么是差分运算?如下图,数值计算过程我们计算函数上某点的导数时,可以选择某点附近(可以包含该点)的两个点,取这两个点的斜率来近似表示该点的导数。一阶导数有一阶向前差分、一阶向后差分和一阶中心差分。当然也有二阶导数的计算方法,如下图。
后期我们将通过差分法求解导热问题。
我们求解常微分方程的初值问题,一个关于自变量x和y的常微分方程,满足:
y'=x+y
其中y'表示y对x的导数,且过原点,试绘制函数曲线。
根据差分的定义,我们可以选择步长dx(或Δx)为为0.1,将y'写为差分形式为(y[n+1]-y[n])/Δx,此时方程变为:
(y[n+1]-y[n])/Δx=x[n]+y[n]
而已知x[0]=0,y[0]=0。下面我们通过程序实现方程求解与绘制
先将y'函数写出来:
1. var Fun=function(x,y){ //函数
2. return x+y;
3. }
定义一组变量:
1. varx0=0,y0=0,dx=0.1;
2. varxData=[],yData=[];
其中x0和y0是曲线通过的原点坐标,dx为求解步长,xData、yData用于存储曲线坐标点。求解程序如下:
1. var ode=function(nDivided){
2. y=y0;
3. for(varx,y,i=0;i<nDivided;i++){
4. x=x0+i*dx;
5. y=y0+dx*Fun(x,y);
6. xData.push(x);
7. yData.push(y);
8. y0=y;
9. }
10. }
11.
12. ode(10);
13. console.log(xData,yData);
将曲线绘制出来,使用上一章的代码绘制曲线:
1. var dom =document.getElementById("container");
2. var myChart =echarts.init(dom);
3.
4. option= {
5. xAxis:{
6. type: 'category',
7. data:xData,
8. },
9. yAxis:{
10. type: 'value'
11. },
12. series:[{
13. data:yData,
14. type: 'line'
15. }]
16. };
17.
18. if (option&& typeof option === "object") {
19. myChart.setOption(option,true);
20. }
给出所有代码:
1. <!DOCTYPEhtml>
2. <htmlstyle="height: 100%">
3. <head>
4. <metacharset="utf-8">
5. </head>
6. <bodystyle="height: 100%; margin: 0">
7. <divid="container" style="height: 100%"></div>
8. <scripttype="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/echarts.min.js"></script>
9. <scripttype="text/javascript">
10.
11. var Fun=function(x,y){ //函数
12. return x+y;
13. }
14.
15. varx0=0,y0=0,dx=0.1;
16. varxData=[],yData=[];
17.
18. var ode=function(nDivided){
19. y=y0;
20. for(varx,y,i=0;i<nDivided;i++){
21. x=x0+i*dx;
22. y=y0+dx*Fun(x,y);
23. xData.push(x);
24. yData.push(y);
25. y0=y;
26. }
27. }
28.
29. ode(10);
30. console.log(xData,yData);
31.
32. var dom = document.getElementById("container");
33. var myChart =echarts.init(dom);
34.
35. option= {
36. xAxis:{
37. type:'category',
38. data:xData,
39. },
40. yAxis:{
41. type:'value'
42. },
43. series:[{
44. data:yData,
45. type:'line'
46. }]
47. };
48.
49. if (option&& typeof option === "object") {
50. myChart.setOption(option,true);
51. }
52. </script>
53. </body>
54. </html>
运行网页,可见结果如下:
左侧是曲线,右侧是调试输出的坐标数据。曲线如下:
数据如下:
更加高效的常微分方程初值问题,请参考龙格库塔方法。