Monthly Archives: 八月 2012

You are browsing the site archives by month.

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

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

[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 →

过程很简单,按着书走就行,我之前往往使用nlinfit()来进行拟合,需要一个函数模型m文件,比较繁琐,这里用的是fittype()和fit()函数,比nlinfit()简单很多。

M源文件:

syms t
x = [0;0.4;1.2;2;2.8;3.6;4.4;5.2;6;7.2;8;9.2;10.4;11.6;12.4;13.6;14.4;15];
y = [1;0.85;0.29;-0.27;-0.53;-0.4;-0.12;0.17;0.28;0.15;-0.03;-0.15;-0.071;0.059;0.08;0.032;-0.015;-0.02];
f = fittype('a * cos(k * t) * exp(w * t)', 'independent', 't', 'coefficients', {'a', 'k', 'w'});
cfun = fit(x, y, f)     %显示拟合函数
xi = 0:.1:20;
yi = cfun(xi);
plot(x, y, 'r*', xi, yi, 'b-');

clip_image001 Read More →

很简单,就像书中所描述的那样,例如:

&nb Read More →

整个过程很像C语言的文件保存操作。

需要先用fopen(‘filename’, ‘type’)打开一个文件句柄,然后用fprintf(fid, format, variable)即可。

在Matlab帮助文件中搜索fprintf有非常详细的帮助文档。

但是想将我在“Textread函数-高级的Matlab与ASCII文件数据交互”里存入Matlab里的那个表格成功输出出来并不是那么容易的事,首先我们将数据存进Matlab后它已经成了一个矩阵,特别是对于name矩阵和answer矩阵,因为它们是cell类型,不能直接输出,这时,我们就需要进行类型转换了——char()函数。

建立M文件如下:

fid = fopen(‘E:\MatlabTest\TestDataPrint.txt’, ‘w’);
fprintf(fid,‘This is the database of Class 1.\n’);
for i = 1:4
fprintf(fid, ‘%s Type%u %f %u %s \n’, char(name(i)), type(i), x(i), y(i), char(answer(i)));
end
fclose(fid);

  Read More →