数值计算作业.docx
《数值计算作业.docx》由会员分享,可在线阅读,更多相关《数值计算作业.docx(21页珍藏版)》请在冰点文库上搜索。
数值计算作业
数值计算
作业1:
方程求根的二分法
第一步:
在MATLAB软件中,建立一个实现二分法的MATLAB函数文件xy01.m如下:
function[x_star,k]=xy01(fun,a,b,e)
ifnargin<4;end
fa=feval(fun,a);fb=feval(fun,b);
iffa*fb>0x_star=[fa,fb];k=0;return;end
k=1;
whileabs(b-a)/2>e
x=(a+b)/2;fx=feval(fun,x);
iffx*fa<0
b=x;fb=fx;
else
a=x;fa=fx;
end
k=k+1;
end
x_star=(a+b)/2;
第二步:
(1)在MATLAB命令窗口求解方程sinx+9x-2=0在自变量区间[0,1]上的近似实根,并使误差不超过
。
输入并得到结果如下图
即结果为0.1997,二分次数为11次。
(2)改变输入参数,计算误差不超过
的近似实根,并给出二分的次数,输入并得到结果如下图:
即结果为0.2001,二分次数为35次。
实验分析与结论:
由上面二分法的实验结果,我们可以得出这样的结论:
二分法要循环k=11次,才能达到精度为
的要求。
要循环35次,才能达到精度为
的要求。
作业2:
方程求根的迭代法
第一步:
在MATLAB软件中,建立一个实现二分法的MATLAB函数文件xy02.m如下:
function[z,k]=xy02(fun,x0,ep,Nmax)
ifnargin<4
Nmax=500;
end
ifnargin<3
ep=1e-5;
end
x=x0;
x0=x+2*ep;
k=0;
whileabs(x0-x)>ep&kx0=x;
x=feval(fun,x0)
k=k+1
end
z=x;
ifk==Nmaxwaring;
end
第二步:
(1)在MATLAB命令窗口求解方程sinx+9x-2=0在自变量区间[0,1]上的近似实根,并使误差不超过
。
输入并得到结果如下图:
即结果为0.2002,循环次数为4次。
(2)精度为
时输入命令:
得到结果为
即结果为0.2001,循环12次。
作业3:
应用牛顿切线法求方程的根
第一步:
在MATLAB软件中,建立一个实现二分法的MATLAB函数文件xy03.m如下:
function[z,k]=xy03(fname,dfname,x0,ep,Nmax)
ifnargin<5
Nmax=500;
end
ifnargin<4
ep=1e-5;
end
x=x0;
x0=x+2*ep;
k=0;
whileabs(x0-x)>ep&kk=k+1
x0=x;
x=x0-feval(fname,x0)/feval(dfname,x0);
end
z=x;
ifk==Nmaxwaring;
end
(1)精度为
,输入命令并得到结果如下图:
即结果为0.2001,迭代3次。
(2)精度为
,输入命令并得到结果如下图:
即结果为0.2001,迭代4次。
作业4:
应用迭代法解线性方程组
第一步:
在MATLAB软件中,建立一个实现二分法的MATLAB函数文件xy05.m如下:
function[x,k]=xy05(A,b,x0,ep,Nmax)
n=length(A);k=0;
ifnargin<5Nmax=500;end
ifnargin<4ep=1e-5;end
ifnargin<3x0=zeros(n,1);y=zeros(n,1);end
x=x0';x0=x+2*ep;
whilenorm(x0-x,inf)>ep&kfori=1:
n
y(i)=b(i);
forj=1:
n
ifj~=i
y(i)=y(i)-A(i,j)*x0(j);
end
end
ifabs(A(i,i))<1e-10|k==Nmax
warning('已迭代上限次数')
return
end
y(i)=y(i)/A(i,i);
end
x=y;
end
输入命令并得到结果如下图:
编写高斯—赛德尔迭代法求解线性方程组的程序如下:
function[x,k]=xy06(A,b,x0,ep,Nmax)
n=length(b)
ifnargin<5Nmax=500;end
ifnargin<4ep=1e-5;end
ifnargin<3x0=zeros(n,1);end
x0=sparse(x0);b=sparse(b);A=sparse(A);
x=x0;x0=x+2*ep;x0=sparse(x0);k=0;A1=tril(A);iA1=inv(A1);
whilenorm(x0-x,'inf')>ep&kx0=x;x=-iA1*(A-A1)*x0+iA1*b;
end
x=full(x);ifk==Nmaxwarming('已迭代上限次数');end
作业5:
牛顿插值法
第一步:
在MATLAB软件中,建立一个实现二分法的MATLAB函数文件xy08.m如下:
functionyi=xy08(x,y,xi)
n=length(x);
m=length(y);
ifn~=m
error;
return;
end
Y=zeros(n);
Y(:
1)=y';
fork=1:
n-1
fori=1:
n-k
ifabs(x(i+k)-x(i))error;
return;
end
Y(i,k+1)=(Y(i+1,k)-Y(i,k))/(x(i+k)-x(i));
end
end
yi=0;
fori=1:
n
z=1;
fork=1:
i-1
z=z.*(xi-x(k));
end
yi=yi+Y(1,i)*z;
end
输入命令并得到结果如下图:
作业6:
拟合
第一步:
在MATLAB软件中,建立一个实现二分法的MATLAB函数文件xy09.m如下:
functionp=xy09(x,y,m)
A=zeros(m+1,m+1);
fori=0:
m
forj=0:
m
A(i+1,j+1)=sum(x.^(i+j));
end
b(i+1)=sum(x.^i.*y);
end
a=A\b';p=fliplr(a');
输入并得到结果为:
作业7:
Romberg求积算法
第一步:
在MATLAB软件中,建立一个实现二分法的MATLAB函数文件xy10.m如下:
functiont=xy10(f,a,b,ep)
ifnargin<4,ep=1e-5;end
i=1;j=1;h=b-a;
T(i,1)=h/2*(feval(f,a)+feval(f,b));
T(i+1,1)=T(i,1)/2+sum(feval(f,a+h/2:
b-h/2+0.001*h))*h/2;
T(i+1,j+1)=4^j*T(i+1,j)/(4^j-1)-T(i,j)/(4^j-1);
whileabs(T(i+1,i+1)-T(i+1,1))>ep
i=i+1;h=h/2;
T(i+1,1)=T(i,1)/2+sum(feval(f,a+h/2:
h:
b-h/2+0.001*h))*h/2;
forj=1:
i
T(i+1,j+1)=4^j*T(i+1,j)/(4^j-1)-T(i,j)/(4^j-1);
end
end
T
t=T(i+1,j+1)
I=t
输入并得到结果为:
作业8:
Gauss求积算法
第一步:
在MATLAB软件中,建立一个实现二分法的MATLAB函数文件xy11.m如下:
functionI=xy11(fun,a,b,ep)
N=1;
h=(b-a)/N;I=0;
fork=1:
N
t=[-sqrt(3/5)0sqrt(3/5)];A=[5/98/95/9];
F=feval(fun,h/2*t+a+(k-1/2)*h);
I=I+sum(A.*F);
end
A=h/2*I;
N=N+1;
h=(b-a)/N;I=0;
fork=1:
N
t=[-sqrt(3/5)0sqrt(3/5)];A=[5/98/95/9];
F=feval(fun,h/2*t+a+(k-1/2)*h);
I=I+sum(A.*F);
end
B=h/2*I;
whileabs(A-B)>ep
N=N+1;h=(b-a)/N;I=0;
fork=1:
N
t=[-sqrt(3/5)0sqrt(3/5)];A=[5/98/95/9];
F=feval(fun,h/2*t+a+(k-1/2)*h);
I=I+sum(A.*F);
end
A=B;
B=h/2*I;
end
I=B;
N
输入命令并得到结果为:
作业9:
应用高斯消元法求解线性方程组
第一步:
在MATLAB软件中,建立一个实现二分法的MATLAB函数文件xy04.m如下:
functionx=xy04(A,b)
K=length(A);
L=eye(K);U=zeros(K);
U(1,:
)=A(1,:
);
L(2:
K,1)=A(2:
K,1)/U(1,1);
fork=2:
K
U(k,k:
K)=A(k,k:
K)-L(k,1:
k-1)*U(1:
k-1,k:
K);
L(k+1:
K,k)=(A(k+1:
K,k)-L(k+1:
K,1:
k-1)*U(1:
k-1,k))/U(k,k);
end
L
U
A=[A';b]',n=length(b);
fork=1:
n-1
fori=k+1:
n
m=A(i,k)/A(k,k);
forj=k:
n+1
A(i,j)=A(i,j)-m*A(k,j);
end
end
disp(A)
end
A(n,n+1)=A(n,n+1)/A(n,n);
fori=n-1:
-1:
1
t=0;
forj=i+1:
n
t=t+A(i,j)*A(j,n+1);
end
A(i,n+1)=(A(i,n+1)-t)/A(i,i);
end
x=A(:
n+1);
x
输入并得到结果为:
作业10:
拉格朗日插值法
第一步:
在MATLAB软件中,建立一个实现二分法的MATLAB函数文件xy07.m如下:
functionyi=xy07(x,y,xi)
m=length(x);n=length(y);p=length(xi);
ifm~=n
error;
end
s=0;
fork=1:
n
t=ones(1,p);
forj=1:
n
ifj~=k,
t=t.*(xi-x(j))/(x(k)-x(j));
end
end
s=s+t*y(k);
end
yi=s;
输入并得到结果为: