Category Archives: Matlab学习笔记

看《Matlab在数学建模中的应用》留下的笔记

Matlab本身提供了功能强大的遗传算法工具箱,主要是调用 ga()与gaoptimset()两个函数,这里以下面函数的最小值为例演示:

clip_image001

这个函数在[-30, 30]区间上都只有一个最小值,这个理论最小值为:

clip_image002

下面两幅图片为N分别等于1,2时的目标函数图像。

clip_image003

图1 N=1时函数图像 Read More →

MATLAB中非线性规划的数学模型标准形式:

clip_image001

Matlab命令为:

X = fmincon(fun, x0, A, B, Aeq, Beq, LB, UB, nonlcon, options)

例如:

clip_image002 Read More →

线性规划在我们高中的数学课程就有接触,这里就不再细说。

线性规划的MATLAB标准形式:

clip_image001

对于max问题且为Ax>=b的,可以转换为

clip_image002

进行求解。

例如下面问题:

clip_image003 Read More →

将未测量的地点用数据插值模拟,具体源码见下:

源码(与原源码略有改动):

[x, y] = meshgrid(1:10);
h = [0, 0.02, -0.12, 0, -2.09, 0, -0.58, -0.08, 0, 0;...
    0.02, 0, 0, -2.38, 0, -4.96, 0, 0, 0, -0.1;...
    0, 0.1, 1, 0, -3.04, 0, -0.53, 0, 0.1, 0;...
    0, 0, 0, 3.52, 0, 0, 0, 0, 0, 0;...
    -0.43, -1.98, 0, 0, 0, 0.77, 0, 2.17, 0, 0;
    0, 0, -2.29, 0, 0.69, 0, 2.59, 0, 0.3, 0;...
    -0.09, -0.31, 0, 0, 0, 4.27, 0, 0, 0, -0.01;...
    0, 0, 0, 5.13, 7.4, 0, 1.89, 0, 0.04, 0;...
    0.1, 0, 0.58, 0, 0, 1.75, 0, -0.11, 0, 0;...
    0, -0.01, 0, 0, 0.3, 0, 0, 0, 0, 0.01];
[xi, yi] = meshgrid(1:0.1:10);
hi = interp2(x, y, h, xi, yi, 'spline');
surf(hi);
colorbar('YTickLabel',{'-4','-2','0','2','4','6'})
xlabel('x'), ylabel('y'), zlabel('h')

效果如下: Read More →

其实,Logistic模型是在是个非常老的问题了,第一次参加院赛,给的数据是美国的人口数据,可以非常好的与Logistic模型拟合,于是我用的就是Logistic模型,只不过当时对Matlab还比较生,程序写的是在不再不怎么样,现实建立一个M文件作为函数模型,又调用nlinfit()函数才完成,书中是自己运用Logistic的推导过程,先转成线性模型然后再回归分析,未尝不是个好方法。

M源文件(与书中源码相比,略有改动):

clear
clc
% 读入人口数据(1971-2000)
Y = [33815  33981   34004   34165   34212   34327   34344   34458   34498   34476   34483   34488   34513   34497   34511   34520   34507   34509  34521   34513    34515   34517   34519   34519   34521   34521  34523   34525   34525   34527]
% 读入时间变量数据(t=年份-1970)
T = 1:1:30
% 保存原始数据
Yo = Y;
To = T;
% 线性化处理
for t = 1:30,
    x(t) = exp(-t);
    y(t) = 1/Y(t);
end
% 计算,并输出回归系数 B
c = zeros(30,1)+1;
X = [c,x'];
B = inv(X'*X)*X'*y'
for i = 1:30,
    % 计算回归拟合值
    z(i) = B(1,1)+B(2,1)*x(i);
    % 计算离差
    s(i) = y(i) - sum(y)/30;
    % 计算误差
    w(i) = z(i) - y(i);
end
% 计算离差平方和S
S = s * s';
% 计算误差平方和Q
Q = w * w';
% 计算回归平方和U
U = S - Q;
% 计算,并输出F检验值
F = 28 * U / Q
% 计算非线性回归模型的拟合值
for j = 1:30,
    Y(j) = 1 / (B(1, 1) + B(2, 1) * exp(-j));
end
% 输出非线性回归模型的拟合曲线(Logistic 曲线)
plot(T, Y, To, Yo, 'r*')
grid on;

Read More →