函数逼近方法

12 篇文章 1 订阅

0 前言

    函数逼近函数插值并非同一概念,其异同点如下:

  • 相同点

    二者都是对实际用的复杂函数构造一个既能反映函数本身的特性,又便于计算的简单函数,近似代替原来的函数[15]P137。

  • 不同点

(1)函数插值

    函数插值是对一组离散点(xi, f(xi))(i = 0, 1, 2,...n),选定一个便于计算的简单函数形式p(x),满足p(xi) = f(xi)(i = 0, 1, 2, ..., n),由此确定函数p(x)作为f(x)的近似函数,详见《函数插值方法》。

(2)函数逼近

    函数逼近是对实际中的复杂函数f(x),构造一个简单函数p(x),要求其误差从整体上在某种度量意义下最小。

  • 应用领域

    函数逼近,比较普遍的应用就是离散数据曲线拟合。下面将重点讨论如何通过Matlab来实现曲线拟合。

1 二维曲线拟合

    有两种思路:1)对应已知的x、y数据,通过拟合找到一个标准曲线公式,这条曲线尽可能的经过已知的x、y坐标点;2)对于已知的x、y坐标,通过插值的方法确定它们之间的坐标。下面将分别对这两种方法进行举例分析。

1.1 多项式拟合——polyfit

1.1.1 代码及效果 

    参考资料[1][5]介绍了使用polyfit对二维离散点进行多项式拟合的方法。拟合得到的结果是多项式各项的系数(保存在下面代码中的p变量中),具体代码如下所示。

clear
clc
%% 原始散点
t = [1 : 16];
y = [4 6.4 8 8.4 9 9.28 9.5 9.7 9.86 10.2 10.32 10.42 10.5 10.55 10.58 10.6];
plot(t, y, 'o');
%% 二次多项式拟合
p = polyfit(t, y, 2);
hold on
plot(t, polyval(p, t), 'r');  % 画多项式图像

%% 三次多项式拟合
p = polyfit(t, y, 3);
hold on
plot(t, polyval(p, t), 'k');  % 画多项式图像

%% 四次多项式拟合
p = polyfit(t, y, 4);
hold on
plot(t, polyval(p, t), 'm');  % 画多项式图像

%% 十次多项式拟合
p = polyfit(t, y, 10);
hold on
plot(t, polyval(p, t), 'c');  % 画多项式图像

%% 图例
legend('原始散点', '二次多项式拟合', '三次多项式拟合',  ...
       '四次多项式拟合', '十次多项式拟合')

    拟合效果如下图,

图1

    根据上图的结果可知,多项式的次数越高,拟合出来的曲线所经过的位置就越接近原离散点。

1.1.2 局限

    上述拟合方法只能拟合xy坐标都是一一对应的数据,如果一个x坐标对应有多个y坐标,则拟合效果非常差:

图2

1.2 非线性拟合lsqcurvefit、nlinfit

    参考资料[2]介绍了使用Maltab中的lsqcurvefitnlinfit这两个函数来进行曲线拟合,主要过程是:自定义一个曲线函数,其中的参数/系数未知(如y=a*sin(x)*exp(x)-b/log(x)中的a和b系数),通过利用已知的x、y数据进行拟合得到a、b的值,如下所示:

%% 原数据
x=2:10;
y=8*sin(x).*exp(x)-12./log(x);
a=[1 2];

%% 待拟合公式
f=@(a,x)a(1)*sin(x).*exp(x)-a(2)./log(x);

%% 第一种方法使用lsqcurvefit
lsq_fit = lsqcurvefit(f,a,x,y);

%% 第二种方法使用nlinfit
nlin_fit = nlinfit(x,y,f,a);

    上述拟合得到的结果都是[8 12],和原数据中给公式指定的参数一致。

1.3 Spline插值

    已知道少量的x、y坐标,可以通过插值的方式确定这些坐标之间的其余坐标。

1.3.1 实现和效果

    代码如下所示。

x = 0:10;
y = sin(x);
xx = 0:.25:10;
yy = spline(x, y, xx);
plot(x, y, 'o', xx, yy, '-r')
legend('原始点','插值结果')

    上述代码的运行结果如下:

图3

1.3.2 局限

    如果x、y坐标的分布像图2的蓝色离散点那样(x坐标并非递增的,一个x坐标有可能对应2个y坐标),插值提示错误:

图4

2 三维曲线拟合

2.1 lsqcurvefit/nlinfit

    根据参考资料[2]的说明,lsqcurvefitnlinfit不仅可以用于一元函数的拟合(如上述1.2小节所示),还可以对多元函数进行拟合,也就是三维拟合。例如对z=a*(exp(y)+1)-sin(x)*b进行拟合,确定参数ab,代码如下:

%% 原数据
x=2:10;
y=10*sin(x)./log(x);
z=4.5*(exp(y)+1)-sin(x)*13.8;

%% 待拟合公式
f=@(a,x)a(1)*(exp(x(2,:))+1)-sin(x(1,:))*a(2);

%% 第一种方法使用lsqcurvefit
lsqcurvefit(f,[1 2],[x;y],z) %注意这里面的[x;y],这里的[1 2]表示我们设置f函数里的初始值a(1)=1,,a(2)=2

%% 第二种方法使用nlinfit
nlinfit([x;y],z,f,[1 2])

    拟合结果如下所示:

图5

2.2 sftool

    根据参考资料[3]的提示,我们还可以使用GUI工具sftool来完成这个任务。

参考资料

[1]Matlab——多项式拟合

[2]非线性拟合lsqcurvefit、nlinfit  

[3]matlab多项式拟合

[4]曲线拟和函数lsqcurvefit&nlinfit

[5]MATLAB曲线拟合

[6]曲线拟合

[7]MATLAB多项式函数拟合和曲线拟合

[8]最小二乘法与曲线拟合

[9]Matlab Spline 三次样条插值多项式表达式问题

[10]Matlab样条工具箱(Spline ToolBox)与曲线拟合

[11]三维离散点进行曲线拟合 

[12]请问将一批离散的点(二维平面上)拟合为曲线目前有哪些比较新的方法?

[13]曲线拟合 

[14]已知三个离散点,如果拟合曲线?

[15]计算方法(第2版),电子工业出版社

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

OneSea

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

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

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

打赏作者

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

抵扣说明:

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

余额充值