数值方法Matlab实验作业Word格式文档下载.docx
《数值方法Matlab实验作业Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数值方法Matlab实验作业Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。
001
上机练习(3)
(1)编写一个M文件利用for循环求1!
+2!
+3!
…+20!
的值。
Test31.m
s=0;
t=1;
fori=1:
20
t=t*i;
s=s+t;
end
s
s=
2.5613e+018
(2)编写一个M文件用while循环求1~200之间的整数之和。
Test32.m
i=0;
while(i<
200)
i=i+1;
s=s+i;
20100
(3)编写一个M文件,画出下列分段函数所表示的曲面。
Test33.m
x1=-3:
0.01:
-1;
y1=2*x1.^2+1;
x2=-1:
1;
y2=0*x2;
x3=1:
3;
y3=-x3.^3;
x=[x1x2x3];
y=[y1y2y3];
plot(x,y);
gridon;
上机练习(4)
对于非线性方程
1.编写M–File函数用二分法求出其在区间[0,0.5]和[2.5,3]内的根,要求函数的最大循环次次为1000次,两个精度均为10-4。
要求打印出最后的根及误差以及循环次数。
F1.m
functiony=f1(x)
y=(x-pi/2)^2-sin(x)-1;
BM.m
functionBM(a,b,eps,n)
n
e=abs(a-b)/2;
x=(a+b)/2;
ife<
eps|abs(f1(x))<
eps
break;
end
iff1(a)*f1(x)>
a=x;
else
b=x;
fprintf('
x=%f误差e=%ff(x)=%f循环%d次\n'
x,e,f1(x),i);
BM(0,0.5,0.0001,1000)
x=0.394287误差e=0.000244f(x)=0.000024循环11次
BM(2.5,3,0.0001,1000)
x=2.747314误差e=0.000244f(x)=0.000053循环11次
2.编写M–File函数用迭代法求出其根,精度为10-4,最大循环次次为1000次,要求打印出最后的根及误差以及循环次数。
F2.m
functiony=f2(x)
y=sqrt(sin(x)+1)+pi/2;
itera.m
functionitera(x0,eps,n)
x=f2(x0);
e=abs(x-x0);
x0=x;
x=%f误差e=%f循环%d次\n'
x,e,i);
itera(0,0.0001,1000)
x=2.747284误差e=0.000051循环11次
3.编写M–File函数用牛顿法求出其根,精度为10-4,最大循环次次为1000次,要求打印出最后的根及误差以及循环次数。
F3.m
functiony=f3(x)
y=2*x-pi-cos(x);
newton.m
functionnewton(x0,eps,n)
x=x0-f1(x0)/f3(x0);
newton(0,0.0001,1000)
x=0.394294误差e=0.000000循环4次
上机练习(5)
对于线性方程组:
1.用LU分解法来求解方程组的根。
学会应用MATLAB中的LU函数。
A=[10-1-2;
-110-2;
-1-15];
B=[7.2;
8.3;
4.2];
[LU]=lu(A);
y=L\B;
x=U\y;
L,U,x
L=
1.000000
-0.10001.00000
-0.1000-0.11111.0000
U=
10.0000-1.0000-2.0000
09.9000-2.2000
004.5556
x=
1.1000
1.2000
1.3000
myLU.m
functionmyLU(A,B)
[m,n]=size(A);
n=length(B);
L=eye(n,n);
U=zeros(n,n);
U(1,1:
n)=A(1,1:
n);
L(2:
n,1)=A(2:
n,1)/U(1,1);
fork=2:
U(k,k:
n)=A(k,k:
n)-L(k,1:
k-1)*U(1:
k-1,k:
L(k+1:
n,k)=(A(k+1:
n,k)-L(k+1:
n,1:
k-1,k))/U(k,k);
L,U
y=zeros(n,1);
y
(1)=B
(1);
y(k)=B(k)-L(k,1:
k-1)*y(1:
k-1);
x=zeros(n,1);
x(n)=y(n)/U(n,n);
fork=n-1:
-1:
1
x(k)=(y(k)-U(k,k+1:
n)*x(k+1:
n))/U(k,k);
fprintf('
x(%d)=%f\n'
i,x(i));
myLU(A,B)
%L,U结果同上
x
(1)=1.100000
x
(2)=1.200000
x(3)=1.300000
2.自己编程用高斯-赛德尔迭代法来求方程组的根,要求
Gauss_Seidel.m
functionGauss_Seidel(a,b,eps)
[mmnn]=size(a);
[ppqq]=size(b);
ifmm~=pp|mm~=nn|qq~=1
error('
输入的方程参数有误!
'
);
x(1:
mm)=0;
while
(1)
y=x;
i=i+1;
%d-->
'
i);
forj=1:
mm
x(j)=b(j)/a(j,j)-a(j,:
)*x'
/a(j,j)+x(j);
x%d=%f'
j,x(j));
\n'
ifmax(abs(y-x))<
Gauss_Seidel(A,B,0.001)
1-->
x1=2.500000x2=2.090909x3=1.227273
2-->
x1=2.977273x2=2.028926x3=1.004132
3-->
x1=3.009814x2=1.996807x3=0.995891
4-->
x1=2.999830x2=1.999688x3=1.000163
5-->
x1=2.999842x2=2.000072x3=1.000061
上机练习(6)
任意给定一组数据(n+1)个点;
(如下数据仅供参考)
(1)用Lagrange插值法得到n次多项式曲线1;
Lag_func.m
functionlag_func(x,xi,yi)
fork=1:
length(x)
fori=1:
length(xi)
fz=x(k)-xi;
fm=xi(i)-xi;
fz(i)=1;
fm(i)=1;
f(i)=prod(fz)/prod(fm);
y(k)=yi*f'
;
plot(xi,yi,'
*'
x,y);
legend('
原始数据'
'
Lagrange插值'
xi=1:
10;
yi=[33.73.94.25.76.67.16.74.53];
x=1:
0.1:
Lag_func(x,xi,yi)
(2)用最小二乘法进行[n/2]次多项式曲线拟合得到曲线2;
Leastfit.m
functionLeastfit(x,xi,yi)
c=floor(length(xi)/2);
[p,s]=polyfit(xi,yi,c);
y=polyval(p,x);
拟合曲线'
leastfit(x,xi,yi)
上机练习(7)
1、分别利用matlab函数trapz,quad,quad8,以及编写的自动变步长迭代积分程序求解如下积分(教材P185第1题和第3题),要求精度为10-4。
trapz函数:
x=0:
y1=x./(4+x.*x);
y2=1./(1+sin(x).^2);
k1=trapz(x,y1);
k2=trapz(x,y2);
k1=%f\nk2=%f\n'
k1,k2);
k1=0.111571
k2=0.809350
quad函数与quad8函数:
a=0;
b=1;
k1=quad('
x./(4+x.*x)'
a,b);
k2=quad('
1./(1+sin(x).^2)'
k1=0.111572
k2=0.809353
k81=quad8('
k82=quad8('
自动变步长迭代积分程序:
jf_func.m
functionz=jf_func(f,a,b,e,max)
n=1;
i=1;
x=[ab];
t1=(b-a)*sum(subs(f,x))/2;
x=a+(2*(1:
n)-1)*(b-a)/2/n;
h=sum((b-a)/n*subs(f,x));
t2=(t1+h)/2;
e0=abs(t2-t1);
t1=t2;
n=n*2;
ifi>
max|e0<
e
z=t2;
f1='
x/(4+x*x)'
f2='
1/(1+sin(x)^2)'
k1=jf_func(f1,0,1,0.0001,1000);
k2=jf_func(f2,0,1,0.0001,1000);
k1=0.111561
k2=0.809327
2、利用matlab函数ode23和ode45求解P217习题9-1第3题(用画图比较)。
func.m
functions=func(x,y)
s=x+y;
ode1.m
[x1,y1]=ode23('
func'
[0,1],1);
x=0:
z=2*exp(x)-x-1;
plot(x1,y1,['
r'
],x,z)
ode2.m
[x2,y2]=ode45('
plot(x2,y2,['
ode1
ode2