微分方程求解
常微分方程
首先理解一下什么是 常微分方程,简单的说就是只有一个未知数的微分方程,具体定义如下:
凡含有参数,未知函数 和未知函数导数 (或微分) 的方程,称为微分方程,有时简称为方程,未知函数是一元函数的微分方程称作常微分方程,未知函数是多元函数的微分方程称作偏微分方程。
一阶常微分方程的初值问题是:
{ y ′ = f ( x , y ) , y ( x 0 ) = y 0 , " role="presentation">{y′=f(x,y),y(x0)=y0, { y ′ = f ( x , y ) , y ( x 0 ) = y 0 ,
其中y = y ( x ) " role="presentation">y=y(x) y = y ( x ) 是未知函数,y ( x 0 ) = y 0 " role="presentation">y(x0)=y0 y ( x 0 ) = y 0 是初值条件,而f ( x , y ) " role="presentation">f(x,y) f ( x , y ) 是给定的二元函数
简单的数值方法和欧拉公式
简单的数值方法就是用差商代替导数,公式如下:
y n + 1 = y n + h f ( x n , y n ) ( n = 0 , 1 , 2 , ⋯ ) " role="presentation">yn+1=yn+hf(xn,yn)(n=0,1,2,⋯) y n + 1 = y n + h f ( x n , y n ) ( n = 0 , 1 , 2 , ⋯ )
其中h " role="presentation">h h 是步长;
改进的欧拉方法:
{ y ¯ n + 1 = y n + h f ( x n , y n ) 预测 y n + 1 = y n + h 2 [ f ( x n , y n ) + f ( x n + 1 , y ¯ n + 1 ) ] 校正 " role="presentation">{y¯n+1=yn+hf(xn,yn)yn+1=yn+h2[f(xn,yn)+f(xn+1,y¯n+1)]预测校正 { y ¯ n + 1 = y n + h f ( x n , y n ) 预测 y n + 1 = y n + h 2 [ f ( x n , y n ) + f ( x n + 1 , y ¯ n + 1 ) ] 校正
龙格-库塔(Runge-Kutta)方法
欧拉方法是龙格-库塔方法的一个特例,其局部截断误差为一阶泰勒余项O ( h 2 ) " role="presentation">O(h2) O ( h 2 ) ,为了使误差更小,我们可以做更高阶的误差截断,这也就是我们Runge-Kutta方法的基本原理,具体推导可参考《数值分析》的第八章.其公式如下:
{ y n + 1 = y n + h ∑ i = 1 r c i K i , K 1 = f ( x n , y n ) , K i = f ( x n + λ i h , y n + h ∑ j = 1 i − 1 u i j K j ) ( i = 2 , 3 , ⋯ , r ) , " role="presentation">⎧⎩⎨⎪⎪yn+1=yn+h∑ri=1ciKi,K1=f(xn,yn),Ki=f(xn+λih,yn+h∑i−1j=1uijKj)(i=2,3,⋯,r), { y n + 1 = y n + h ∑ i = 1 r c i K i , K 1 = f ( x n , y n ) , K i = f ( x n + λ i h , y n + h ∑ j = 1 i − 1 u i j K j ) ( i = 2 , 3 , ⋯ , r ) ,
当r=1时就是欧拉方法,当r=2时,就是改进的欧拉方法,这里我们不做具体推导,而是看一下Matlab 中封装好的4阶Runge-Kutta方法的函数实现ode45函数.
ode45
先看一个简单的例子:d y d x = y + 3 x x 2 " role="presentation">dydx=y+3xx2 d y d x = y + 3 x x 2 ,初值y ( 0 ) = − 2 " role="presentation">y(0)=−2 y ( 0 ) = − 2 ,求解区间为[ 1 4 ] " role="presentation">[14] [ 1 4 ] ,代码 如下:
odefun=@(x,y) (y+3*x)/x^2;
tspan=[1 4];
y0=-2;
[x y]=ode45(odefun,tspan,y0)
plot(x,y)
但是我们再看另外一个例子:
{ y ′ = y x − 2 y 2 0<x<3 y ( 0 ) = 0 " role="presentation">{y′=yx−2y20<x<3y(0)=0 { y ′ = y x − 2 y 2 0<x<3 y ( 0 ) = 0
我们编写如下代码:
odefun=@(x,y) y/x-2*y^2;
tspan=[0 3];
y0=0;
[x y]=ode45(odefun,tspan,y0)
plot(x,y)
disp(y)
发现没有数值解
于是我们把代码进行了如下修改:
odefun=@(x,y) fun(x,y);
tspan=[0 3];
y0=0;
[x y]=ode45(odefun,tspan,y0);
plot(x,y)
function dy = fun(x,y)
if(x==0)
dy=1-2*y^2
else
dy = y/x-2*y^2
end
end
这里需要强调一点的是,Runge-Kutta法针对的是连续的函数f " role="presentation">f f ,由于在例子中,函数在x = 0 " role="presentation">x=0 x = 0 处是不连续的,所以在这个地方是需要单独处理的,在这里,y x " role="presentation">yx y x 在x = 0 " role="presentation">x=0 x = 0 处的导数为1(洛必达法则,即0 0 = 1 " role="presentation">00=1 0 0 = 1 )
相关阅读
12个常见的外链建设方法
外链是SEO中不可或缺的一部分。提升网站排名,很重要的一点,就是网站的外链建设。下面小编来说一下怎么去做外链。1、 自己的网站新
常见的误差衡量公式
平方误差:表示实验误差大小的偏差平方和。在相同的条件下,各次测定值xi对真实值x的偏差平方后再求和,即:标准误差(又称为均方根误差RM
PHP编译安装常用参数
#常用参数
--prefix=/usr/local/php php 安装目录
--with-apxs2=/usr/local/apache/bin/apxs
--wi
做为互联网创业者要有哪些技术常识?
这几年,创业环境非常好,不但国家鼓励,市场环境也比较好,都是各种鼓励创新创业。国家支持创业,但是现在的企业业务不再像以前那样外出人
常见动词的过去式和过去分词
beat的过去式和过去分词为:beat和beaten