今天我们一起学习一下参数拟合问题,这一问题在我们日常学习生活中是很常见的。在初中的时候我们经常碰到这样一个问题,已知两个点(x1,y1)和(x2,y2)让我们求出一条过这两点的曲线y=kx+b。在这个问题中我们碰到了两个参数k 和b的求解问题,我们回顾一下初中的解决方案:
1.首先我们将两个点带入,得到
y1=k*x1+b
y2=k*x2+b
2.我们通过求解方程得出k 和b
这一个思路完整的叙述了参数拟合的整个过程,事实上,对于该问题我们只是希望的找到一条直线,使他到这两个点的距离误差最短。通过建立评价函数对各参数求偏导令其为零的可得到所需要的两个方程
y1=k*x1+b
y2=k*x2+b
在高中我们计算圆参数,椭圆参数以及回归求系数等这些均是一个典型的参数拟合问题,再到大学项目中的系统参数辨识以及复杂函数拟合等
对于这一问题 我们matlab 怎么解决那
我们给出两种思路
一.通过给定的函数直接参数拟合
%已知函数形式---多项式等给定的简单函数形式
x=[1 3 5 8 9];
y=[2 5 7 10 13];
%已知函数形式为y=k*x+b
coeff=polyfit(x,y,1);
k=coeff(1);b=coeff(2);
二.通过设置目标函数求解---原理就是优化算法迭代求解
目标函数:
function err=objfun(x,y,p)
%目标函数
%找到一条曲线是的到目标曲线最小 err=sum((y-yi)^2)
err1=p(1)*x+p(2)-y;
err=err1*err1';
end
主程序调用目标函数
x=[1 3 5 8 9];
y=[2 5 7 10 13];
loss=@(p)objfun(x,y,p) %带入已有参数
p_initial=[0 0];%定义优化工具箱迭代初值
[p,fval]=fmincon(loss,p_initial);
k1=p(1);b1=p(2);
当然对于复杂的问题,方法二问题解答精度受限于初值的影响,通常可通过设置数据集穷举参数作为初值或者定义目标函数优化参数初值进一步解决拟合问题
对于日常科研过程中,要主要识别拟合问题:
1. 在信号处理方面,给出传递函数让你求参数:该问题只需要将传递函数进行变换成差分形式,再结合方式2求解。
2. 给出已知数据,通过该数据进行预测,实际上该问题也可以从拟合的角度出发找到当前数据最接近的函数形式,在通过该形式的函数带入全新的数值。