IVP问题
对于常微分方程的初值问题
{ d y d t = f ( t , y ) , t ∈ [ a , b ] y ( a ) = y 0 (1) \left\{ \begin{array}{l} \frac{
{dy}}{
{dt}} = f(t,y),t \in \left[ {a,b} \right]\\ y\left( a \right) = {y_0} \end{array} \right.\tag{1} {
dtdy=f(t,y),t∈[a,b]y(a)=y0(1)
有以下解的存在性、唯一性定理:
假设 f ( t , y ) f(t,y) f(t,y)定义在集合 [ a , b ] × [ α , β ] [a,b]\times[\alpha,\beta] [a,b]×[α,β]并且初值 α < y 0 < β \alpha<y_0<\beta α<y0<β,函数对于变量 y y y是Lipschitz连续,则在 a a a与 b b b之间存在 c c c,使得初值问题
{ d y d t = f ( t , y ) , t ∈ [ a , b ] y ( a ) = y 0 t ∈ [ a , c ] (2) \left\{ \begin{array}{l} \frac{ {dy}}{ {dt}} = f(t,y),t \in \left[ {a,b} \right]\\ y\left( a \right) = {y_0}\\ t\in[a,c] \end{array} \right.\tag{2} ⎩⎨⎧dtdy=f(t,y),t∈[a,b]y(a)=y0t∈[a,c](2)
有唯一解 y ( t ) y(t) y(t)。而且,如果 f f f在 [ a , b ] × [ − ∞ , + ∞ ] [a,b]\times[-\infty,+\infty] [a,b]×[−∞,+∞]上是Lipschitz连续,则其在 [ a , b ] [a,b] [a,b]上存在唯一解。
定义一个ODEsolver类来使用各种方法求解常微分方程,使用待求解的函数和初始值来初始化该类:
class ODEsolver:
def __init__(self,fun,t0,y0):
self.fun=fun
self.t0=t0
self.y0=y0
Euler显式格式
Euler方法为:
{ w 0 = y 0 w i + 1 = w i + h f ( t i , w i ) (2) \left\{ \begin{array}{l} {w_0} = {y_0}\\ {w_{i + 1}} = {w_i} + hf\left( {
{t_i},{w_i}} \right) \end{array} \right.\tag{2} {
w0=y0wi+1=wi+hf(ti,wi)(2)
代码为:
def eulersolver(self,tend,step=None):
if step is None:
step=(tend-self.t0)/1e3
from ArrayTable import ArrayTable
result=ArrayTable(2,0)
result.setTableHeader(["$t$","$y(t)$"])
result.setTableUnit(["/","/"])
result.append([self.t0,self.y0])
t=self.t0
while t<tend:
ynext=result.table[1].data[-1]+self.fun(t,result.table[1].data[-1])*step
result.append([t+step,ynext])
t+=step
return result
隐式Euler法
隐式Euler法的原理为:
{ w 0 = y 0 w i + 1 = w i + h f ( t