数学建模作业一

已知一组观测数据,如表 5.17 所示

ALT

1. 试用插值方法绘制出 x ∈ [ − 2 , 4.9 ] x \in [-2,4.9] x[2,4.9]区间内的曲线,并比较各种插值算法的优劣。

拉格朗日插值

clc, clear, close all;

x0 = [-2 : 0.3 : 4.9]';
y0 = [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]';

x = linspace(-2, 4.9, 100);
y = lagrange(x0, y0, x);

subplot(131), plot(x, y), title('拉格朗日插值');

分段线性插值

clc, clear, close all;

x0 = [-2 : 0.3 : 4.9]';
y0 = [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]';

x = linspace(-2, 4.9, 100);
y = interp1(x0, y0, x);

subplot(132), plot(x, y), title('分段线性插值');

三次样条插值

clc, clear, close all;

x0 = [-2 : 0.3 : 4.9]';
y0 = [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]';

x = linspace(-2, 4.9, 100);
y = interp1(x0, y0, x, 'spline');

subplot(133), plot(x, y), title('三次样条插值');

比较插值算法的优劣

拉格朗日插值分段线性插值三次样条插值
优点精度高,能完美拟合给定的数据点。易于实现,计算复杂度低。速度快,计算简单。在数据点范围内,线性插值准确。精度相对较高,能平滑地拟合数据点。满足指定边界条件。
缺点在数据点之外可能产生振荡。对于大量数据点,计算消耗大。精度低,可能出现不连续。在数据点之外,可能产生尖角。计算复杂度比拉格朗日插值高。对于不规则数据点,可能会产生过拟合。

alt

最近邻插值

clc, clear, close all;

x0 = [-2 : 0.3 : 4.9]';
y0 = [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]';

x = linspace(-2, 4.9, 100);
y1 = interp1(x0, y0, x, 'nearest');
y2 = interp1(x0, y0, x, 'next');
y3 = interp1(x0, y0, x, 'previous');

subplot(131), plot(x, y1), title('最近邻插值(nearest)'), hold on, subplot(132), plot(x, y2), title('最近邻插值(next)'), hold on, subplot(133), plot(x, y3), title('最近邻插值(previous)');

区别:它们在处理 x 值与 x0 中的元素完全相等时的行为略有不同。

**‘nearest’:**如果 x 中的元素与 x0 中的元素完全相等,则返回 y0 中对应于该相等元素的值。

‘next’: 与’nearest’相似,区别返回 y0 中对应于该相等元素的下一个元素的值。如果相等元素是 x0 中的最后一个元素,则返回 NaN。

‘previous’:与 ‘next’ 相似,但返回 y0 中对应于 x 中元素的前一个元素的值。如果相等元素是 x0 中的第一个元素,则返回 NaN。

alt

三次插值

clc, clear, close all;

x0 = [-2 : 0.3 : 4.9]';
y0 = [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]';

x = linspace(-2, 4.9, 100);
y1 = interp1(x0, y0, x, 'spline');
y2 = interp1(x0, y0, x, 'cubic');
y3 = interp1(x0, y0, x, 'makima');

subplot(131), plot(x, y1), title('spline'), hold on, subplot(132), plot(x, y2), title('cubic'), hold on, subplot(133), plot(x, y3), title('makima');

区别

它们之间的主要区别在于它们如何计算三次多项式系数以及它们产生的插值曲线的平滑度。

’spline‘:

使用三次样条函数来拟合数据点。样条函数是一种分段多项式函数,在每个数据点处都具有连续性,并且在连接点处具有连续的一阶和二阶导数。

通常会产生平滑的插值曲线,但可能会在数据点附近出现振荡。

’cubic‘:

使用三次多项式来拟合数据点,但不像样条函数那样强制执行连续性条件。

通常比 spline 方法产生更不平滑的曲线,但在数据点附近可能出现更少的振荡。

’makima‘:

一种改进的三次插值方法,它使用一种称为 “modified Akima interpolation” 的算法来计算三次多项式系数。

通常比 spline 和 cubic 方法产生更平滑的曲线,并且在数据点附近出现振荡的可能性更小。

alt

分段三次 Hermite 插值多项式

是一种形状保持插值方法,用于根据一组已知数据点创建平滑曲线。

PCHIP 的工作原理是将数据点分成多个段,并在每个段上使用三次 Hermite 多项式来拟合数据。Hermite 多项式是一种特殊的插值多项式,它不仅考虑数据点的值,还考虑数据点处的一阶导数(斜率)。

通过使用 Hermite 多项式,PCHIP 可以确保插值曲线在每个数据点处都具有连续性,并且在连接点处具有连续的一阶导数。这使得 PCHIP 能够产生比其他插值方法(例如线性插值或样条插值)更平滑的曲线。

此外,PCHIP 是一种形状保持插值方法,这意味着插值曲线不会超过数据点的范围。这使得 PCHIP 非常适合插值单调数据或有尖锐峰值或谷值的数据。

PCHIP 的优点:

  • 产生平滑的插值曲线。

  • 保持数据的形状。

  • 适用于单调数据或有尖锐峰值或谷值的数据。

PCHIP 的缺点:

  • 比其他插值方法(例如线性插值)计算量更大。

  • 可能无法准确地捕捉数据的某些特征,例如高频振荡。

    clc, clear, close all;
    
    x0 = [-2 : 0.3 : 4.9]';
    y0 = [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]';
    
    x = linspace(-2, 4.9, 100);
    y = interp1(x0, y0, x, 'pchip');
    
    subplot(111), plot(x, y), title('分段三次 Hermite 插值多项式');
    

    alt

    牛顿插值(Newton Interpolation)

    牛顿插值法使用一系列多项式来逼近目标函数。它从一个常数多项式开始,然后逐步添加更高阶的多项式项,直到达到所需的精度。每个多项式项都使用称为“差商”的系数进行加权,差商是根据已知数据点计算的。

    clc, clear, close all;
    
    x0 = [-2 : 0.3 : 4.9]';
    y0 = [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 = polyfit(x0, y0, length(x0) - 1);
    
    x = linspace(-2, 4.9, 100);
    y = polyval(f, x);
    
    subplot(111), plot(x, y), title('牛顿插值');
    

    alt

2. 试用最小二乘多项式拟合方法拟合表中数据,选择一个能较好拟合数据点的多项式的阶次,给出相应多项式的系数和剩余标准差。

clc, clear, close all;

x0 = [-2 : 0.3 : 4.9]';
y0 = [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]';

x = linspace(-2, 4.9, 100);

for i = 1 : 4
	s = ['poly', int2str(i)];
	[fx, st] = fit(x0, y0, s);
end;

alt

s = 'poly1'
fx = 线性模型 Poly1:
     fx(x) = p1*x + p2
     系数(置信边界为 0.95):
       p1 = -0.01794 (-0.02519, -0.0107)
       p2 = 0.1443 (0.1259, 0.1626)
st = 包含以下字段的 struct:
           sse: 0.0278
       rsquare: 0.5453
           dfe: 22
    adjrsquare: 0.5247
          rmse: 0.0355
          
s = 'poly2'
fx = 线性模型 Poly2:
     fx(x) = p1*x^2 + p2*x + p3
     系数(置信边界为 0.95):
       p1 = -0.008212 (-0.009703, -0.006721)
       p2 = 0.005869 (0.0007391, 0.011)
       p3 = 0.1624 (0.1547, 0.1701)
st = 包含以下字段的 struct:
           sse: 0.0038
       rsquare: 0.9373
           dfe: 21
    adjrsquare: 0.9313
          rmse: 0.0135

s = 'poly3'
fx = 线性模型 Poly3:
     fx(x) = p1*x^3 + p2*x^2 + p3*x + p4
     系数(置信边界为 95%):
       p1 = 0.001718 (0.001448, 0.001989)
       p2 = -0.01569 (-0.01696, -0.01441)
       p3 = 0.0034 (0.001669, 0.005131)
       p4 = 0.1765 (0.1731, 0.1798)

st = 包含以下字段的 struct:
           sse: 3.9219e-04
       rsquare: 0.9936
           dfe: 20
    adjrsquare: 0.9926
          rmse: 0.0044

s = 'poly4'
fx = 线性模型 Poly4:
     fx(x) = p1*x^4 + p2*x^3 + p3*x^2 + p4*x + p5
     系数(置信边界为 95%):
       p1 = 0.0002859 (0.0002124, 0.0003594)
       p2 = 6.035e-05 (-0.0003859, 0.0005066)
       p3 = -0.01523 (-0.01586, -0.0146)
       p4 = 0.009054 (0.007374, 0.01073)
       p5 = 0.1751 (0.1735, 0.1768)
st = 包含以下字段的 struct:
           sse: 8.7435e-05
       rsquare: 0.9986
           dfe: 19
    adjrsquare: 0.9983
          rmse: 0.0021

综上所述,四次多项式拟合能够较好拟合数据点,剩余标准差为0.0021,相应多项式的系数为:

p1 = 0.0002859 
p2 = 6.035e-05
p3 = -0.01523
p4 = 0.009054
p5 = 0.1751
偏最小二乘算法
clc, clear, close all;

x0 = [-2 : 0.3 : 4.9]';
y0 = [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]';

ncomp = 1;
[XL, YL, XS, YS, BETA, PCTVAR, MSE] = plsregress(x0, y0, ncomp);
yfit = [ones(size(x0, 1), 1) x0] * BETA;

subplot(111), plot(x0, y0, 'bo', x0, yfit, 'r-'), legend('原始数据', '拟合曲线'),title('偏最小二乘拟合');

alt

3. 若表中数据满足正态分布函数 f ( x ) = 1 2 π σ e − ( x − μ ) 2 2 σ 2 f(x) = \frac{1}{\sqrt{2\pi}\sigma}e^{\frac{-(x - \mu)^2}{2\sigma^2}} f(x)=2π σ1e2σ2(xμ)2,试用最小二乘非线性拟合方法求出分布参数 μ , σ \mu,\sigma μ,σ值,并利用所求参数值绘制拟合曲线,观察拟合效果。

clc, clear, close all;

x0 = [-2 : 0.3 : 4.9]';
y0 = [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]';

x = linspace(-2, 4.9, 100);

ft = fittype('1/(sqrt(2 * pi) * s) * exp(-(x - mu) ^2/(2 * s ^2))');
[f, st] = fit(x0, y0, ft, 'StartPoint', rand(1,2));

subplot(122), plot(x, f(x)), title('拟合的正态分布密度函数')

alt

其中 μ = 0.3483 , σ = 2.2349 \mu = 0.3483,\sigma = 2.2349 μ=0.3483,σ=2.2349

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

鷸鰥

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

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

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

打赏作者

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

抵扣说明:

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

余额充值