没有对xx做数据归一化,而且有些地方有错,改成这样了
function [p,a,F]=Legendre(xx,yy,w,n)
%xx为拟合的横坐标数据
%yy为拟合的纵坐标数据
%w为权函数,可为数据出现的次数
%n为要拟合的最高次数,最高次数小于横坐标个数
if n>=length(xx)
disp('n过大,超出规定');
p=0;
return;
end
syms x;
xx=(xx*2-(max(xx)+min(xx)))/(max(xx)-min(xx));%归一化到[-1,1]
p=cell(1,n+1); %存放勒让德多项式函数
a=zeros(1,n+1); %系数a1 a2 a3...
%求解勒让德多项式
p(1)={1+0*x};
p(2)={x};
for i=2:n
p(i+1)={((2*i+1)*x*p{i}-i*p{i-1})/(i+1)};
end
%求解系数a
for k=1:n+1
temp1=0;
temp2=0;
for i=1:length(xx)
temp1=temp1+(w(i)*yy(i)*polyval(sym2poly(p{k}),xx(i)));
temp2=temp2+(w(i)*polyval(sym2poly(p{k}),xx(i))^2);
end
a(k)=temp1/temp2;
end
%求最终多项式
F=0;
for i=1:n+1
F=F+a(i)*p{i};
end
F=inline(F);
plot(xx,yy,'-*');hold on;
YY=F(xx); %多项式在各数据的拟合值
plot(xx,YY,'-..');hold on;
N=0;
for i=1:length(xx)
N=N+(YY(i)-yy(i))^2; %平方误差的判断
end
end