lagrange插值分段线性插值matlab代码
- 格式:doc
- 大小:636.00 KB
- 文档页数:19
Lagrange插值:x=0:3;y=[-5,-6,-1,16];n=length(x);syms q;for k=1:nfenmu=1;p=1;for j=1:nif(j~=k)fenmu=fenmu*(x(k)-x(j))p=conv(p,poly(x(j)))endendc(k,:)=p*y(k)/fenmuenda=zeros(1,n);for i=1:nfor j=1:na(i)=a(i)+c(j,i)endend输出结果:fenmu =-1p =1 -1fenmu =2p =1 -3 2fenmu =-6p =1 -6 11 -6c =0.8333 -5.0000 9.1667 -5.0000 fenmu =1p =1 0fenmu =-1p =1 -2 0fenmu =2p =1 -5 6 0c =0.8333 -5.0000 9.1667 -5.0000-3.0000 15.0000 -18.0000 0 fenmu =2p =1 0fenmu =2p =1 -1 0fenmu =-2p =1 -4 3 0c =0.8333 -5.0000 9.1667 -5.0000-3.0000 15.0000 -18.0000 00.5000 -2.0000 1.5000 0 fenmu =3p =1 0fenmu =6p =1 -1 0fenmu =6p =1 -32 0c =0.8333 -5.0000 9.1667 -5.0000-3.0000 15.0000 -18.0000 00.5000 -2.0000 1.5000 02.6667 -8.0000 5.3333 0a =0.8333 0 0 0a =-2.1667 0 0 0 a =-1.6667 0 0 0a =1 0 0 0a =1 -5 0 0a =1 10 0 0a =1 8 0 0a =1 0 0 0a =1.0000 0 9.1667 0a =1.0000 0 -8.8333 0a =1.0000 0 -7.3333 0a =1.0000 0 -2.0000 0a =1.0000 0 -2.0000 -5.0000a =1.0000 0 -2.0000 -5.0000a =1.0000 0 -2.0000 -5.0000a =1.0000 0 -2.0000 -5.0000 分段线性插值:先保存M文件:x=1:6;y=[7 16 8 25 12 24];u=5.3;delta=diff(y)./diff(x);n=length(x);for j=2:(n-1)if x(j)<uk=j;endend在command window中输入:s=u-x(k);v=y(k)+s.*delta(k)输出结果:v =15.6000解:第一种做法,用spline,共55个点,其中,54个有效首先保存你一个M文件:figure('position',get(0,'screensize'))axes('position',[0 0 1 1])[x,y] = ginput;然后在command window里输入以下内容:n = length(x);s = (1:n)';t = (1:.05:n)';u = spline(s,x,t);v = spline(s,y,t);clf resetplot(x,y,'.',u,v,'-');对应的x、y值:0.3572917 0.25361450.3572917 0.29096390.3503472 0.34036140.3461806 0.42590360.3427083 0.52710840.3253472 0.61626510.3065972 0.68734940.290625 0.75240960.2892361 0.79337350.2954861 0.7969880.3225694 0.75481930.340625 0.68493980.3690972 0.6150602 0.3864583 0.6126506 0.3899306 0.7259036 0.3927083 0.8066265 0.3920139 0.8993976 0.4024306 0.9295181 0.4239583 0.8933735 0.4239583 0.8078313 0.4295139 0.7343373 0.4315972 0.6451807 0.4440972 0.6439759 0.4565972 0.7439759 0.4704861 0.8451807 0.4767361 0.9054217 0.4961806 0.9463855 0.5086806 0.876506 0.5045139 0.8186747 0.5010417 0.7524096 0.4892361 0.6403614 0.503125 0.6295181 0.5052083 0.6271084 0.5322917 0.7090361 0.5510417 0.763253 0.5739583 0.8355422 0.5961806 0.8572289 0.5947917 0.7837349 0.5753472 0.7090361 0.5579861 0.6391566 0.5357639 0.5668675 0.5322917 0.5283133 0.5350694 0.4789157 0.565625 0.536747 0.5947917 0.5933735 0.6253472 0.610241 0.6322917 0.5728916 0.615625 0.5331325 0.6003472 0.4993976 0.5788194 0.4415663 0.559375 0.3716867 0.5295139 0.2957831 0.4975694 0.2403614 0.4711806 0.2018072 0.6607639 0.3090361第二种做法,用pchip,共52个点,全部有效首先保存一个M文件:figure('position',get(0,'screensize'))axes('position',[0 0 1 1])[x,y] = ginput;然后在command window里输入以下内容:n = length(x);s = (1:n)';t = (1:.05:n)';u = pchip (s,x,t);v = pchip (s,y,t);clf resetplot(x,y,'.',u,v,'-');对应的x、y值:0.5190972 0.84879520.5052083 0.75120480.4947917 0.67891570.5100694 0.66927710.5399306 0.73554220.5753472 0.81746990.596875 0.86204820.6190972 0.87771080.6149306 0.81385540.5878472 0.74277110.5878472 0.74277110.5635417 0.67168670.5350694 0.6030120.528125 0.5632530.528125 0.52590360.565625 0.58012050.6052083 0.62710840.634375 0.61867470.6190972 0.57168670.5878472 0.5234940.5364583 0.41265060.4961806 0.32108430.459375 0.2753012我更喜欢第一种,用spline的,这个能将之间画出弧度,而pchip更像是直接用线段将点依次连接得到的。
使用的是splinetx。
解:(a)首先保存一个M文件:n=3;xishu=2/(n-1);x=-1:xishu:1;y=1./(1+25.*x.*x);for k=1:nfenmu=1;p=1;for j=1:nif(j~=k)fenmu=fenmu*(x(k)-x(j));p=conv(p,poly(x(j)));endendc(k,:)=p*y(k)/fenmu;enda=zeros(1,n);for i=1:nfor j=1:na(i)=a(i)+c(j,i);endend然后在command window里输入以下内容:plot(x,y,'*');hold on;plot(x,y,'*');hold on;x1=-1:0.01:1;y1=0;for i=1:ny1=y1.*x1+a(i)endy2=1./(1+25.*x1.*x1);plot(x1,y1,'b');hold on;plot(x1,y2,'g');即有n=3时,图像:n=10时,图像:n=100时,图像:n=1000时,图像:可以看出,将[-1,1]做n-1等分的n个插值点,在[-0.92,1]的区间内,随着n趋近于时趋近于f(x)。
(b)先保存M文件:n=2;x=2.*rand(n)-1y=1./(1+25.*x.*x);n=n^2;%lagrangc?????¡§for k=1:nfenmu=1;p=1;for j=1:nif(j~=k)fenmu=fenmu*(x(k)-x(j));p=conv(p,poly(x(j)));endendc(k,:)=p*y(k)/fenmu;enda=zeros(1,n);for i=1:nfor j=1:na(i)=a(i)+c(j,i);endend输出结果:x =0.9150 -0.68480.9298 0.9412然后在command window里输入:plot(x,y,'*');hold on;x1=-1:0.01:1;y1=0;for i=1:ny1=y1.*x1+a(i)endy2=1./(1+25.*x1.*x1);plot(x1,y1,'b');hold on;plot(x1,y2,'g');得到以下几幅图:n=3时,x =0.4121 -0.9077 0.3897-0.9363 -0.8057 -0.3658-0.4462 0.6469 0.9004n=10时,x =Columns 1 through 7-0.3210 0.9661 -0.6578 0.7110 0.1660 -0.7845 -0.64250.9033 -0.3971 -0.9348 0.2895 -0.4964 0.8126 -0.15420.8407 0.4022 0.1224 -0.2475 -0.4191 0.7593 -0.8115-0.8946 0.3327 0.7637 -0.6182 0.2342 0.6355 0.19700.4757 0.0783 0.3384 -0.1435 -0.4694 -0.4785 -0.0582-0.4618 0.3962 -0.6191 -0.0360 0.6488 0.1887 0.3919 -0.1543 0.3331 -0.2622 -0.7588 0.9653 -0.9550 0.39980.0957 -0.6437 -0.0785 0.1790 0.4605 -0.1495 0.27710.8855 -0.7440 0.9633 -0.5476 -0.3122 -0.3746 -0.9328-0.1645 0.9982 -0.6872 -0.2308 0.1681 -0.6770 -0.8624 Columns 8 through 10-0.3608 0.2219 0.75070.0617 0.5576 0.03610.3089 -0.1531 0.8872-0.1848 -0.8184 0.27540.6400 -0.4671 0.91540.4367 -0.6927 -0.51860.9373 -0.4380 0.35220.0627 -0.1198 -0.4219-0.3497 0.0543 0.3436-0.7887 -0.0852 0.3903n=10时,数据太大,没运行出来。