数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
楼主: HUASHI3483

Matlab详细教程

  [复制链接]
 楼主| 发表于 2004-4-14 20:27:14 | 显示全部楼层
10.2 阮奇-库达方法   

------------------------------------------------------------------------------
--  

阮奇-库达 (Runge-Kutta) 方法是最通用的解 ODE 的方法,它可以依计算精确度的要求
有低阶到高阶的各个计算式,举例来说,一阶阮奇-库达法为   

   

其实上式即是一阶的泰勒序数近似式,只不过令  。因为一阶阮奇-库达法 的精确度太低
,所以在真正解ODE 时,最少须用二阶以上的方法。   


MATLAB应用阮奇-库达法的函数有ode23, ode45,其中ode23是同时以二阶及三阶阮奇-库
达法求解,而ode45 则是以四阶及五阶阮奇-库达法求解。其语法为ode23('dy',x0,xn,y0
),其中 dy 为ODE中的等式右边的函数(如之 前介绍的),x0, xn 是要解ODE的区间  
[x0, xn] 的二个端点,y0是起始值 (y0=y(x0))。而ode45的语法与ode23相同。   


先前的四个 ODE 的解法如下:   


例一、要在区间 [2, 4] 解以下的 ODE:   

   

% m-function, g1.m   

function dy=g1(x,y)   

dy=3*x.^2;  


>> [x,num_y]=ode23('g1',2,4,0.5);   

>> anl_y=x.^3-7.5;   

>> plot(x,num_y,x,anl_y,'o')   

>> title('Solution of g1')   

>> xlabel('x'), ylabel('y=f(x)'), grid   


例二、要在区间 [0, 5] 解以下的 ODE:   

   

% m-function, g2.m   

function dy=g2(x,y)   

dy=-0.131*y;  


>> [x,num_y]=ode23('g2',0,5,4);   

>> anl_y=4*exp(-0.131*x);   

>> plot(x,num_y,x,anl_y,'o')   

>> title('Solution of g2')   

>> xlabel('x'), ylabel('y=f(x)'), grid   


例三、要在区间 [0, 2] 解以下的 ODE:   

   

% m-function, g3.m   

function dy=g3(x,y)   

dy=2*x*cos(y)^2;  


>> [x,num_y]=ode23('g3',0,2,pi/4);   

>> anl_y=atan(x.*x+1);   

>> plot(x,num_y,x,anl_y,'o')   

>> title('Solution of g3')   

>> xlabel('x'), ylabel('y=f(x)'), grid   


例四、要在区间 [0, 3] 解以下的 ODE:   

   

% m-function, g4.m   

function dy=g4(x,y)   

dy=3*y+exp(2*x);  


>> [x,num_y]=ode23('g4',0,3,3);   

>> anl_y=4*exp(3*x)-exp(2*x);   

>> plot(x,num_y,x,anl_y,'o')   

>> title('Solution of g4')   

>> xlabel('x'), ylabel('y=f(x)'), grid   


如果将上述方法改以 ode45 计算,你可能无法察觉出其与ode23的解之间的差异,那是因
为我们选的 ODE 代表的函数分布变化平缓,所以高阶方法就显现不出其优点。不过以二
者在计算的误差上做比较,ode45 的误差量级会比 ode23要小。以下是几个例子:   

% m-function, g1.m   

function dy=g1(x,y)   

dy=3*x.^2;  


% m-file, odes1.m   

% Solve an ode using ode23 and ode45   

clg   

[x1,num_y1]=ode23('g1',2,4,0.5);   

anl_y1=x1.^3-7.5;   

error_1=abs(anl_y1-num_y1)./abs(anl_y1); % ode23 的计算误差   

[x2,num_y2]=ode45('g1',2,4,0.5);   

anl_y2=x2.^3-7.5; % 注意 x2 个数与 x1 不一定相同   

error_2=abs(anl_y2-num_y2)./abs(anl_y2); % ode45 的计算误差  


hold on   

subplot(2,2,1)   

plot(x1,num_y1,x1,anl_y1,'o')   

title('ODE23 solution'), ylabel('y')   

subplot(2,2,2)   

plot(x1,error_y1) % 注意二种方法的误差   

title('ODE23 error'), ylabel('y') % ode23 的误差的量级为 1.e-16   

subplot(2,2,3)   

plot(x2,num_y2,x2,anl_y2,'o')   

title('ODE45 solution'), ylabel('y')   

subplot(2,2,4)   

plot(x1,error_y2)   

title('ODE45 error'), ylabel('y') % ode45 的解没有误差   

hold off  


另一个例子:   

% m-function, g5.m   

function dy=g5(x,y)   

dy=-y+2*cos(x);  


% m-file, odes1.m   

% Solve an ode using ode23 and ode45   

clg   

[x1,num_y1]=ode23('g5',0,5,1);   

anl_y1=sin(x1)+cos(x1);   

error_1=abs(anl_y1-num_y1)./abs(anl_y1);   

[x2,num_y2]=ode45('g5',0,5,1);   

anl_y2=sin(x2)+cos(x2);   

error_2=abs(anl_y2-num_y2)./abs(anl_y2);   


hold on   

subplot(2,2,1)   

plot(x1,num_y1,x1,anl_y1,'o')   

title('ODE23 solution'), ylabel('y')   

subplot(2,2,2)   

plot(x1,error_y1) % 注意二种方法的误差   

title('ODE23 error'), ylabel('y') % ode23 的误差的量级为 1.e-4   

subplot(2,2,3)   

plot(x2,num_y2,x2,anl_y2,'o')   

title('ODE45 solution'), ylabel('y')   

subplot(2,2,4)   

plot(x1,error_y2)   

title('ODE45 error'), ylabel('y') % ode45 的误差的量级为 1.e-6   

hold off  



------------------------------------------------------------------------------
 楼主| 发表于 2004-4-14 20:27:30 | 显示全部楼层
10.4 高阶常微分方程式  

------------------------------------------------------------------------------
--  

一个高阶常微分方程式可以利用变数改变(change of variables) 方式改写成个一组联立
的一阶常微分方程式。例如以下的 n 阶方程式   

   

我们先定义 n 个新的变数来取代上式中的   

   

将上述的新变数代入原 ODE,连同这些新变数即构成一组联立的一阶常微分方程式   

   

我们接者以一个二阶 ODE 为例说明上述的过程   

   

我们须要定义   

   

将上述的二变数代入原 ODE,即构成一组联立的一阶常微分方程式   




以下即是上述二阶 ODE 的解法:   

function u_prime =eqns2(x,u)   

u_prime(1) = u(1)*(1-u(2)^2) - u(2);   

u_prime(2) = u(1);   


initial = [0 0.25];   

[x,num_y] = ode23('eqns2',0,20,initial);   

subplot(2,1,1), plot(x,num_y(:,1))   

title('1st derivative of y'), xlabel('x'), grid   

subplot(2,1,2), plot(x,num_y(:,2))   

title('y'), xlabel('x'), grid  


------------------------------------------------------------------------------
--  
   
 楼主| 发表于 2004-4-14 20:28:00 | 显示全部楼层
11.1.2 数学式的化简  

------------------------------------------------------------------------------
--  

以下的函数适用来简化数学式,如展开、化简或聚集数学式。相关的指令有:   

collect(S) 聚集S的系数   

collect(S,'v') 聚集S的系数,是以v为独立变数   

expand(S) 将S表示式展开   

factor(S) 还原S的因式(factorization)   

simple(S) 如果可能的话,将S表示式再做简化   

simplify(S) 利用Maple简化法则化简S表示式   


我们来看一些例子   

>> S1 = 'x^3-1';   

>> S2 = '(x-3)^2+(y-4)^2';   

>> S3 = 'sqrt(a^4*b^7)'   

>> S4 = '14*x^2/(22*x*y)';   


>> factor(S1)   

ans=   

(x-1)*(x^2+x+1)   

>> expand(S2)   

ans=   

x^2-6*x+25+y^2-8*y   

>>collect(S2)   

ans=   

x^2-6*x+9+(y-4)^2   

>>collect(S2,'y')   

ans=   

y^2-8*y+(x-3)62+16   

>>simplify(S3)   

ans=   

a^2*b^(7/2)   

>>simple(S4)   

ans=   

7/11*x/y  


------------------------------------------------------------------------------
--  
 楼主| 发表于 2004-4-14 20:28:35 | 显示全部楼层
11.1.3 符号表示式的运算  

------------------------------------------------------------------------------
--  

以下列出几个常用的符号运算函数,它们可以将一符号数学室转换成另一种型态。兹将分
列如下:   

horner(S) 将S转换成巢状表示式   

numden(S) 将S的有理数表示成分子和分母的形式   

numeric(S) 将S改成数值式(S不能含有任何符号变数)   

poly2sym(c) 转换多项式系数向量c为符号多项式   

pretty(S) 将S显示成数学式   

sym2poly(S) 转换S为多项式系数向量   

symadd(A,B) 执行A+B的符号加法   

symdiv(A,B) 执行A+B的符号除法   

symmul(A,B) 执行A+B的符号乘法   

sympow(S,p) 执行S^p的符号次方运算   

symsub(A,B) 执行A+B的符号减法   


我们接著看几个应用上述函数的例子   

>>p1 = '1/(y-3)';   

>>p2 = '3*y/(y+2)';   

>>p3 = '(y+4)*(y-3)*y';   


>> symmul(p1,p3)   

ans=   

(y+4)*y   

>> sympow(p2,3)   

ans=   

27*y^3/(y+2)^3   

>> symadd(p1,p2)   

ans=   

1/(y-3)+3*y/(y+2)   

>>[num,den] = numden(symadd(p1,p2))   

ans=   

[-8*y+2+3*y, (y-3)*(y+2)]   

>> horner(symadd(p3,'1')   

ans=   

1+(-12+(1+y)*y)*y  



------------------------------------------------------------------------------
--  
 楼主| 发表于 2004-4-14 20:29:45 | 显示全部楼层
11.2.1 一般方程式  

------------------------------------------------------------------------------
--  

以符号数学解一般方程式和联立方程式的语法如下:   

solve(f) 解符号方程式f。   

solve(f1,厎,fn) 解由f1,厎,fn组成的联立方程式。   


我们先定义以下的方程式:   

>>eq1 = 'x-3=4'; % 注意也可写成'eq1=x-7'   

>>eq2 = 'x*2-x-6=0'; % 注意也可写成'eq2=x*2-x-6'   

>>eq3 = 'x2+2*x+4=0';   

>>eq4 = '3*x+2*y-z=10';   

>>eq5 = '-x+3*y+2*z=5';   

>>eq6 = 'x-y-z=-1';   


>>solve(eq1)   

ans=   

7   

>>solve(eq2)   

ans=   

[[3],[-2]]' % 原方程式有二个根3, -2   

>>solve(eq3)   

ans=   

[[-1+I*3^(1/2)],[-1-I*3^(1/2)]]' % 注意实根和虚根的表示式   

>>solve(eq4,eq5,eq6) % 解三个联立方程式   

ans=   

x = -2, y = 5, z = -6  


------------------------------------------------------------------------------
--  
   
 楼主| 发表于 2004-4-14 20:30:11 | 显示全部楼层
11.2.2 常微分方程式   
   
------------------------------------------------------------------------------
   
   
   
--   
   
一阶常微分方程式 (first-order ordinary differential equation, ODE) 可写为     
   
     
   
其中x为独立变数,而y是x的函数。上述的一阶常微分方程式的解是 y=f(x,y)可以满足   

y'=f'=g(x,y)。关于常微分方程式的解法已再第十章说明过,它还需要初始条件才能得到
   
   
   
为一的解。     
   
   
MATLAB解常微分方程式的语法是dsolve('equation','condition'),其中equation代表常
   
   
   
微分方程式即y'=g(x,y),且须以Dy代表一阶微分项y' D2y代表二阶微分项y'' ,   
condition则为初始条件。     
   
   
假设有以下三个一阶常微分方程式和其初始条件     
   
y'=3x2, y(2)=0.5     
   
y'=2.x.cos(y)2, y(0)=0.25     
   
y'=3y+exp(2x), y(0)=3     
   
对应上述常微分方程式的符号运算式为:     
   
> >soln_1 = dsolve('Dy = 3*x^2','y(2)=0.5')     
   
ans=     
   
x^3-7.500000000000000     
   
> >ezplot(soln_1,[2,4]) % 看看这个函数的长相     
   
> >soln_2 = dsolve('Dy = 2*x*cos(y)^2','y(0) = pi/4')     
   
ans=     
   
atan(x^2+1)     
   
> >soln_3 = dsolve('Dy = 3*y + exp(2*x)',' y(0) = 3')     
   
ans=     
   
-exp(2*x)+4*exp(3*x)   
   
   
------------------------------------------------------------------------------
   
   
   
--   
 楼主| 发表于 2004-4-14 20:30:35 | 显示全部楼层
11.3.1 微分  

------------------------------------------------------------------------------
--  

diff函数用以演算一函数的微分项,相关的函数语法有下列4个:   

diff(f) 传回f对预设独立变数的一次微分值   

diff(f,'t') 传回f对独立变数t的一次微分值   

diff(f,n) 传回f对预设独立变数的n次微分值   

diff(f,'t',n) 传回f对独立变数t的n次微分值   


因为之前再第八章介绍的数值微分函数也是用diff,因此这个函数是靠输入的引数决定是
以数值或是符号微分,如果引数为向量则执行数值微分,如果引数为符号表示式则执行符
号微分。   


先定义下列三个方程式,接著再演算其微分项:   

>>S1 = '6*x^3-4*x^2+b*x-5';   

>>S2 = 'sin(a)';   

>>S3 = '(1 - t^3)/(1 + t^4)';   


>>diff(S1)   

ans=   

18*x^2-8*x+b   

>>diff(S1,2)   

ans=   

36*x-8   

>>diff(S1,'b')   

ans=   

x   

>>diff(S2)   

ans=   

cos(a)   

>>diff(S3)   

ans=   

-3*t^2/(1+t^4)-4*(1-t^3)/(1+t^4)^2*t^3   

>>simplify(diff(S3))   

ans=   

t^2*(-3+t^4-4*t)/(1+t^4)^2  


------------------------------------------------------------------------------
 楼主| 发表于 2004-4-14 20:30:56 | 显示全部楼层
11.3.2 积分  

------------------------------------------------------------------------------
--  

int函数用以演算一函数的积分项, 这个函数要找出一符号式 F 使得diff(F)=f。如果积
分式的解析式 (analytical form, closed form) 不存在的话或是MATLAB无法找到,则  
int 传回原输入的符号式。相关的函数语法有下列 4个:   

int(f) 传回f对预设独立变数的积分值   

int(f,'t') 传回f对独立变数t的积分值   

int(f,a,b) 传回f对预设独立变数的积分值,积分区间为[a,b],a和b为数值式   

int(f,'t',a,b) 传回f对独立变数t的积分值,积分区间为[a,b],a和b为数值式   

int(f,'m','n') 传回f对预设变数的积分值,积分区间为[m,n],m和n为符号式   


我们示范几个例子:   

>>S1 = '6*x^3-4*x^2+b*x-5';   

>>S2 = 'sin(a)';   

>>S3 = 'sqrt(x)';   


>>int(S1)   

ans=   

3/2*x^4-4/3*x^3+1/2*b*x^2-5*x   

>>int(S2)   

ans=   

-cos(a)   

>>int(S3)   

ans=   

2/3*x^(3/2)   

>>int(S3,'a','b')   

ans=   

2/3*b^(3/2)- 2/3*a^(3/2)   

>>int(S3,0.5,0.6)   

ans=   

2/25*15^(1/2)-1/6*2^(1/2)   

>>numeric(int(S3,0.5,0.6)) % 使用numeric函数可以计算积分的数值   

ans=   

0.0741  



------------------------------------------------------------------------------
--  
 楼主| 发表于 2004-4-14 20:31:29 | 显示全部楼层
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 166.111.167.103]  

发表于 2004-4-17 11:56:53 | 显示全部楼层
能再详细一点吗?
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-5-10 02:48 , Processed in 0.053640 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表