数学建模学习笔记——微分方程建模

数学建模学习笔记——微分方程建模

  • 一、基础知识储备
    • 1.微分方程的建模思路
    • 2.常用函数汇总
  • 二、章节习题解答

本文章为《数学建模算法与应用(司守奎)》书籍的学习笔记,文章内代码大部分为该书籍的搬运或在网络上的搜集,主要目的为简化阅读的过程,以便直接实现代码的运用,我也会对书中的习题给出自己的解。

一、基础知识储备

微分方程建模没有通用的方法,每道题的微分方程都是针对这一问题的,故这里我不在重复搬运书中的内容,我只整理一下微分方程部分需要用到的函数和微分建模的一般思路。

1.微分方程的建模思路

(1)根据实际要求确定要研究的量(自变量、未知函数、必要的参数等)并确定坐标系。
(2)找出这些量所满足的基本规律(物理的、几何的、化学的或生物学的等等)。
(3)运用这些规律列出方程和定解条件。有时需要根据题目中的相等关系列写等式(如运动方向同向的关系)。

2.常用函数汇总

该部分代码全部来源于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])

二、章节习题解答

本章习题的过程普遍比较繁琐,且配套习题解答中已包含所有题的答案,这里不再重复。

你可能感兴趣的:(学习,matlab)