清风数学建模代码笔记3(更新课_2

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自带的粒子群函数

介绍

Matlab particleswarm 函数采用的是自适应的邻域模式
见ppt

 

 

 

 代码

只用于求最小值,若要求最大值则取反

%% 求解函数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

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笑一个吧U

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值