当前位置:编程学习 > Matlab >>

求拉格朗日差值、牛顿插值以及三次样条插值的matlab实现,要求的是源代码。

答案:% Lagrange插值 clear clc %----------------------------- n=10; %结点个数 lb=-1; %下界 ub=1; %上界 step=0.01; %作图点步长 %----------------------------- % 原始函数图形 x0=lb:step:ub; y0=1./(1+25*x0.^2); plot(x0,y0,'r-'); hold on %----------------------------- % 插值函数 for i=1:n+1 xi(i)=lb+(ub-lb)*(i-1)/n; yi(i)=1/(1+25*xi(i)^2); end %------------------------------ count=1; for x=lb:step:ub fl=0; %-------------------------- %求出pn(xk) for k=1:n+1 up=1; dn=1; %---------------------- %求出f(xk) for i=1:n+1 if k~=i up=up*(x-xi(i)); dn=dn*(xi(k)-xi(i)); end end %---------------------- fl=fl+yi(k)*up/dn; end pn(count)=fl; %-------------------------- fi(count)=1/(1+25*x^2);%求原函数的值 count=count+1; end %------------------------------ % L插值函数图 x=lb:step:ub; plot(x,pn,'g--') %------------------------------ num=(ub-lb)/step+1; for i=1:num p_f(i)=pn(i)-fi(i); end center=fix(num/2); scale=fix(num/10); a=center-scale; b=center+scale; disp ' pn(i)-fi(i) 的值为:' p_f(a:b) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear all clc %Newton迭代法求解极小值点 %===================================== disp '几点说明:' disp '1.程序中的函数采用课本P102例3.3.2。' disp '2.只需改变所需要求的函数和初始点的值。' disp '===================================================' %===================================== %定义函数 disp '函数 f(x) 为:' syms x1 x2 f=(x1-2)^4+(x1-2)^2*x2^2+(x2+1)^2 disp '初始点的值:' x0=[1;1] %===================================== %求函数的梯度和海色阵 disp '函数f的梯度:' g=jacobian(f,[x1;x2]) disp '函数f的Hesse矩阵:' G=jacobian([g(1);g(2)],[x1,x2]) %===================================== %定义迭代的最大次数 n=10; %===================================== %一些初始值的计算 g0=subs(g,{x1,x2},{x0(1),x0(2)})'; G0=subs(G,{x1,x2},{x0(1),x0(2)}); f0=subs(f,{x1,x2},{x0(1),x0(2)}); %===================================== %迭代点集合 x和函数值F的初始化 x=zeros(2,n); F=zeros(1,n); %运用Newton方程解出下一近似值 x(:,1)=x0-inv(G0)*g0; %注:用点乘有误 A=x(:,1); F(1)=subs(f,{x1,x2},{A(1),A(2)}); %===================================== %定义误差初始值为1 deta=1; i=1; %循环用求出的近似解迭代Newton方程 %求出下一个近似解,并在规定的误差范围内 while deta>=1e-10&i<n A=x(:,i); gi=subs(g,{x1,x2},{A(1),A(2)})'; Gi=subs(G,{x1,x2},{A(1),A(2)}); i=i+1; x(:,i)=x(:,i-1)-inv(Gi)*gi; A=x(:,i); F(i)=subs(f,{x1,x2},{A(1),A(2)}); deta=abs(F(i)-F(i-1)); end format long %保留小数点后更多位数 k=(1:n+1)'; F=[f0 F]'; x=[x0,x]'; disp '=====================================================' disp '迭代的各步结果如下:' disp ' k x(k) F{x(k)}' [k x F] %===================================== %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [R,quad,err,h]=Romberg(f,a,b,n,tol) M=1; h=b-a; err=1; j=0; R=zeros(n+1,n+1); R(1,1)=h*(feval(f,a)+feval(f,b))/2; while((err>tol)&(j<n)) j=j+1; h=h/2; s=0; for p=1:M x=a+h*(2*p-1); s=s+feval(f,x); end R(j+1,1)=R(j,1)/2+h*s; M=M*2; for k=1:j R(j-k+1,k+1)=R(j-k+2,k)+(R(j-k+2,k)-R(j-k+1,k))/(4^k-1); end err=abs((R(2,j)-R(1,j))/(4^j-1)); end quad=R(1,j+1);
其他:按照算法步骤编写即可 

上一个:sars的matlab拟合代码
下一个:我想用matlab画个图,程序代码如下 x=5;k=0; while x<25 k=k+1; x=2*x+1;y=3*x; end >> plot(x,y)

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,