练习1:插值&拟合
题目:
有如下数据点:
x | -2 | -1.7 | -1.4 | -1.1 | -0.8 | -0.5 | -0.2 | 0.1 |
y | 0.1029 | 0.1174 | 0.1316 | 0.1448 | 0.1566 | 0.1662 | 0.1733 | 0.1775 |
x | 0.4 | 0.7 | 1 | 1.3 | 1.6 | 1.9 | 2.2 | 2.5 |
y | 0.1785 | 0.1764 | 0.1711 | 0.1630 | 0.1526 | 0.1402 | 0.1266 | 0.1122 |
x | 2.8 | 3.1 | 3.4 | 3.7 | 4 | 4.3 | 4.6 | 4.9 |
y | 0.0977 | 0.0835 | 0.0702 | 0.0588 | 0.0479 | 0.0373 | 0.0291 | 0.0224 |
1. 根据数据点试用不同的插值方法绘制曲线;
2. 试用最小二乘多项式拟合方法拟合表中数据,选择一个能较好拟合数据点的多项式阶次,给出相应的多项式系数;
3. 若表中的数据满足正态分布密度函数,试用最小二乘非线性拟合方法求出分布参数
和
的值,并绘制拟合曲线,观察拟合效果;
问题1:
%yi=interp1(x,y,new_x,'method')
%'method'可为'linear'、'nearest'、'next'、'previous'、'pchip'、'cubic'、'v5cubic'、'makima' 或 'spline'。默认方法为 'linear'。
clear;clc;
x=[-2 -1.7 -1.4 -1.1 -0.8 -0.5 -0.2 0.1 0.4 0.7 1 1.3 1.6 1.9 2.2 2.5 2.8 3.1 3.4 3.7 4 4.3 4.6 4.9];
y=[0.1029 0.1174 0.1316 0.1448 0.1566 0.1662 0.1733 0.1775 0.1785 0.1764 0.1711 0.1630 0.1526 0.1402 0.1266 0.1122 0.0977 0.0835 0.0702 0.0588 0.0479 0.0373 0.0291 0.0224];
new_x=-2:0.01:4.9;
subplot(2,2,1);
plot(x,y,'r.','Markersize',20);
hold on;
y1=interp1(x,y,new_x,'linear');
plot(new_x,y1,'b');
title('线性插值');
subplot(2,2,2);
plot(x,y,'r.','Markersize',20);
hold on;
y2=interp1(x,y,new_x,'nearest');
plot(new_x,y2,'g');
title('最邻近插值');
subplot(2,2,3);
plot(x,y,'r.','Markersize',20);
hold on;
y3=interp1(x,y,new_x,'pchip');
plot(new_x,y3,'c');
title('三次埃尔米特插值');
subplot(2,2,4);
plot(x,y,'r.','Markersize',20);
hold on;
y4=interp1(x,y,new_x,'spline');
plot(new_x,y4,'k');
title('三次样条插值');
%legend('样本点','线性插值','最邻近插值','埃尔米特插值','三次样条插值')
图示为:
问题2:
% polyfit(x,y,n)多项式拟合
% x,y为向量,n为拟合阶数
clear;clc;
x=[-2 -1.7 -1.4 -1.1 -0.8 -0.5 -0.2 0.1 0.4 0.7 1 1.3 1.6 1.9 2.2 2.5 2.8 3.1 3.4 3.7 4 4.3 4.6 4.9];
y=[0.1029 0.1174 0.1316 0.1448 0.1566 0.1662 0.1733 0.1775 0.1785 0.1764 0.1711 0.1630 0.1526 0.1402 0.1266 0.1122 0.0977 0.0835 0.0702 0.0588 0.0479 0.0373 0.0291 0.0224];
plot(x,y,'r.','Markersize',20);
hold on;
p2=polyfit(x,y,2);
y2=p2(1)*x.^2+p2(2)*x+p2(3);
plot(x,y2);
hold on;
p3=polyfit(x,y,3);
y3=p3(1)*x.^3+p3(2)*x.^2+p3(3)*x+p3(4);
plot(x,y3)
hold on;
p4=polyfit(x,y,4);
y4=p4(1)*x.^4+p4(2)*x.^3+p4(3)*x.^2+p4(4)*x+p4(5);
plot(x,y4)
hold on;
p5=polyfit(x,y,5);
y5=p5(1)*x.^5+p5(2)*x.^4+p5(3)*x.^3+p5(4)*x.^2+p5(5)*x+p5(6);
plot(x,y5)
hold on;
legend('样本点','二阶多项式插值','三阶多项式插值','四阶多项式插值','五阶多项式插值');
图示如下:
如图,经过观察,随着多项式阶数的提高,拟合效果也在不断提高。五阶多项式插值的效果已经非常好,并且可以通过计算进行验证:
SSE=0;
SST=0;
for i=1:24
SSE=SSE+(y5(i)-y(i))^2;
SST=SST+(y(i)-mean(y))^2;
end
R_squre=1-SSE/SST;
disp(['五阶多项式拟合R^2为',num2str(R_squre)])
输出结果为:
接下来输出五阶多项式的系数:
for j=1:6
k=6-j;
disp([num2str(k),'次项系数为:',num2str(p5(j))]);
end
输出结果为:
问题3:
syms t;
f=fittype('1/(sqrt(2*pi)*sigma)*exp(-(t-mu)^2/(2*sigma^2))','independent','t','coefficients',{'mu','sigma'});
%%
% f=fittype('拟合的方程','independent','自变量','coefficients',{'未知参数1','未知参数2'});
%% 这里的用符号t代替了x的位置
% [cfun,rsquare]=fit(x',y',f); 保存拟合结果和拟合效果
p=fit(x',y',f);
% p保存拟合结果
% x,y为行向量,需要转置
clear;clc;
syms t;
x=[-2 -1.7 -1.4 -1.1 -0.8 -0.5 -0.2 0.1 0.4 0.7 1 1.3 1.6 1.9 2.2 2.5 2.8 3.1 3.4 3.7 4 4.3 4.6 4.9];
y=[0.1029 0.1174 0.1316 0.1448 0.1566 0.1662 0.1733 0.1775 0.1785 0.1764 0.1711 0.1630 0.1526 0.1402 0.1266 0.1122 0.0977 0.0835 0.0702 0.0588 0.0479 0.0373 0.0291 0.0224];
f=fittype('1/(sqrt(2*pi)*sigma)*exp(-(t-mu)^2/(2*sigma^2))','independent','t','coefficients',{'mu','sigma'});
%[cfun,rsquare]=fit(x',y',f);
p=fit(x',y',f);
plot(p,x,y);
输出结果为:
因此参数值分别为:
练习2:整数规划
题目:
分配甲、乙、丙、丁四人去完成五项任务,每人完成各项任务的时间如下表所示。由于任务数多于人数,故规定其中有一个人可完成两项任务,其余三人每人只完成一项任务。试确定总花费时间最少的分配任务方案。
A | B | C | D | E | |
甲 | 9 | 2 | 4 | 15 | 9 |
乙 | 6 | 5 | 12 | 4 | 2 |
丙 | 11 | 7 | 13 | 4 | 17 |
丁 | 19 | 11 | 15 | 8 | 9 |
求解与代码实现:
根据题目要求,可以得到目标函数和约束条件如下:
其中为各人不同任务的花费时间:
代码实现如下:
% [x,fval] = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)
% 求解整数规划,调整约束条件,可转为0-1规划
% f :目标函数的系数矩阵
% intcon :整数所在位置
% A :不等式约束的变量系数矩阵
% b :不等式约束的资源数
% Aeq :等式约束的变量系数矩阵
% beq :等式约束的资源数
% lb :变量约束下限
% ub :变量约束上限
clear;clc;
f = [9 2 4 15 9 6 5 12 4 2 11 7 13 4 17 19 11 15 8 9];
ic = 1 : length(f);
A1 = zeros(4,length(f));
for i = 1:4
for j = (5*i-4):(5*i)
A1(i,j) = 1;
end
end
A2 = -1*A1;
A = [A1; A2];
b = [2;2;2;2;-1;-1;-1;-1];
Aeq = zeros(4,length(f));
for i = 1:4
for j = i:5:(5*i+1)
Aeq(i,j) = 1;
end
end
beq = [1;1;1;1];
lb = zeros(length(f),1);
ub = ones(length(f),1);
[x,fval] = intlinprog(f,ic,A,b,Aeq,beq,lb,ub);
disp('最终计划为:')
disp(find(x))
disp('最优目标函数值为:')
disp(fval)
输出结果为:
此时对应分配方案为:
甲 | 任务B、任务C |
乙 | 任务A |
丙 | 任务D |
丁 | 任务E |
最短时间为:
练习3:评价类模型
题目:
某部队即将换装步枪,因个人作战目的不同,选择的强制会不同,那么如何选择步枪?
可供选择的步枪有:步枪A、步枪B、步枪C
影响选择枪支的因素有:作战目的、杀伤力、作战距离、后坐力、换弹速度等
(1). 试建立层次分析模型
(2). 给出步枪A、步枪B、步枪C对作战距离的成对比较矩阵,求出最大特征根,相应的归一化特征向量,并进行一致性检验(暂略)
问题1:
评价目标:选择最合适的步枪
备选方案:步枪A、步枪B、步枪C
属性集合:作战目的(假设有三种:a,b,c)、杀伤力X1、作战距离X2、后坐力X3、换弹速度X4
针对不同作战目的,各属性有不同的权重:
权重 | 杀伤力X1 | 作战距离X2 | 后坐力X3 | 换弹速度X4 |
作战目的a | 0.2 | 0.1 | 0.3 | 0.4 |
作战目的b | 0.25 | 0.35 | 0.2 | 0.2 |
作战目的c | 0.4 | 0.2 | 0.3 | 0.1 |
三种步枪的针对不同属性的判断矩阵为:
杀伤力X1 | 步枪A | 步枪B | 步枪C |
步枪A | 1 | 1/2 | 3 |
步枪B | 2 | 1 | 6 |
步枪C | 1/3 | 1/6 | 1 |
作战距离X2 | 步枪A | 步枪B | 步枪C |
步枪A | 1 | 1/3 | 1/4 |
步枪B | 3 | 1 | 3/4 |
步枪C | 4 | 4/3 | 1 |
后坐力X3 | 步枪A | 步枪B | 步枪C |
步枪A | 1 | 5 | 2 |
步枪B | 1/5 | 1 | 2/5 |
步枪C | 1/2 | 5/2 | 1 |
换弹速度X4 | 步枪A | 步枪B | 步枪C |
步枪A | 1 | 3 | 1/4 |
步枪B | 1/3 | 1 | 1/12 |
步枪C | 4 | 12 | 1 |
根据上述矩阵,采用最简单的算数平均法求得权重:
X1 | X2 | X3 | X4 | |
步枪A | 0.3 | 0.125 | 0.5882 | 0.1875 |
步枪B | 0.6 | 0.375 | 0.1176 | 0.0625 |
步枪C | 0.1 | 0.5 | 0.2941 | 0.75 |
根据权重矩阵,并结合不同目的对应的属性权重计算三种步枪在三种目的下的得分:
权重 | 杀伤力X1 | 作战距离X2 | 后坐力X3 | 换弹速度X4 |
作战目的a | 0.2 | 0.1 | 0.3 | 0.4 |
作战目的b | 0.25 | 0.35 | 0.2 | 0.2 |
作战目的c | 0.4 | 0.2 | 0.3 | 0.1 |
得分 | 步枪A | 步枪B | 步枪C | 最终选择 |
作战目的a | 0.32396 | 0.21778 | 0.45823 | C |
作战目的b | 0.27389 | 0.31727 | 0.40882 | C |
作战目的c | 0.34021 | 0.35653 | 0.30323 | B |