14.符号运算
定义符号变量与简单运算
simplify(y) 对y这个式子进行化简
factor(y)进行因式分解
expand(y)多项式展开
collect(z,x)式子合并【对z表达式中以x进行合并(z = f(x,y))】
符号函数的求导与差分
一元函数求导:diff(y,n):对y求n阶导,若无n则默认为一阶导
多元函数求导:
例如y有x1 x2 x3三个参数 diff(y,x1,2)即y对x1求二阶导 diff(y,x1,x2)先对x1再对x2求偏导
如果diff函数作用的对象不是符号函数,而是矩阵,那么对应的功能是求差分
A2=diff(A,2) % 下一行减去上一行求二阶差分(在一阶差分的基础上再差分一次)
A3=diff(A,2,1) % 最后面的1表示在行上进行差分
A4=diff(A,1,2) % 后一列减去前一列求一阶差分, 最后面的2表示在列上进行差分
A4=diff(A,2,2) % 后一列减去前一列求二阶差分
定积分和不定积分的计算
syms x ; y = x^2; y1 = int(y,x) 【最后结果不会加C,另外如1/x,最后结果也不会加绝对值】
定积分就是 int(y,x,a,b)a为下限b为上限
求解方程和方程组
solve函数
求解单变量方程:syms x; ans = solve(sin(x) == 1, x)此时最后一个参数x可写可不写【单变量】
多变量方程求解:方程后面就要加参数,表示对哪个参数进行求解,多变量就:[x1,x2]
方程组求解:
vpasolve函数
vpasolve(eqn, x, [0 2]) 可指定区间 区间如果只给一个数字,那么就作为搜索起点
vpasolve(eqn, x, 'random', true) 随机指定范围寻找解【可能有多个解】
[answ_x, answ_y] = vpasolve(eqn, [x, y],[-4 -1;1 5]) 对多个变量求解
[answ_x, answ_y] = vpasolve(eqn, [x, y], 'random', true)
fimplicit(x^2 - 2*x - 3*x*y == 10, [-10 10],'r') 绘制隐函数图像
fsolve函数(求解功能最为强大)
fsolve是Matlab优化工具箱中的一个函数,可专门用来求解特别复杂的方程和方程组
15.微分方程
求解析解
1.dsolve('方程1','方程n','初始值','自变量‘)
2.syms y(x)
eqn = (y - diff(y,x) == 2*x); % 注意原来方程中的“=”一定要改成“==”
dsolve(eqn) 【多个式子的话可以用中括号,且内部是(不是’】
例四:(两种方法)
[x,y,z] = dsolve('Dx = 2*x -3*y+3*z+t','Dy = 4*x-5*y+3*z+t','Dz = 4*x-4*y+2*z+t','t');
disp(x);disp(y);disp(z);
latex(y);
syms x(t) y(t) z(t)
Dx = diff(x);Dy = diff(y);Dz = diff(z);
eqn = [(Dx == 2*x -3*y+3*z+t),(Dy == 4*x-5*y+3*z+t),(Dz == 4*x-4*y+2*z+t)];
[x,y,z] = dsolve(eqn);
disp(x);disp(y);disp(z);
求数值解(方程很复杂时解析解求不出来)
求不出来方程表达式的时候,可以退而求其次,在相应区间内求出很多个点与之对应的函数值,那么也可以近似的求出函数
上图为函数列表,使用的时候要将solver更换为相应函数【常用ode45,ode15s】【看刚性和非刚性选用函数,上图红框有解释,刚性很少,所以基本用ode45】
参数:
'f' 或 @f :类似于非线性规划中的方程,也要写在单独的m文件,要注意标准形式
ts:即自变量的范围?可以定左右边界,也可以写成向量
x0:初始值(左边界) options:指定精度,可有可无
得出的结果:x为自变量 y为函数值 [x,y] = solver(@f,ts,x0,options)
一阶微分求解
例二主体函数:
%% 一般情况下先判断有无解析解,没有再去考虑数值解
%解析解:
clear;clc
[y1 y2 y3] = dsolve('Dy1 = y2*y3','Dy2 = -y1*y3','Dy3 = -0.51*y1*y2','x');
%数值解
[x y] = ode45('tfun',[0 4*pi],[0 1 1]);
plot(x,y(:,1),'o',x,y(:,2),'-',x,y(:,3),'*');
legend('y1','y2','y3');
axis([0 4*pi inf -inf]);
t2fun函数:(一定要将不标准形式改为标准形式,且为列向量)
function dy = tfun(x,y)
dy = zeros(3,1);
dy(1) = y(2)*y(3);
dy(2) = -y(1)*y(3);
dy(3) = -0.51*y(1)*y(2);
end
高阶微分方程求解
一定要先转换为一阶微分方程求解
dsolve('(1+x*x)*D2y = 2*x*Dy','x');
clear;clc
[x y] = ode45(@t4f,[-2 2],[3 4]);
plot(x,y(:,1),'-');
function dy = tf4(x,y)
dy = zeros(2,1);
dy(1) = y(2);
dy(2) = 2*x*y(2)/(1+x*x);
end
利用微分方程进行人口预测
马尔萨斯模型(Malthus)
x = dsolve('Dx=r*x','x(0)=x0','t') % x = dsolve('Dx=r*x','x(t0)=x0','t')
% x = x0*exp(r*t)
% 怎么把上面这个式子中的x0和r替换成确定的值?
x0 = 100;
r = 0.1;
subs(x)
阻滞增长模型(Logistic)
由于人口增加之后人口增长速度自然会减慢,因此我们对于增长率的假设不能为常数
x = dsolve('Dx=r*(1-x/xm)*x','x(t0)=x0','t') % 化简后和书上的结果一样
% mupad % 把计算出来的结果粘贴过去可以得到直观的表达式
% 高版本可以使用实时脚本
t0 = 0;
x0 = 1000;
xm = 10000;
r = 0.05;
xx = subs(x); % 10000/(exp(log(9) - t/20) + 1)
fplot(xx,[0,200])
捕食者猎物模型
沃尔泰拉模型(Volterra)
种群相互竞争模型
种群相互依存模式
传染病模型
SI模型及其拓展
global TOTAL_N % 定义总人数为全局变量(可以在子函数中使用)
TOTAL_N = 1000; % 总人数
i0 = 1; % 初始时刻患者(已感染者)的人数
[t,x]=ode45('fun1',[1:200],[TOTAL_N-i0 i0]);
function dx=fun1(t,x) % 大家可以修改里面的参数,来看结果的变化
global TOTAL_N % 定义总人数为全局变量
beta = 0.1; % 易感染者与已感染者接触且被传染的强度
dx = zeros(2,1); % x(1)表示S x(2)表示I
dx(1) = - beta*x(1)*x(2)/TOTAL_N;
dx(2) = beta*x(1)*x(2)/TOTAL_N;
end
SI模型拓展一
function dx=fun2(t,x) % 大家可以修改里面的参数,来看结果的变化
global TOTAL_N % 定义总人数为全局变量
beta = 0.1; % 易感染者与已感染者接触且被传染的强度
if t > 60
beta = beta/10; % 第60期后禁止大规模聚会,使得传染强度beta缩小为原来的10倍
end
% beta = 0.1 - 0.001*t
% if beta < 0
% beta = 0;
% end
dx = zeros(2,1); % x(1)表示S x(2)表示I
dx(1) = - beta*x(1)*x(2)/TOTAL_N;
dx(2) = beta*x(1)*x(2)/TOTAL_N;
end
SI模型拓展二
SI模型拓展三
SI模型拓展四
SIS模型(同样有拓展,可参考SI
SIR模型(这部分的分子N注意一下,有的是所有人
注:当ode45函数中的第一个参数,即fun函数除了自变量和因变量之外想传入其他参数时,需要: [t,x]=ode45(@(t,x) newfun2(t,x,GAMMA),[1:500],[N-i0 i0 0]);
SIRS模型
SEIR模型
16.粒子群算法入门
matlab粒子群算法示例基本实现
h = scatter(x,fit,80,'*r'); 画散点图
改进1线性递减惯性权重
改进2自适应惯性权重
改进3随机惯性权重
即将w权重设定为0-1的随机数等各种
改进4压缩(收缩)因子法
改进5非对称学习因子
改进6自动退出迭代循环
matlab自带的粒子群函数
介绍
代码
只用于求最小值,若要求最大值则取反
%% 求解函数y = x1^2+x2^2-x1*x2-10*x1-4*x2+60在[-15,15]内的最小值(最小值为8)
narvs = 2; % 变量个数
x_lb = [-15 -15]; % x的下界(长度等于变量的个数,每个变量对应一个下界约束)
x_ub = [15 15]; % x的上界
[x,fval,exitflag,output] = particleswarm(@Obj_fun2, narvs, x_lb, x_ub)
@函数内容为函数的表达式,narvs为变量个数,x_lb为下界,x_ub为上界
x为求出的变量值,fval即最后的结果,exitflag即跳出迭代的类型,output为结构体类型包含一些信息
绘制最佳的函数值随迭代次数的变化图
options = optimoptions('particleswarm','PlotFcn','pswplotbestf')
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)
%% 在粒子群算法结束后继续调用其他函数进行混合求解(hybrid n.混合物合成物; adj.混合的; 杂种的;)
options = optimoptions('particleswarm','HybridFcn',@fmincon);
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)
%% 修改粒子数量,默认的是:min(100,10*nvars)
options = optimoptions('particleswarm','SwarmSize',50);
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)
%% 最大的迭代次数,默认的是200*nvars
options = optimoptions('particleswarm','MaxIterations',10000);
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)
若想多个选择一起,累加即可:options = optimoptions('particleswarm','FunctionTolerance',1e-12,'MaxStallIterations',100,'MaxIterations',100000);
还有一些变化,见代码code10