相比于普通的多项式拟合,正交多项式拟合为什么可以避免结果的“病态”?
如果求精确解的话,我认为两种方式的结果应该是一样的,可是用matlab求解时却发现两种方法所求解不同。
不过程序中确实有点为题,用subs(P,x,x0')时无法将x0设置为符号变量,否则出错,这很可能是问题所在。求解决方式?
程序如下:
%comparsion
clear;clc;close all
% x0=[0:5:5000];
% y0 = rand(1,1001);
x0=[0:5:50];
y0=[0 1.27 2.16 2.86 3.44 3.87 4.15 4.37 4.51 4.60 4.66];
j=5;%用于拟合的多项式的阶数
syms x
%part1 正交多项式
f1 = number3_4_1(x0,y0,j);
%part2 多项式最小二乘法
for i = 1:j
right(i) = sum( sym(y0) .*( sym(x0) .^i ) );
for col = 1:j+1
left(i,col) = sum( sym(x0) .^(i+col-1)) ;
end
end
right=[sum( sym(y0) ) sym(right)]';
for col = 1:j+1
left_0(1,col) = sum(sym(x0).^(col-1)) ;
end
left = [sym(left_0);sym(left)];
a = sym(left)\sym(right);
f2=sym(0);
for i=0:j
f2=sym(a(i+1))*sym(x^i)+sym(f2);
end
x_result=linspace(min(x0),max(x0),100 );
y_result1=subs(f1,x,x_result);
plot(x_result,y_result1,'k-','linewidth',2)
hold on;
y_result2=subs(f2,x,x_result);
plot(x_result,y_result2,'r:','linewidth',2)
hold on;
plot(x0,y0,'g*','linewidth',6);%原始数据
legend('正交多项式','多项式','原始数据',4)
title('对比不同的多项式拟合与正交多项式拟合的区别')
disp('正交多项式 误差')
e1=sum((sym(subs(f1,x,x0)) - y0).^2)
disp('普通方法 误差')
e2=sum( (sym(subs(f2,x,x0)) - y0).^2 )
disp('正交多项式结果-普通 结果')
f1-f2
disp('正交多项式误差-普通误差');
vpa(e1-e2,100)
function [ f ]=number3_4V3(t,y0,j)
%t为自变量,y0为因变量,j为多项式次数,返回值为一个以x为自变量的函数
syms x
n=length(t)-1;
x0=( ( t-t(1)) ./ (t(2)-t(1)) );
%计算 等距节点正交多项式系
for m=1:j
tem=sym(0);
for k=0:m;
tem = tem + (-1).^ k .*sym(C(m ,k )) .* sym(C(m+k,k)) .* sym(A(x,k)) ./ sym(A(n,k));
end
P(m) = tem;
end
P_0=1;
c=sym(subs(P,x,x0')');
for tem=0:j
if tem == 0
a0 = sum(sym(y0))./length(t);
else
a(tem) = sum(sym(y0) .* sym(c(tem,:)) )./sum(sym(c(tem,:)).^2);
end
end
f = a0.*P_0+ sum(sym(a).* sym(P) );
f = sym(subs(f,x, (x-t(1)) ./ (t(2)-t(1)) ));
输出结果为:
正交多项式 误差
e1 =
28820549865669330036715397433160276396043/13899570998423392168470997453469028188160000
普通方法 误差
e2 =
302339600107555992480375312342291427/145812302572877229550534221637877760000
正交多项式结果-普通 结果
ans =
- (2479161226123280437*x^5)/376581359950612816843364735387550000000 + (2479161226123280437*x^4)/3012650879604902534746917883100400000 - (5186546163633931896713043058946500674121610307713746483*x^3)/144174461244191106818664917310583498654719677607615064840881367798800000 + (1231759627369364964570586945966702607518781683100315183*x^2)/1922326149922548090915532230807779982062929034768200864545084903984000 - (5147997962536725204022628139908088663858936331593379753*x)/1310676920401737334715135611914395442315633432796500589462557889080000 + 42435765926320277124637336601280584101980690981210053/16019384582687900757629435256731499850524408623068340537875707533200
正交多项式误差-普通误差
ans =
-0.0000000000000001177405026299908265410470890880057401039916611644782859221968376568377074022167077503806116079734971