matlab 正交多项式,求助~Matlab关于正交多项式

相比于普通的多项式拟合,正交多项式拟合为什么可以避免结果的“病态”?

如果求精确解的话,我认为两种方式的结果应该是一样的,可是用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值