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

文章介绍了微分方程在理工科学中的重要性,特别是初值问题的数值积分方法。通过Python的Scipy包演示了一阶微分方程的解,并展示了不同参数λ的解图形。前向欧拉方法简单但可能在处理刚性问题时导致误差指数增长。为了解决这个问题,文章提到了后向欧拉方程,一种更适用于刚性问题的隐式方法,它对所有正值的步长h都保持稳定。
摘要由CSDN通过智能技术生成

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

pip install scipy

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

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

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

那么他的精确解为:

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

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

图1不同lambda

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

import turtle
import matplotlib.pyplot as plt
import math
import numpy as np
y_0=0
t=np.linspace(0.0,1.0,100,dtype=float)
#lambda=-5
x_0=-np.exp(-5*t)+np.exp(-t)
#lambda=-10
x_1=-np.exp(-10*t)+np.exp(-t)
#lambda=-100
x_2=-np.exp(-100*t)+np.exp(-t)
#lambda=-150
x_3=-np.exp(-150*t)+np.exp(-t)
#lambda=-200
x_4=-np.exp(-200*t)+np.exp(-t)
#lambda=-250
x_5=-np.exp(-250*t)+np.exp(-t)
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
ax.plot(t,x_0,"r-",label="lamb=-5")
ax.plot(t,x_1,"b-",label="lamb=-10")
ax.plot(t,x_2,"g-",label="lamb=-100")
ax.plot(t,x_3,"r--",label="lamb=-150")
ax.plot(t,x_4,"b--",label="lamb=-200")
ax.plot(t,x_5,"g--",label="lamb=-250")
ax.legend(loc='best')
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_title("different lambda")
fig.show()
turtle.done()

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

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

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

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

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

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

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

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

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

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

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

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

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

其解为:

其稳定性准则为:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值