专栏首页javascript趣味编程4.3 差分与简单常微分方程初值问题

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

  • 差分的概念。

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

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


  • 常微分方程的初值问题

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 9.2 时域分析与频域分析

    时域和频域分析师自动控制原理里非常重要的内容,也是《热工过程自动控制》里的基础内容。首先分析一个常见的RC网络电路:

    周星星9527
  • 8.2 时域分析与频域分析

    时域和频域分析师自动控制原理里非常重要的内容,也是《热工过程自动控制》里的基础内容。首先分析一个常见的RC网络电路:

    周星星9527
  • 5.2.1 二维导热算例-热导的概念

    材料类,描述材料的参数,如密度、比热和初始温度等,这里特别给出了凝固潜热;这里要注意Math.pow(2,0)的意义,读者自己琢磨,用于判断相邻控制体的...

    周星星9527
  • Q118 Pascal's Triangle

    Given numRows, generate the first numRows of Pascal's triangle. For example, giv...

    echobingo
  • 一看就晕的React事件机制

    腾讯NEXT学位
  • 机器替人后:工厂不缺人了,入职奖励也没了…

    “达丰电脑2月14日起停招,招满了,你看看别家吧!”每逢春节前后,大量外来务工人员的离开及迟归,常常让代工厂陷入用工荒的囧境。按照以往规律,年后正是企业疯狂揽人...

    机器人网
  • 比特王者|谁是压死EOS这只骆驼的最后一刻稻草?

     比特币生态包括 BTC 以及其数量众多的分叉币,BTC 是加密数字货币的开山鼻祖,拥有最为广泛的共识。堪称1.0时代。

    比特王者
  • LeetCode 06Z字形变换&07整数反转

    对于这题该如何处理呢?首先要理解题意,它就是本来给一个字符串,然后要按照Z字形排列等到一个形状,根据这个形状按照从左往右的顺序取值得到一个新的字符串。

    bigsai
  • python PIL库的使用

    1. open(filename) : 根据参数加载图像文件。建议采用文件的全路径,如下面的文件位于d盘中

    py3study
  • 数据分析的3个常用方法:数据趋势、对比和细分分析

    一个产品,如果你不能衡量它,你就不能了解它,自然而然,你就无法改进它。数据说到底,就是这样一个工具——通过数据,我们可以衡量产品,可以了解产品,可以在数据驱动下...

    龙哥

扫码关注云+社区

领取腾讯云代金券