数值方法Matlab实验作业.docx
- 文档编号:3506384
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:15
- 大小:154.37KB
数值方法Matlab实验作业.docx
《数值方法Matlab实验作业.docx》由会员分享,可在线阅读,更多相关《数值方法Matlab实验作业.docx(15页珍藏版)》请在冰豆网上搜索。
数值方法Matlab实验作业
上机练习
(2)
(1)创建一个表达式,并求当x=1,y=2时的z值。
(sqrt(),exp())
>>x=1;y=2;
>>z=(sqrt(4*x*x+1)+0.5457*exp(-0.75*x*x-3.75*y*y-1.5*x))/(2*sin(3*y)-1)
z=
-1.4345
(2)输入如下两个矩阵A和B,对矩阵A和B作关系运算,标识出两矩阵中元素相等的位置,元素值不等的位置,并标识出矩阵A中所有小于0的元素。
>>A=[123;-213;-321];
>>B=[143;328;523];
>>A==B,A~=B,A<0
ans=
101
000
010
ans=
010
111
101
ans=
000
100
100
(3)对
(2)中的矩阵A和B作逻辑“或”、“与”运算,并标识出矩阵B中所有大于2并小于5的元素位置。
>>A&B,A|B,B>2&B<5
ans=
111
111
111
ans=
111
111
111
ans=
011
100
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;s=0;
while(i<200)
i=i+1;
s=s+i;
end
s
>>
s=
20100
(3)编写一个M文件,画出下列分段函数所表示的曲面。
Test33.m
x1=-3:
0.01:
-1;
y1=2*x1.^2+1;
x2=-1:
0.01:
1;
y2=0*x2;
x3=1:
0.01:
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)
fori=1:
n
e=abs(a-b)/2;
x=(a+b)/2;
ife break; end iff1(a)*f1(x)>0 a=x; else b=x; end end 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) fori=1: n x=f2(x0); e=abs(x-x0); ife break; else x0=x; end end fprintf('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) fori=1: n x=x0-f1(x0)/f3(x0); e=abs(x-x0); ife break; else x0=x; end end fprintf('x=%f误差e=%f循环%d次\n',x,e,i); >>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: n U(k,k: n)=A(k,k: n)-L(k,1: k-1)*U(1: k-1,k: n); L(k+1: n,k)=(A(k+1: n,k)-L(k+1: n,1: k-1)*U(1: k-1,k))/U(k,k); end L,U y=zeros(n,1); y (1)=B (1); fork=2: n y(k)=B(k)-L(k,1: k-1)*y(1: k-1); end 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); end fori=1: n fprintf('x(%d)=%f\n',i,x(i)); end >>A=[10-1-2;-110-2;-1-15]; >>B=[7.2;8.3;4.2]; >>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('输入的方程参数有误! '); end x(1: mm)=0;i=0; while (1) y=x;i=i+1; fprintf('%d-->',i); forj=1: mm x(j)=b(j)/a(j,j)-a(j,: )*x'/a(j,j)+x(j); fprintf('x%d=%f',j,x(j)); end fprintf('\n'); ifmax(abs(y-x)) break; end end >>A=[10-1-2;-110-2;-1-15]; >>B=[7.2;8.3;4.2]; >>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); end y(k)=yi*f'; end plot(xi,yi,'*',x,y); gridon; legend('原始数据','Lagrange插值'); >>xi=1: 10; >>yi=[33.73.94.25.76.67.16.74.53]; >>x=1: 0.1: 10; >>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); plot(xi,yi,'*',x,y); gridon; legend('原始数据','拟合曲线'); >>xi=1: 10; >>yi=[33.73.94.25.76.67.16.74.53]; >>x=1: 0.1: 10; >>leastfit(x,xi,yi) 上机练习(7) 1、分别利用matlab函数trapz,quad,quad8,以及编写的自动变步长迭代积分程序求解如下积分(教材P185第1题和第3题),要求精度为10-4。 trapz函数: >>x=0: 0.01: 1; >>y1=x./(4+x.*x); >>y2=1./(1+sin(x).^2); >>k1=trapz(x,y1);k2=trapz(x,y2); >>fprintf('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)',a,b); >>fprintf('k1=%f\nk2=%f\n',k1,k2); k1=0.111572 k2=0.809353 >>k81=quad8('x./(4+x.*x)',a,b);k82=quad8('1./(1+sin(x).^2)',a,b); >>fprintf('k1=%f\nk2=%f\n',k1,k2); k1=0.111572 k2=0.809353 自动变步长迭代积分程序: 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; while (1) 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; i=i+1; ifi>max|e0 break; end end 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); >>fprintf('k1=%f\nk2=%f\n',k1,k2); 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: 0.01: 1; z=2*exp(x)-x-1; plot(x1,y1,['r','*'],x,z) gridon; ode2.m [x2,y2]=ode45('func',[0,1],1); x=0: 0.01: 1; z=2*exp(x)-x-1; plot(x2,y2,['r','*'],x,z) gridon; >>ode1 >>ode2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值 方法 Matlab 实验 作业