什么是差分运算?如下图,数值计算过程我们计算函数上某点的导数时,可以选择某点附近(可以包含该点)的两个点,取这两个点的斜率来近似表示该点的导数。一阶导数有一阶向前差分、一阶向后差分和一阶中心差分。当然也有二阶导数的计算方法,如下图。
后期我们将通过差分法求解导热问题。
我们求解常微分方程的初值问题,一个关于自变量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>
运行网页,可见结果如下:
左侧是曲线,右侧是调试输出的坐标数据。曲线如下:
数据如下:
更加高效的常微分方程初值问题,请参考龙格库塔方法。
本文分享自微信公众号 - 传输过程数值模拟学习笔记(SongSimStudio),作者:宋风耳
原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。
原始发表时间:2018-07-26
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句