到了最麻烦的部分了,matlab比较重要的一点就是做计算,换句话说就是解方程。
经常会遇到非线性的、非齐次的、高次的、微分的、多元的方程组,哪些可以解,哪些不能解,程序怎么写,有没有近似解法,算法怎么设计,等等,都是问题,需要系统整理。
学习之后完成三个任务,整理方程求解方法、解决遇到的那个非线性方程组、解决泊松方程的求解。
极限计算
MATLAB 可以使用 limit 命令计算极限。最基本的使用方法就是输入你要计算的表达式。
MATLAB 将会帮你找出独立变量趋于零时的极限。
(isequal(A,k)可以判断两个值是否相等)
如果在特定的点就写成limit(f, a)
无穷就写成inf
左极限和右极限
在后面加left,或者right,注意还要加上变量名,即对哪个变量求极限:
a = limit(f,x,3,‘left’)
获得渐近线
略。。。
求导计算
命令为diff(),可以先写成表达式a=f(x),然后diff(a)
计算高阶导数:diff(f,n),n为阶数,diff的结果也可以赋值给变量来保存
指令subs(f,c),计算f(c)
具体等用到再说。。。。
dsolve命令
在 MATLAB 中我们可以使用 dsolve 命令求解符号微分方程
使用 dsolve 求某个方程的解的语法是 dsolve(‘equ’)
我们还能够为方程指定初始和边界条件,不管有多少条件,这些条件用逗号隔开并附带在“equ”后面,形式如dsolve(‘eqn’, ‘cond1’, ‘cond2’…)
可以注意下微分方程的写法:
这样的话可以处理大多数常见的微分方程。
常微分方程(ODE)求解
对于一般的情况,我们可以使用 dsolve 命令求解,只需把方程传递给它即可
与上面的方法相同
求出通解后,可以自己给C1、C2等值赋值,得到特解,方法是利用subs()函数
s = C1exp(at)
C1 = 2; a = 4;
f = subs(s) 注意一般情况下需要赋值给某个变量,可以是f,也可以是其他的
会得到 f = 2exp(4t)
意思是对于
C1和a,虽然工作区没有显示两个变量,但是仍然是有名字的变量,赋值再subs,会自动的得到特解
有边界条件时,直接写在dsolve后面, 格式类似:
dsolve(‘Dy = y*t/(t-5)’,‘y(0) = 2’)
dsolve(‘D2y - y = 0’,‘y(0) = -1’,‘Dy(0) = 2’)
方程组和相平面图
开始解决方程组的问题,就是把多个方程写在dsolve里面
相图就略了,估计用不到,,,,,
使用ODE23 和ODE45 求解一阶方程
这里的格式一下给我整蒙了。。。书上的例子是先写了个函数,然后用ode23什么什么的,实在没看懂,还是先对照着官方的文档来学习一下。
1、[t,y] = ode23(odefun,tspan,y0)
①具有一个解分量的ode
这里,odefun是一个式子,tspan是一个范围,yo为初始条件,这个式子用来求微分方程组 y’=f(t,y) 从 t0 到 tf 的积分
也就是说,用这个指令时,方程必须能写成y’=f(t,y) 的形式,然后求出数值解。
这里产生了一个问题,求出来的t和y是离散的数组,那么怎么得到任意t下的y值??
②求解范德波方程
此方程为二阶方程、非线性、常微分方程
可以写成两个一阶微分方程:
这样可以写出方程组,方程组需要写成列向量的形式,每个元素是一个式子
这里也用到了函数形式,不知道为什么,还是试着写一写吧。。。。
格式如上,先写一个函数,返回值是eqn,会返回一个方程,或者方程组(列向量),如果是方程组,y就不止一个,y也是向量,y1、y2用数组访问规则来访问。
解方程时,格式是[t,y] = ode23(@函数名称,范围,初值)
最终得到的t是一个列向量,y是两列列向量
画图时,利用点线比较直观。。。
这里的vdp叫做句柄,这个概念在之前听过但是不知道是什么意思,有时间整理一下。
③向ODE函数传递额外的参数
ode23 仅适用于使用两个输入参数(t 和 y)的函数。但是,通过在函数外部定义参数并在指定函数句柄时传递这些参数,可以传入额外参数。例如如下的方程:
此时需要写一个函数odefcn(t,y,A,B),存在四个参量
然后给参量赋值后使用ode23即可
这里还有两个不太理解的地方,一个是dydt为什么是两行一列的列向量,另外一个是为什么有.*出现。。。。先放一下吧。这个例子主要就是演示了一下形式相同,参数不同的方程组的求解。
④具有宽松误差阈值的ode
与 ode45 相比,ode23 求解器可以更好地解算具有宽松误差容限的问题。
不知什么叫宽松误差容限,看了一眼例子好像也用不到,就算了。。。
二阶方程求解
现在我们看看如何求解二阶方程的数值解。这里使用的窍门是把一个方程分解为有两个方程的方程组。
不过刚刚的例子里,已经有过二阶方程的了。。。就先略过了。