function f=\%Newdon插值多项式 %f=InterpNewdon(x,y,x0)
%f:插值多项式或者是插值多项式在x0处的值 %x:节点 %y:函数值 %x0:某一测试点 % %调用格式
%f=InterpNewdon(x,y) 返回插值多项式
%f=InterpNewdon(x,y,x0) 返回插值多项式在x0点的值 %应用举例:
%x=[1 2 3 4 5];y=[1 4 7 8 6];x0=6; %f=InterpNewdon(x,y) %f=InterpNewdon(x,y,x0)
if length(x)==length(y) n=\else
disp('节点个数和函数值个数不同!') f=' '; return; end
A=zeros(n);%初始化差商矩阵 for i=\
A(i,1)=y(i);%差商矩阵的第一列是函数值 end
%计算差商矩阵
%差商矩阵中对角线上的元素为Newdon插值多项式的系数 for j=\ for i=\
A(i,j)=(A(i,j-1)-A(i-1,j-1))/(x(i)-x(i-j+1)); end end
%求Newdon插值多项式 p=zeros(1,n); for i=\
p1=A(i,i);%差商矩阵对角线上的元素就是Newdon插值多项式的系数 for j=\
p1=conv(p1,[1 -x(j)]);%计算Newdon插值多项式的基项 end
p1=[zeros(1,n-i),p1];%向量相加,维数必须相同。把向量的元素补齐 p=\end
if nargin==3
f=\计算插值多项式在x0处的值 else
f=\把插值多项式的向量形式转化为插值多项式的符号形式 end
5、基本Guass消去法求解线性方程组
function x=\%基本Guass消去法求解线性方程组Ax=b %x=EqtsBasicGuass(A,b) %x:解向量,列向量 %A:线性方程组的矩阵 %b:列向量 %
%应用举例:
%A=[2 2 3;4 7 7;-2 4 5]; b=[3;1;-7]; %x=EqtsBasicGuass(A,b)
%检查输入参数
if size(A,1) ~= size(b,1) disp('输入参数有误!'); x=' '; return; end %(A|b) A=[A b];
%消去过程 n=size(A,1); l=zeros(n); for k=\ for i=\
l(i,k)=A(i,k)/A(k,k); end
for i=\ for j=\
A(i,j)=A(i,j)-l(i,k)*A(k,j); end for j=\ A(i,j)=0; end end end
%回代过程 x=zeros(n,1);
x(n)=A(n,n+1)/A(n,n); for i=\ y=\ for j=\ y=y+A(i,j)*x(j); end
x(i)=(A(i,n+1)-y)/A(i,i); end return;
6、三角分解法求解线性方程组
function x=\%Doolittle分解法求解线性方程组Ax=b %x=EqtsDoolittleLU(A,b) %x:解向量,列向量 %A:线性方程组的矩阵 %b:列向量 %
%应用举例:
%A=[6 2 1 -1;2 4 1 0;1 1 4 -1;-1 0 -1 3];b=[6;-1;5;-5]; %x=EqtsDoolittleLU(A,b)
%检查输入参数
if size(A,1) ~= size(b,1) disp('输入参数有误!'); x=' '; return; end
%分解
%把L和U的元素存储在A的相应位置上 n=length(b); for k=\ for j=\ z=0;
for r=\
z=\ end
A(k,j)=A(k,j)-z; end
for i=\ z=0;
for r=\
z=\ end
A(i,k)=(A(i,k)-z)/A(k,k); end end %求解
x=zeros(size(b)); for i=\ z=\ for k=\ z=z+A(i,k)*x(k); end x(i)=b(i)-z; end
for i=\ z=\ for k=\ z=z+A(i,k)*x(k); end
x(i)=(x(i)-z)/A(i,i); end return
7、追赶法求解三对角线性方程组
function x=\%追赶法求解三对角线性方程组Ax=b %x=EqtsForwardAndBackward(L,D,U,b) %x:三对角线性方程组的解 %L:三对角矩阵的下对角线,行向量 %D:三对角矩阵的对角线,行向量 %U:三对角矩阵的上对角线,行向量 %b:线性方程组Ax=b中的b,列向量 %
%应用举例:
%L=[-1 -2 -3];D=[2 3 4 5];U=[-1 -2 -3];b=[6 1 -2 1]'; %x=EqtsForwardAndBackward(L,D,U,b)
%检查参数的输入是否正确 n=length(D);m=length(b); n1=length(L);n2=length(U);
if n-n1 ~= 1 || n-n2 ~= 1 || n ~= m disp('输入参数有误!') x=' '; return; end
%追的过程 for i=\
L(i-1)=L(i-1)/D(i-1); D(i)=D(i)-L(i-1)*U(i-1); end
x=zeros(n,1); x(1)=b(1); for i=\
x(i)=b(i)-L(i-1)*x(i-1); end
%赶的过程 x(n)=x(n)/D(n); for i=\
x(i)=(x(i)-U(i)*x(i+1))/D(i); end return;