数学建模-插值算法、拟合算法

一维插值问题:构造函数 y=f(x),使得f(x)过所有节点,求f(x^{*})即可得到y*

插值和拟合的区别

插值算法中,得到的多项式f(x)要经过所有样本点。但是如果样本点太多,那么这个多项式次数过高,会造成龙格现象。

尽管我们可以选择分段的方法避免这种现象,但是更多时候我们更倾向于得到一个确定的曲线,尽管这条曲线不能经过每一个样本点,但只要保证误差足够小即可(最小损失函数),这就是拟合的思想。(拟合的结果是得到一个确定的曲线)

举一个小例子

数学建模-插值算法、拟合算法_第1张图片

确定拟合曲线

我们可以设定拟合曲线为y=kx+b ,(k和b取何值时,拟合曲线最为接近)

这里引入最小二乘法进行解释

第一种定义:y\hat{}_{i}=kx_{i}+b  ,  k\hat{}, b\hat{}=argmin(\left | y_{i}- y\hat{}_{i}\right |)

第一种定义:y\hat{}_{i}=kx_{i}+b  ,  k\hat{}, b\hat{}=argmin((y_{i}- y\hat{}_{i})^{2})

第一种定义有绝对值,不容易求导,因此计算比较复杂。
所以我们往往使用第二种定义,这也正是最小二乘的思想。
为什么不用四次方?
(1)避免极端数据对拟合曲线的影响。
(2)最小二乘法得到的结果和MLE极大似然估计一致。
不用奇数次方的原因:误差会正负相抵。

最小二乘法求解:

数学建模-插值算法、拟合算法_第2张图片

 求解代码:

clear;clc
load  data1
plot(x,y,'o')
% 给x和y轴加上标签
xlabel('x的值')
ylabel('y的值')
n = size(x,1);
k = (n*sum(x.*y)-sum(x)*sum(y))/(n*sum(x.*x)-sum(x)*sum(x))
b = (sum(x.*x)*sum(y)-sum(x)*sum(x.*y))/(n*sum(x.*x)-sum(x)*sum(x))
hold on % 继续在之前的图形上来画图形
grid on % 显示网格线

如何评价拟合的好坏

数学建模-插值算法、拟合算法_第3张图片

拟合曲线工具箱的调用

数学建模-插值算法、拟合算法_第4张图片

 几个常用的随机生成函数

% (1)randi : 产生均匀分布的随机整数(i = int)  
%产生一个1至10之间的随机整数矩阵,大小为2x5;
s1 = randi(10,2,5)
%产生一个-5至5之间的随机整数矩阵,大小为1x10;
s2 = randi([-5,5],1,10)

%  (2) rand: 产生0至1之间均匀分布的随机数
%产生一个0至1之间的随机矩阵,大小为1x5;
s3 = rand(1,5)
%产生一个a至b之间的随机矩阵,大小为1x5;  % a + (b-a) * rand(1,5); 如:a,b = 2,5
s4= 2 + (5-2) * rand(1,5)

% (3)normrnd:产生正态分布的随机数
%产生一个均值为0,标准差(方差开根号)为2的正态分布的随机矩阵,大小为3x4;
s5 = normrnd(0,2,3,4)

% (4)roundn—任意位置四舍五入
% 0个位 1十位  2百位 -1小数点后一位  
a = 3.1415
roundn(a,-2)    % ans   =  3.1400
roundn(a,2)      % ans   =  0
a =31415
roundn(a,2)   % ans  = 31400
roundn(5.5,0)  %6
roundn(5.5,1) %10

你可能感兴趣的:(算法)