MATLAB 语言程序设计基础(2)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
%第六章微分方程问题的解法
% 微分方程的解析解方法
% 常微分方程问题的数值解法
% 微分方程问题算法概述
% 四阶定步长Runge-Kutta算法及MATLAB 实现
% 一阶微分方程组的数值解
% 微分方程转换
% 特殊微分方程的数值解
% 边值问题的计算机求解
% 偏微分方程的解
% 6.1 微分方程的解析解方法
% y=dsolve(f1, f2, …, fm ,'x')
% syms t; u=exp(-5*t)*cos(2*t+1)+5;
% uu=5*diff(u,t,2)+4*diff(u,t)+2*u
% syms t y;
% y=dsolve(['D4y+10*D3y+35*D2y+50*Dy+24*y='...
%
'87*exp(-5*t)*cos(2*t+1)+92*exp(-5*t)*sin(2*t+1)+10'],'y(0)=3','Dy(0)=2','D2y(0)=0','D3y(0)=0')
% [x,y]=dsolve('D2x+2*Dx=x+2*y-exp(-t)',...
% 'Dy=4*x+3*y+4*exp(-t)')
% syms t x;
% x=dsolve('Dx=x*(1-x^2)+1')
% Warning: Explicit solution could not be found; implicit solution returned.
% > In D:\MATLAB6p5\toolbox\symbolic\dsolve.m at line 292
% x =
% t-Int(1/(a-a^3+1),a=``..x)+C1=0
% 故只有部分非线性微分方程有解析解。
% 6.2 微分方程问题的数值解法
% 6.2.1 微方程问题算法概述
%Euler算法%
%function [outx,outy]=MyEuler(fun,x0,xt,y0,PointNum)
% fun 表示f(x,y); x0,xt:自变量的初值和终值;
% y0:函数在x0处的值,其可以为向量形式;
% PointNum表示自变量在[x0,xt]上取的点数
% if nargin<5 |PointNum<=0 %PointNum 默认值为100
% PointNum=100;
% end
% if nargin<4 % y0默认值为0
% end
% h=(xt-x0)/PointNum; %计算步长h
% x=x0+[0:PointNum]'*h; %自变量数组
% y(1,:) = y0(:)'; %将输入存为行向量,输入为列向量形式
% for k = 1:PointNum
% f=feval(fun,x(k),y(k,:)); f=f(:)'; %计算f(x,y)在每个迭代点的值% y(k + 1,:) =y(k,:) +h*f; %对于所取的点x迭代计算y值
% end
% outy=y; outx=x;
% plot(x,y) %画出方程解的函数图
% end
% [x1,y1]=MyEuler('myfun',0,2*pi,1,16);
% myfun=incline'Dy=sin(x)+y'
% function [Xout,Yout]=MyEulerPro(fun,x0,xt,y0,PointNumber)
% %MyEulerPro 用改进的欧拉法解微分方程% if nargin<5 | PointNumber<=0
% %PointNumer默认值为100
% PointNumer=100;
% end
% if nargin<4 %y0默认值为0
% y0=0;
% end
% h=(xt-x0)/PointNumber;
% %计算所取的两离
% 散点之间的距离
% x=x0+[0:PointNumber]'*h;
% %表示出离散的自变量x
% y(1,:)=y0(:)';
% for i=1:PointNumber %迭代计算过程
% f1=h*feval(fun,x(i),y(i,:)); f1=f1(:)';
% f2=h*feval(fun,x(i+1),y(i,:)+f1); f2=f2(:)';
% y(i+1,:)=y(i,:)+1/2*(f1+f2);
% end
% Xout=x;Yout=y;
%6.2.2 四阶定步长Runge-Kutta算法及MATLAB 实现
%6.2.3 一阶微分方程组的数值解
%6.2.3.1 四阶五级Runge-Kutta-Felhberg算法
%6.2.3.2 基于MATLAB 的微分方程
% 求解函数
% 格式1:直接求解
% [t,x]=ode45(Fun,[t0,tf],x0)
% 格式2:带有控制参数
% [t,x]=ode45(Fun,[t0,tf],x0,options)
% 格式3:带有附加参数
% *t,x+=ode45(Fun,*t0,tf+,x0,options,p1,p2,…)
% [t0,tf]求解区间,x0初值问题的初始状态变量。
% 描述需要求解的微分方程组:
% 不需附加变量的格式
% function xd=funname(t,x)
% 可以使用附加变量
% function xd=funname(t,x,flag,p1,p2,…)
% t是时间变量或自变量(必须给),x为状态向量,xd为返回状态向量的导数. % flag用来控制求解过程,指定初值,即使初值不用指定,也必须有该变量占位。% 修改变量:options唯一结构体变量,用odeset( )修改。
% options=odeset(‘RelTol’,1e-7);
% options= odeset; options. RelTol= 1e-7;
%6.2.3.3 MATLAB 下带有附加参数的微分方程求解
% 6.2.4 微分方程转换
% 6.2.4.1 单个高阶常微分方程处理方法
% 6.2.4.2 高阶常微分方程组的变换方法
%
% 6.3特殊微分方程的数值解
% 6.3.1 刚性微分方程的求解
% MATLAB采用求解函数ode15s(),该函数的调用格式和ode45()完全一致。
% *t,x+=ode15s(Fun,*t0,tf+,x0,options,p1,p2,…)
%
% 6.3.2 隐式微分方程求解
% 6.3.3 微分代数方程求解
% 6.3.4延迟微分方程求解
%
% 6.4边值问题的计算机求解