Matlab学习——求解微分方程(组)
介绍:
1.在 Matlab 中,用大写字母 D 表示导数,Dy 表示 y 关于自变量的一阶导数,D2y 表示 y 关于自变量的二阶导数,依此类推.函数 dsolve 用来解决常微分方程(组)的求解问题,调用格式为
X=dsolve(‘eqn1’,’eqn2’,…)
如果没有初始条件,则求出通解,如果有初始条件,则求出特解
系统缺省的自变量为 t。
2.函数 dsolve 求解的是常微分方程的精确解法,也称为常微分方程的符号解.但是,有大量的常微分方程虽然从理论上讲,其解是存在的,但我们却无法求出其解析解,此时,我们需要寻求方程的数值解,在求常微分方程数值解方面,MATLAB 具有丰富的函数,将其统称为 solver,其一般格式为:
[T,Y]=solver(odefun,tspan,y0)
说明:(1)solver 为命令 ode45、ode23、ode113、ode15s、ode23s、ode23t、ode23tb、ode15i 之一.
(2)odefun 是显示微分方程 y ' = f (t , y) 在积分区间 tspan = [t 0 , t f ] 上从 t0 到 t f 用初始条件 y0 求解.
(3)如果要获得微分方程问题在其他指定时间点 t 0 , t1 , t 2 , , t f 上的解,则令tspan = [t 0 , t1 , t 2 , t f ] (要求是单调的).
(4)因为没有一种算法可以有效的解决所有的 ODE 问题,为此,Matlab 提供了多种求解器 solver,对于不同的 ODE 问题,采用不同的 solver
3.在 matlab 命令窗口、程序或函数中创建局部函数时,可用内联函数 inline,inline 函数形式相当于编写 M 函数文件,但不需编写 M-文件就可以描述出某种数学关系.调用 inline 函数,只能由一个 matlab 表达式组成,并且只能返回一个变量,不允许[u,v]这种向量形式.因而,任何要求逻辑运算或乘法运算以求得最终结果的场合,都不能应用 inline 函数,inline 函数的一般形式为:
FunctionName=inline(‘函数内容’, ‘所有自变量列表’)
例如:(求解 F(x)=x^2*cos(a*x)-b ,a,b 是标量;x 是向量 )在命令窗口输入:
Fofx=inline('x.^2.*cos(a.*x)-b','x','a','b');g = Fofx([pi/ pi/3.5],,)
系统输出为:g=-1.5483 -1.7259注意:由于使用内联对象函数 inline 不需要另外建立 m 文件,所有使用比较方便,另外在使用 ode45 函数的时候,定义函数往往需要编辑一个 m 文件来单独定义,这样不便于管理文件,这里可以使用 inline 来定义函数。
例子:
一、ex(求精确解):
1. 求解微分方程 y ' + 2xy = xe-x2
syms x y; y=dsolve('Dy+2*x*y=x*exp(-x^2)','x')
运行结果:
2. 求微分方程 xy ' + y - e x = 0 在初始条件 y (1) = 2e 下的特解并画出解函数的图形.
syms x y; y=dsolve('x*Dy+y-exp(1)=0','y(1)=2*exp(1)','x');ezplot(y)
运行结果:
3. 求解微分方程组在初始条件x |t = 0 = 1, y |t =0 = 0 下的特解,并画出解函数的图像。
syms x y t; [x,y]=dsolve('Dx+5*x+y=exp(t)','Dy-x-3*y=0','x(0)=1','y(0)=0','t'); simplify(x); simplify(y); ezplot(x,y,[,1.3]);axis auto
其中,simplify函数可以对符号表达式进行简化。以下是运行结果:
二、ex(近似解):
1. 求解微分方程初值问题的数值解,求解范围为区间 [0,0.5] 。
fun=inline('-2*y+2*x^2+2*x','x','y');
[x,y]=ode23(fun,[,0.5],);
plot(x,y,'o-')
2.求解微分方程,y(0) = 1,y(0) = 0 的解,并画出解的图像。
通过变换,将二阶方程化为一阶方程组求解.令,则
编写 vdp.m 文件:
function fy=vdp(t,x) fy=[x();*(-x()^)*x()-x()]; end
命令行输入:
y0=[;]
[t,x]=ode45('vdp',[,],y0);
y=x(:,);dy=x(:,);
plot(t,y,t,dy)
在使用ode45函数的时候,定义函数往往需要编辑一个 .m文件来单独定义,这样不便于管理文件,因此编写 inline 函数:
fy=inline('[x(2);7*(1-x(1)^2)*x(2)-x(1)]','t','x')
运行:
结果一致!
三、ex(用 Euler 折线法求解):
Euler 折线法求解的基本思想是将微分方程初值问题
化成一个代数(差分)方程,主要步骤是用差商替代微商
,于是
记,从而
,于是
1. 用 Euler 折线法求解微分方程初值问题
的数值解(步长h取 0.4),求解范围为区间[0,2]
本题的差分方程为:
clear;
f=sym('y+2*x/y^2');a=;b=;
h=0.4;
n=(b-a)/h+;
x=;
y=;
szj=[x,y];%数值解
for i=:n-
y=y+h*subs(f,{'x','y'},{x,y});%subs,替换函数
x=x+h;
szj=[szj;x,y];
end;
szj;
plot(szj(:,),szj(:,))
说明:替换函数 subs 例如:输入 subs(a+b,a,4) 意思就是把 a 用 4 替换掉,返回 4+b,也可以替换多个变量,例如:subs(cos(a)+sin(b),{a,b},[sym('alpha'),2])分别用字符 alpha 替换 a 和 2 替换 b,返回 cos(alpha)+sin(2)。
偏微分方程解法
Matlab 提供了两种方法解决 PDE 问题,一是使用 pdepe 函数,它可以求解一般的 PDEs,具有较大的通用性,但只支持命令形式调用;二是使用 PDE 工具箱,可以求解特殊 PDE 问题,PDEtoll 有较大的局限性,比如只能求解二阶 PDE问题,并且不能解决片微分方程组,但是它提供了 GUI 界面,从复杂的编程中解脱出来,同时还可以通过 File—>Save As 直接生成 M 代码.
实例:
求解一个正方形区域上的特征值问题:
正方形区域为:。
(1)使用 PDE 工具箱打开 GUI 求解方程
(2)进入 Draw 模式,绘制一个矩形,然后双击矩形,在弹出的对话框中设置Left=-1,Bottom=-1,Width=2,Height=2,确认并关闭对话框
(3)进入 Boundary 模式,边界条件采用 Dirichlet 条件的默认值
(4)进入 PDE 模式,单击工具栏 PDE 按钮,在弹出的对话框中方程类型选择Eigenmodes,参数设置 c=1,a=-1/2,d=1,确认后关闭对话框
(5)单击工具栏的 D 按钮,对正方形区域进行初始网格剖分,然后再对网格进一步细化剖分一次
(6)点开 solve 菜单,单击 Parameters 选项,在弹出的对话框中设置特征值区域为[-20,20]
(7)单击 Plot 菜单的 Parameters 项,在弹出的对话框中选中 Color、Height(3-D plot)和 show mesh 项,然后单击 Done 确认
(8)单击工具栏的“=”按钮,开始求解
得到结果:
Matlab学习——求解微分方程(组)的更多相关文章
- 龙哥库塔法or欧拉法求解微分方程matlab实现
举例:分别用欧拉法和龙哥库塔法求解下面的微分方程 我们知道的欧拉法(Euler)"思想是用先前的差商近似代替倒数",直白一些的编程说法即:f(i+1)=f(i)+h*f(x,y)其 ...
- 用Matlab求解微分方程
用Matlab求解微分方程 解微分方程有两种解,一种是解析解,一种是数值解,这两种分别对应不同的解法 解析解 利用dsolve函数进行求解 syms x; s = dsolve('eq1,eq2,.. ...
- Matlab学习笔记 figure函数
Matlab学习笔记 figure函数 matlab中的 figure 命令,能够创建一个用来显示图形输出的一个窗口对象.每一个这样的窗口都有一些属性,例如窗口的尺寸.位置,等等.下面一一介绍它们. ...
- matlab学习笔记 bsxfun函数
matlab学习笔记 bsxfun函数 最近总是遇到 bsxfun这个函数,前几次因为无关紧要只是大概看了一下函数体去对比结果,今天再一次遇见了这个函数,想想还是有必要掌握的,遂查了些资料总结如下. ...
- matlab学习笔记11_1低维数组操作
一起来学matlab-matlab学习笔记11 11_1 低维数组操作repmat函数,cat函数,diag函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab ...
- MATLAB学习笔记(七)——MATLAB解方程与函数极值
(一)线性方程组求解 包含n个未知数,由n个方程构成的线性方程组为: 其矩阵表示形式为: 其中 一.直接求解法 1.左除法 x=A\b; 如果A是奇异的,或者接近奇异的.MATLAB会发出警告信息的. ...
- matlab学习笔记(一)单元数组
matlab学习笔记(一)单元数组 1.floor(x) :取最小的整数 floor(3.18)=3,floor(3.98)=3 ceil(x) :取最大的整数 ceil(3.18)=4,ceil( ...
- java学习笔记04--数组
java学习笔记04--数组 数组复制的方法是使用System类提供的arraycopy()方法,其语法如下: System.arraycopy(Object src, int srcPos, Obj ...
- matlab学习笔记---(1)
Matlab学习笔记 一. Desktop Basics (Matlab 基础知识) 当你打开Matlab的时候,matlab按照以下默认的方式展示出来. 该桌面主要包括以下几部分内容: 当前文件夹: ...
随机推荐
- shell 学习笔记7-shell-函数
一.函数 1.什么是shell函数 把相同程序段定义成函数,可以减少整个程序的代码量,提升开发效率 增加程序的可读性,易读性,提升管理效率 可以失效程序功能模块化,使程序具备可移植性 其实linux系 ...
- sql server中:isnull(列名,0) 和isnull(列名,0)<>0 的区别
1.isnull(参数1,参数2),判断参数1是否为NULL,如果是,返回参数2,否则返回参数1. 2.isnull(列名,0),isnull()函数是用来判断列名是否为null,如果为NUll,则返 ...
- Vue+VSCode开发环境搭建
时间2019.9月 1. 安装 nodeJS; 安装VScode 安装好nodeJS之后,默认会安装好npm 测试 nodeJS 和npm是否可以执行 node -v npm -v 1.1 VScod ...
- 利用WkHtmlToPdf,把H5 转成PDF
工具下载地址: 链接:https://pan.baidu.com/s/1TSq2WWZcvPwuIfPRHST-FA 提取码:wkx8 原理: 通过IIS访问页面,利用WkHtmlToPdf.exe, ...
- 简单web性能测试工具——ab命令(ApacheBench)
ab命令(ApacheBench) ----------转载内容 ApacheBench(即ab)通常用来做网站性能压力测试,是性能调优过程中必不可少的一环,ab命令会创建很多的并发访问线程,模拟多个 ...
- http://go.microsoft.com/fwlink/?linkid问题
今天不知怎的,打开一个网页出现了http://go.microsoft.com/fwlink/?linkid=XXX 烦死了,在百度搜了下方法,什么改注册表,策略模板等不见起效.其实打开IE的设置, ...
- bom浏览器对象模型(基础)
页面中有一个顶级对象: document -> 操作页面元素 浏览器中也有个顶级对象: window -> 页面中所有的东西都是属于window的 变量属于window var n ...
- iOS中JSON解析三方库的比较
网络数据解析框架 1. JsonModel 一个 JSON 模型转换库,有着比较简洁的接口.Model 需要继承自 JSONModel. 2. yyModel yyModel比较轻量(算上.h 只 ...
- 一行命令开启VNC 和windows之间复制粘贴功能
sudo apt install autocutsel 安装完成之后: [注意]中文会乱码!!! 执行以下命令: autocutsel 这个则是后台运行,选择一种即可: autocutsel -f
- 偶然发现的几个OPENWRT工具安装包
https://rychly.gitlab.io/openwrt-packages/ 有心人已经打好包了,下载拿用 例如:dropbrute https://rychly.gitlab.io/open ...