MATLAB多项式及多项式拟合

多项式均表示为数组形式,数组元素为多项式降幂系数

1.      polyval函数

求多项式在某一点或某几个点的值.

p = [1,1,1];%x^2+x+1

x = [-1,0,1];y = polyval(p,x);

另外求函数在某一点或某几个点的值可以用函数feval.

x = [-1,0,1];

y = feval(@(x)exp(x),x);%注意用的乘法和乘法都改用.运算符


2.      roots函数

求多项式的零点.

p = [1,-3,2,0];x0 = roots(p);


3.      polyfit函数

用多项式拟合一组数据,返回多项式降幂系数.

xa = [0.1 0.2 0.15 0 -0.2 0.3];ya = [0.950.84 0.86 1.06 1.50 0.72];p = polyfit(xa,ya,3);

上述代码是对xa和ya进行2次多项式拟合.


如何找到最佳的拟合次数?

定义误差,以不同的多项式次数进行拟合,并求出对应的误差,找到误差最小的拟合即可.如下是对数组xa和ya进行拟合的代码,尝试了多项式拟合的次数分别为1~4(拟合次数太高可能出现龙格现象).

xa = [0.1 0.2 0.15 0 -0.2 0.3 -0.1 ];
ya = [0.95 0.84 0.86 1.06 1.50 0.72 1.0];


plot(xa,ya,'r*');
hold on;


err0 = 9999999;


syms x;
for k=1:4
    p = polyfit(xa,ya,k);
    y = 0;
    for i=1:k+1
        y = y + p(i) * x^(k-i+1);
    end
    xb = min(xa):0.01:max(xa);
    yb = subs(y,x,xb);
    plot(xb,yb);
    hold on;
    
    new_ya = subs(y,x,xa);
    n = length(xa);
    
    errk = 0;
    errk = errk + sum(abs(new_ya-ya));
    if errk < err0
        err0 = errk;
        remember = k;
    end
end


pause;


hold off;


plot(xa,ya,'r*');
hold on;


p = polyfit(xa,ya,remember);
y = 0;
for i=1:k+1
    y = y + p(i) * x^(k-i+1);
end
vpa(y,4)
xb = min(xa):0.01:max(xa);
yb = subs(y,x,xb);
plot(xb,yb);

在命令窗口或保存为m脚本文件运行上述代码,会看到一个图形出现,是次数分别为1~4的拟合效果图,按任意键,会看到最佳拟合的效果图.

原文地址:https://www.cnblogs.com/tensory/p/6590788.html