前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >4.3 差分与简单常微分方程初值问题

4.3 差分与简单常微分方程初值问题

作者头像
周星星9527
发布2018-08-08 15:52:00
1.4K0
发布2018-08-08 15:52:00
举报
  • 差分的概念。

什么是差分运算?如下图,数值计算过程我们计算函数上某点的导数时,可以选择某点附近(可以包含该点)的两个点,取这两个点的斜率来近似表示该点的导数。一阶导数有一阶向前差分、一阶向后差分和一阶中心差分。当然也有二阶导数的计算方法,如下图。

后期我们将通过差分法求解导热问题。


  • 常微分方程的初值问题

我们求解常微分方程的初值问题,一个关于自变量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>

运行网页,可见结果如下:

左侧是曲线,右侧是调试输出的坐标数据。曲线如下:

数据如下:

更加高效的常微分方程初值问题,请参考龙格库塔方法。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 传输过程数值模拟学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档