当前位置:   article > 正文

Python科学计算:常微分方程计算1_python计算微分

python计算微分

微分方程是一个非常有用的工具,可以说是理工科绕不开的一个坎,刚好,这本书就提到了常微分方程的解法,有些要用到Scipy包,所以,可以先下载一下啊:

pip install scipy

下载好了之后,我们就开始吧,对于一个微分方程来说,我们在初始时刻指定了充分条件以求得确定的解,这种问题被称为初值问题。

今天有可能先不写代码,我们先来看一下初值问题数值积分的基本思想:

我们考虑函数y(t)的单个一阶方程:

那么他的精确解为:

聚焦于初始条件,同时考虑到的非正值,如果,那么精确解就是

对于,解就是0,我们看一看对于取若干非负值时的解:

图1不同lambda

可以看到,随着lambda的绝对值的增大,解会迅速从t=0时的0上升到O(1),然后以的形式进行衰减,当然,这张图的代码在下面:

  1. import turtle
  2. import matplotlib.pyplot as plt
  3. import math
  4. import numpy as np
  5. y_0=0
  6. t=np.linspace(0.0,1.0,100,dtype=float)
  7. #lambda=-5
  8. x_0=-np.exp(-5*t)+np.exp(-t)
  9. #lambda=-10
  10. x_1=-np.exp(-10*t)+np.exp(-t)
  11. #lambda=-100
  12. x_2=-np.exp(-100*t)+np.exp(-t)
  13. #lambda=-150
  14. x_3=-np.exp(-150*t)+np.exp(-t)
  15. #lambda=-200
  16. x_4=-np.exp(-200*t)+np.exp(-t)
  17. #lambda=-250
  18. x_5=-np.exp(-250*t)+np.exp(-t)
  19. fig=plt.figure()
  20. ax=fig.add_subplot(1,1,1)
  21. ax.plot(t,x_0,"r-",label="lamb=-5")
  22. ax.plot(t,x_1,"b-",label="lamb=-10")
  23. ax.plot(t,x_2,"g-",label="lamb=-100")
  24. ax.plot(t,x_3,"r--",label="lamb=-150")
  25. ax.plot(t,x_4,"b--",label="lamb=-200")
  26. ax.plot(t,x_5,"g--",label="lamb=-250")
  27. ax.legend(loc='best')
  28. ax.set_xlabel("x")
  29. ax.set_ylabel("y")
  30. ax.set_title("different lambda")
  31. fig.show()
  32. turtle.done()

其实可以不用写这么多lambda的值的,书上只写了四个,我觉得可以多加两条看看,现在看起来,变化趋势和范围几乎没啥差别。

为了用数值方法来对求解这个方程,引入一个离散网格,选择一些大整数N,并且设置h=1/N,这样,我们就可以定义:

简便起见,选择等距离网格,设,那么在这个网格上面,我们就能把表示成一个序列:,然后令相应的数值近似序列为,

那怎么样才能近似计算呢,最简单的近似防范就是前向欧拉方程:

这种方法,对应于只保留了泰勒级数中的前两项,实际上,截断误差是:

从这里看得出来,如果我们的h选择的够小,那么我们就可以使截断误差尽可能的小(其实,这里我觉得,这种方式你有可能突然接受不了,h是分母啊,怎么h越小截断误差越小,其实这里如果说你看减号后面的还是不甚理解的话,给你个简单的解释,我们常说的微积分,怎么积分才能更加接近结果嘞?微分步长尽可能的小嘛,这样,他就接近了呗)。

截断误差倒是没啥,我们最应该关注的是实际误差:,从上面的式子计算,我们就会得到

对于这种推进关系,我们就可以得到:n>0的时候:

当n时,只有当的时候,才有界,否则的话,就会按照指数形式增长,所以,如果说前向欧拉方程的数值求解结果能够被接受,那么就必须要满足这个条件。

如果说,接近于-1,任何合理的h值都会产生可以接受的结果,但是考虑到,稳定性要求,这在计算快速初始变化时是可以理解的,但是,在其他值域内求解类似缓慢衰减的方程的时候,需要设置非常小的步长,所以数值演化进行的非常缓慢,这种现象被称为问题的刚性;显然,前向欧拉方程在刚性问题上并不令人满意(说实话,没怎么看懂,但结论还是很明确的)。

前向欧拉方具有显式的性质,简单理解,就是已知求未知。

那么怎么样才能解决刚性问题呢?有人就提出了后向欧拉方程的方法:

从这里,可以看到一个很有趣的事情:未知求未知,当然,也可以合并方程中的同类项,其实际误差满足:

其解为:

其稳定性准则为:

很明显,这就满足了我们讨论的对于所有正值h都具有大负值的刚性问题。

后向欧拉方程被称为隐式方案,这些隐式方案主要用来处理刚性问题,

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/896262
推荐阅读
相关标签
  

闽ICP备14008679号