Matlab-拟合与插值

This is my blog.
这个算是数值分析吧!
奈何,换了老师后,简直分分钟倒呀~
幸好,考试比较水哎~

拟合与插值

ployfit(x,y,n)与polyval

其中x与y为样本点向量,n为所求多项式的阶数,p为求出的多项式。

例子


二次的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
clear;
clf; %清除当前窗口
clc;
t = 1900:10:2000; %时间t
y = [76 92 106 123 132 151 179 203 227 250 281]; %人口y
plot(t,y,'k*');
hold on;
% figure;                          %重新开一个图
p1 = polyfit(t,y,2);
plot(t, polyval(p1, t));
axis([1900 2000 0 300]); %图像xy轴范围
disp(char(['y=',poly2str(p1,'t')],
['a=',num2str(p1(1)),' b=',num2str(p1(2)),' c=',num2str(p1(3))]));

指数的(先化简哦!)

1
2
3
4
5
6
7
8
9
10
11
12
t = 1900:10:2000; %时间t
y = [76 92 106 123 132 151 179 203 227 250 281]; %人口y
yy = log(y); %必需的线性化变形
p2 = polyfit(t,yy,1);
b = p2(1);
a = exp(p2(2));
y2 = a * exp(b*t); %指数拟合函数式
plot(t,y,'rp',t,y2,'k-');
grid off;
xlabel('时间t');
ylabel('人口数(百万)');
title('人口数据');

interp1(x,y,x0,’method’)

一维插值,其中xy分别表示为数据点的横、纵坐标向量,x0为需要插值的横坐标数据(或数组)。而method为可选参数,对应于四种方法:
nearest———最近邻点插值
linear ———线性插值
spline ———三次样条插值
cubic ———立方插值

例子

在一天24小时内,从零点开始每间隔2小时测得的环境温度数据分别为
12,9,9,1,0,18 ,24,28,27,25,20,18,15,13
请推测13点时的温度。

1
2
3
4
5
6
7
8
9
x = 0:2:24;
y = [12 9 9 10 18 24 28 27 25 20 18 15 13];
a = 13;
y1 = interp1(x,y,a,'spline')
%若要得到一天24个小时的温度曲线,则如下
xi = 0:1/3600:24;
yi = interp1(x,y,xi, 'spline');
plot(x,y,'o' ,xi,yi);

interp2(x,y,z,xi,yi,’method’)

二维插值,method同上

例子

原始面

1
2
3
4
5
6
[X,Y] = meshgrid(-3:3); %产生网格坐标
%peaks本质上是一个二元高斯分布的概率密度函数
H = peaks(X,Y); %通过网格坐标计算函数值,产生三维凹凸面
figure
surf(X,Y,H) %三维着色图
title('Original Sampling');%原始面

插值后

1
2
3
4
5
[Xq,Yq] = meshgrid(-3:0.25:3); %产生插值所需要的网格
Hq = interp2(X,Y,H,Xq,Yq); %通过对V线性插值(默认的)得到新的面Vq
figure
surf(Xq,Yq,Hq);
title('Linear Interpolation Using Finer Grid');

lsqnonlin(fun,x0,lb,ub,options)与lsqcurvefit

非线性最小二乘法

例子


fit_mod.m

1
2
3
4
function y = fit_mod(c)
xd = 1:10;
yd = [3.5 3.0 2.6 2.3 2.1 1.9 1.7 1.6 1.5 1.4];
y = yd - [c(1) + c(2) * exp(-0.02 * c(3)*xd)];

test.m

1
2
3
4
5
6
7
8
9
c0 = [0 1 1];
c = lsqnonlin('fit_mod',c0)
%画图
xd = 1:10;
yd = [3.5 3.0 2.6 2.3 2.1 1.9 1.7 1.6 1.5 1.4];
plot(xd,yd,'p');
hold on;
ezplot('c(1) + c(2) * exp(-0.02 * c(3)*xd)',[0.2 16);
grid on;

或者可以用句柄

1
2
3
4
5
6
c = [0 1 1];
xd = 1:10;
yd = [3.5 3.0 2.6 2.3 2.1 1.9 1.7 1.6 1.5 1.4];
fun = @(x,xd)(yd - [c(1) + c(2) * exp(-0.02 * c(3)*xd)]);
x0 = [0.5,1];
x = lsqcurvefit(fun,x0,xdata,ydata)

fittype

自定义拟合
fittype('functionm','independent','independent variable name','coefficients',{'coefficient names'});

1
2
3
4
5
6
7
x = [0;0.4;1.2;2];
y = [1;0.85;0.29;-0.27];
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-');

x,y必须为列向量

Curve Fitting

一个工具箱,可以看看哪个更优美

层次分析法

评价类问题

资源分配、决策类问题

多目标优化问题

后记

英语貌似得加油了,自己的实战能力太差了
感觉Google被我大材小用了
还是要学会看论文的,毕竟以后也有用的啊
没有想到博博画画那么厉害
感觉博博都是我男神了
什么都会哎~
相比之下,怎么觉得我什么都不会呢
唔~不开心
今天舍长爸爸回家了,孤身一人感觉还可以
估计小时候习惯了吧!
锻炼一下,感觉脑袋都清醒了一些
健康生活,越来越好吧!

转载请注明出处,谢谢。

愿 我是你的小太阳



买糖果去喽