步骤2: 代入高斯-赛德尔的矩阵迭代公式x0迭代,得到解
四、重要标识符说明
A为方程组的系数矩阵 b为方程组的常数向量 X0为迭代初值 Eps为误差限
T为最大迭代次数
五、程序运行实例
六、源程序
function x=GS(A,b,x0,eps,t) if nargin==0;
A=[-4 1 1 1;1 -4 1 1;1 1 -4 1;1 1 1 -4]; b=[1 1 1 1 ]'; x0=[0 0 0 0]'; eps=1e-6; m=200;
elseif nargin==3; eps=1e-6; m=200;
elseif nargin<3
error('输入有误'); return;
elseif nargin==5 m=t; end
D=diag(diag(A));
10
L=-tril(A,-1); U=-triu(A,1); B=(D-L)\\U; f=(D-L)\\b; x=B*x0+f; n=1;
while norm(x-x0)>=eps x0=x; x=B*x0+f; n=n+1; if(n>=m)
disp('迭代次数过多,可能不收敛'); return; end; end
七、个人实验总结
高斯赛德尔是雅克比的一种变形,用新数据代替旧数据,加快了迭代速度。
(四)实验题目:拉格朗日插值多项式
一、程序功能
用拉格朗日插值多项式的方法求xi的近似解
二、实验算例选择 xk Sinxk 0.5 0.7 0.9 1.1 1.3 1.5 1.7 1.9 0.4794 0.6442 0.7833 0.8912 0.9636 0.9975 0.9917 0.9463 求函数x在0.6 0.8 1.0处的近似解 11
三、算法
步骤1: 给定xi的值,计算dxnum=xi-X,即xi-x(1),xi-x(2),... dxden=x(i)-x(1:n)即xi-xk...
步骤2: 将步一代入计算公式Pn(x)=sinX0*L0(x)+...+ sinXn*Ln(x) 步骤3: 计算结果
四、重要标识符说明
X代表函数中的自变量
Y代表在X作用下的因变量 Xi是插值点 Prod是连乘函数
五、程序运行实例
六、源程序
X=[0.5 0.7 0.9 1.1 1.3 1.5 1.7 1.9];
Y=[0.4794 0.6442 0.7833 0.8912 0.9636 0.9975 0.9917 0.9463]; xi=0.8;
n=length(X);
L=zeros(size(Y)); for i=1:n disp(i); dxnum=xi-X;
dxden=X(i)-X(1:n); for k=1:n if i==k disp(k) dxnum(i)=1; dxden(i)=1;
12
lnum=prod(dxnum(1:n)); lden=prod(dxden(1:n)); L(i)=lnum/lden end end end
yi=sum(Y.*L)
(四)实验题目:牛顿差值多项式
一、程序功能
用牛顿插值多项式的方法求xi的近似解
二、实验算例选择 xk Sinxk 0.5 0.7 0.9 1.1 1.3 1.5 1.7 1.9 0.4794 0.6442 0.7833 0.8912 0.9636 0.9975 0.9917 0.9463 求函数x在0.6 0.8 1.0处的近似解
三、算法
步骤1:计算dxnum=xi-X,即xi-x(1),xi-x(2),... 步骤2: 构造差商表即D(i,j)
步骤3: 构造一个七次牛顿插值多项式,计算出结果
四、重要标识符说明
Xi是函数中的自变量
Y代表在X作用下的因变量 X是插值点
Prod 连乘函数
Format long 定义数据格式,使结果更精确
五、程序运行实例
13
六、源程序
function newInt clc; clear;
format long;
Xi=[0.5 0.7 0.9 1.1 1.3 1.5 1.7 1.9];
Y=[0.4794 0.6442 0.7833 0.8912 0.9636 0.9975 0.9917 0.9463]; x=0.8; dx=x-Xi;
n=length(Xi); yi(1)=Y(1); D(:,1)=Y(:); for j=2:n for i=j:n
D(i,j)=(D(i,j-1)-D(i-1,j-1))/(Xi(i)-Xi(i-j+1)); end
yi(j)=D(j,j)*prod(dx(1:j-1)); end
Pn=sum(yi); disp(Pn);
七、个人实验总结
拉格朗日插值多项式形式对称,计算较方便,但一旦有更新数据就必须重新计算。而牛顿插值就算增加节点也不需重新计算。
14