微分方程建模没有通用的方法,每道题的微分方程都是针对这一问题的,故这里我不在重复搬运书中的内容,我只整理一下微分方程部分需要用到的函数和微分建模的一般思路。
(1)根据实际要求确定要研究的量(自变量、未知函数、必要的参数等)并确定坐标系。
(2)找出这些量所满足的基本规律(物理的、几何的、化学的或生物学的等等)。
(3)运用这些规律列出方程和定解条件。有时需要根据题目中的相等关系列写等式(如运动方向同向的关系)。
该部分代码全部来源于matlab官网,只是做一个简单的整理,实际用法请查阅官方文档。
(1)nlinfit-非线性拟合
%基本用法,对非线性函数进行拟合得到未知参数的值
modelfun = @(b,x)(b(1)+b(2)*exp(-b(3)*x));
b = [1;3;2];
x = exprnd(2,100,1);
y = modelfun(b,x) + normrnd(0,0.1,100,1);
beta0 = [2;2;2];
beta = nlinfit(x,y,modelfun,beta0)
(2)syms-创建符号标量变量和函数
%通常我们求解微分方程时会用到
syms x y;
syms s(t) f(x,y);
f(x,y) = x + 2*y;
f(1,2) %输出5
(3)desolve-求解微分方程组
syms y(t) a b
eqn = diff(y,t,2) == a^2*y; %y对t的二阶微分
Dy = diff(y,t);
cond = [y(0)==b, Dy(0)==1]; %初始或边界条件
ySol(t) = dsolve(eqn,cond)
%%
syms y(x)
eqn = diff(y) == (x-exp(-x))/(y(x)+exp(y(x)));
S = dsolve(eqn)
%当找不到解析解时,可以设置下面的参数求得隐式解。
S = dsolve(eqn,'Implicit',true)
(4)subs-符号替换(常用来代入参数值来计算解析函数)
syms a b
subs(a + b,a,4) %用4代替a
subs(a*b^2,a*b,5) %用5代替a*b
subs(cos(a) + sin(b), [a,b], [sym('alpha'),2]) %多变量的替代,α代替a,2代替b
(5)vpa-任意精度的算术
digitsOld = digits(7);
y = sym(100001)/10001;
yVpa = vpa(y) %输出y的储存在yvpa中的计算值,保留7位有效数字,如果末尾有零,则舍去。
(6)solve-求解优化问题或方程问题
%solve貌似可以求解各种规划问题,但是我们已有专门的更简单的函数直接求,故这里只整理它的求解方程用法
%已知一个关于x的参数方程
syms y(x)
y = x+6;
solve(y) %即返回y==0的方程的解,返回-6
(7)real,imag-复数的实部,复数的虚部(一般二维坐标可能会用到)
Z = 2+3i;
X = real(Z)
Y = imag(Z)
(8)ezplot-绘制符号函数图形
%绘制显示函数
ezplot('x^2')
%绘制隐式函数
ezplot('x^2-y^4')
(9)ode45-求解非刚性微分方程
%matlab中以ode开头的函数有很多,都可以用来求解微分方程,ode45最为常用
%语法 [t,y] = ode45(dy,tspan,y0),dy代表的是y的一阶导函数
tspan = [0 5];
y0 = 0;
[t,y] = ode45(@(t,y) 2*t, tspan, y0);
plot(t,y,'-o')
(10)ode15i-解算全隐式微分方程
%eg
%一个隐函数
function res = weissinger(t,y,yp)
res = t*y^2 * yp^3 - y^3 * yp^2 + t*(t^2 + 1)*yp - t^2 * y;
%使用ode15i计算的初始条件须一致,使用decic函数为ode15i提供一致的初始条件
t0 = 1;
y0 = sqrt(3/2);
yp0 = 0;
[y0,yp0] = decic(@weissinger,t0,y0,1,yp0,0) %1,0的位置保留表示y,yp是否为固定分量(这里不太懂诶,其实都设成0效果一样~)
[t,y] = ode15i(@weissinger,[1 10],y0,yp0); %求得隐式函数的数值解
ytrue = sqrt(t.^2 + 0.5); %函数实际的解析
plot(t,y,'*',t,ytrue,'-o') %画图进行解析解和数值解的对比
legend('ode15i', 'exact')
(11)simplify-简化解析函数表达式
syms x a b c
S = simplify(sin(x)^2 + cos(x)^2)
%输出 S = 1
S = simplify(exp(c*log(sqrt(a+b))))
%输出S = (a+b)^(c/2)
(12)gamma函数-可以当做阶乘来用(bushi)
ans = gamma(5)
%输出ans = 4! = 24
(13)int-定积分和不定积分
%用法
%F = int(expr),得到expr的原函数
%F = int(expr,var),当expr多个变量时,以var为被积变量得到原函数
%F = int(expr,a,b),在区间[a,b]对expr进行积分
%F = int(expr,var,a,b),指定被积变量的定积分
%F = int(___,Name,Value),Name,Value是一些可选参数,对Name参数设置值value,用来控制显示格式
%eg
syms x
expr = -2*x/(1+x^2)^2;
F = int(expr)
syms x
expr = x*log(1+x);
F = int(expr,[0 1])
本章习题的过程普遍比较繁琐,且配套习题解答中已包含所有题的答案,这里不再重复。