计算方法实验报告1版.docx
《计算方法实验报告1版.docx》由会员分享,可在线阅读,更多相关《计算方法实验报告1版.docx(16页珍藏版)》请在冰豆网上搜索。
计算方法实验报告1版
Matlab上机实验报告
姓名:
刘慧杰班级:
12信算本班学号:
1208300044
第一章
1.1Lagrange插值实验报告
求解的方程
functionf=f1(x)
f=x/(4+x^2);
Lagrange程序
function[y0,N]=Lagrange_eval(X,Y,x0)
formatlonge
m=length(X);
N=zeros(m,1);
y0=0;
fori=1:
m
N(i)=1;
forj=1:
m
ifj~=i
N(i)=N(i)*(x0-X(j))/(X(i)-X(j));
end
end
y0=y0+Y(i)*N(i);
end;
运行结果如下:
1):
令X=[0.5,0.6];Y=[-0.693147,-0.510826];x0=0.54;
2):
令X=[0.4,0.5,0.6];Y=[-0.916291,-0.693147,-0.510826];x0=0.54;
3):
令X=[0.4,0.5,0.6,0.7];Y=[-0.916291,-0.693147,-0.510826,-0.356675];x0=0.54;
4):
令X=[0.4,0.5,0.6,0.7,0.8];
Y=[-0.916291,-0.693147,-0.510826,-0.356675,-0.223144];x0=0.54;
运行[y0,N]=Lagrange_eval(X,Y,x0)
运行结果
(1)
y0=-6.202185999999998e-01
N=
5.999999999999995e-01
4.000000000000005e-01
运行结果
(2)
y0=-6.153198399999997e-01
N=-1.200000000000001e-01
8.399999999999995e-01
2.800000000000004e-01
运行结果(3)
y0=-6.160284079999997e-01
N=-6.400000000000002e-02
6.719999999999994e-01
4.480000000000005e-01
-5.600000000000004e-02
运行结果(4)
y0=-6.161427151999998e-01
N=-4.160000000000001e-02
5.823999999999994e-01
5.824000000000005e-01
-1.456000000000000e-01
2.239999999999996e-02
准确结果是:
y0=-6.160284079999997e-01
结果分析:
运行结果
(1):
是两点插值,具有一阶精度,精度不高。
离准确值较远。
运行结果
(2):
是二次插值,具有二阶精度,精度较高。
还不是很接近准确值。
运行结果(3):
是三次插值,具有三阶精度,精度很高。
接近准确值。
运行结果(4):
是四次插值,具有四阶精度,精度更高。
但是已经偏离准确值。
综上所述:
Lagrange插值不是插值次数越多越好,插值次数如果太多的话,就会出现失真。
第二章
2.1复化simpson公式实验报告
求解的方程
functionf=f1(x)
f=x/(4+x^2);
复化simpson公式程序
functionS=FSimpson(f,a,b,N)
formatlonge
h=(b-a)/N;
fa=feval(f,a);
fb=feval(f,b);
S=fa+fb;
x=a;
fori=1:
N
T=i;
x=x+h/2;
fx=feval(f,x);
S=S+4*fx;
x=x+h/2;
ifx
fx=feval(f,x);
S=S+2*fx;
end
end
S=h*S/6;
运行结果如下:
令:
f=@f1;
a=0;b=1;
1)N=16;
2)N=64;
3)N=1024;
4)N=2048;
运行:
S=FSimpson(f,a,b,N)
运行结果
(1)
S=1.115717780016748e-01
运行结果
(2)
S=1.115717756662571e-01
运行结果(3)
S=1.115717756571050e-01
运行结果(4)
S=1.115717756571049e-01
准确结果是:
S=1.115717756571049e-01
结果分析:
综上所述:
当将所求区间分成2048个时,所求的精度已经完全符合我们所需要精确度了,同时完全靠上了我们需要的准确值。
第三章
二阶Adams预报校正系统和改进的四阶Adams预报校正系统比较的实验报告
求解的方程
functionz=f3(x,y)
z=-y+x+1;
functiony=solvef3(x)
y=exp(-x)+x;
3.3二阶Adams预报校正系统
functionA=Adams2PC(f,a,b,N,ya)
formatlong
tic
h=(b-a)/N;
y=zeros(1,N+1);
x=zeros(1,N+1);
x=a:
h:
b;
y
(1)=ya;
fori=1:
N
ifi==1
y1=y(i)+h*feval(f,x(i),y(i));
y2=y(i)+h*feval(f,x(i+1),y1);
y(i+1)=(y1+y2)/2;
dy1=feval(f,x(i),y(i));
dy2=feval(f,x(i+1),y(i+1));
else
y(i+1)=y(i)+h*(3*dy2-dy1)/2;
P=feval(f,x(i+1),y(i+1));
y(i+1)=y(i)+h*(P+dy2)/2;
dy1=dy2;
dy2=feval(f,x(i+1),y(i+1));
end
end
A=[x',y'];
tic
T=toc
3.4改进的四阶Adams预报校正系统
functionA=CAdams4PC(f,a,b,N,ya)
formatlong
tic
ifN<4
return;
end
h=(b-a)/N;
x=zeros(1,N+1);
y=zeros(1,N+1);
x=a:
h:
b;
y
(1)=ya;
F=zeros(1,4);
fori=1:
N
ifi<4
k1=feval(f,x(i),y(i));
k2=feval(f,x(i)+h/2,y(i)+k1*(h/2));
k3=feval(f,x(i)+h/2,y(i)+k2*(h/2));
k4=feval(f,x(i)+h,y(i)+k3*h);
y(i+1)=y(i)+(h/6)*(k1+2*k2+2*k3+k4);
elseifi==4
F=feval(f,x(i-3:
i),y(i-3:
i));
py=y(i)+(h/24)*(F*[-9,37,-59,55]');
p=feval(f,x(i+1),py);
F=[F
(2)F(3)F(4)p];
y(i+1)=y(i)+(h/24)*(F*[1,-5,19,9]');
p=py;c=y(i+1);
else
F=feval(f,x(i-3:
i),y(i-3:
i));
py=y(i)+(h/24)*(F*[-9,37,-59,55]');
my=py-251*(p-c)/270;
m=feval(f,x(i+1),my);
F=[F
(2)F(3)F(4)m];
cy=y(i)+(h/24)*(F*[1,-5,19,9]');
y(i+1)=cy+19*(py-cy)/270;
p=py;c=cy;
end
end
A=[x',y'];
tic
T=toc
令f=@f3;a=0;b=1;N=10;ya=1;
1)运行A2=Adams2PC(f,a,b,N,ya);
y=solvef3(a:
(b-a)/N:
b);
m=[A2,y']
2)运行CA4=CAdams4PC(f,a,b,N,ya);
y=solvef3(a:
(b-a)/N:
b);
m=[CA4,y']
运行结果如下:
运行结果
(1):
最小时间T=1.184198528514909e-06
最大时间T=1.578931371353211e-06
离散节点值二阶Adams预报校正系统准确值
m=
01.0000000000000001.000000000000000
0.1000000000000001.0050000000000001.004837418035960
0.2000000000000001.0187875000000001.018730753077982
0.3000000000000001.0407871562500001.040818220681718
0.4000000000000001.0702173755468751.070320046035640
0.5000000000000001.1063703004181641.106530659712633
0.6000000000000001.1486055041906171.148811636094027
0.7000000000000001.1963435693019391.196585303791410
0.8000000000000001.2490602753810331.249328964117222
0.9000000000000001.3062813409850331.306569659740599
1.0000000000000001.3675776662554651.367879441171442
运行结果
(2):
最小时间T=1.184198528514909e-06
最大时间T=1.673664214191514e-06
离散节点值改进的四阶Adams预报校正系统准确值
m=
01.0000000000000001.000000000000000
0.1000000000000001.0048375000000001.004837418035960
0.2000000000000001.0187309014062501.018730753077982
0.3000000000000001.0408184220011781.040818220681718
0.4000000000000001.0703199182439461.070320046035640
0.5000000000000001.1065305771785771.106530659712633
0.6000000000000001.1488115792758771.148811636094027
0.7000000000000001.1965852694227261.196585303791410
0.8000000000000001.2493289497773841.249328964117222
0.9000000000000001.3065696613693961.306569659740599
1.0000000000000001.3678794559163771.367879441171442
结果分析:
综上所述:
改进的四阶Adams所求的值要比二阶Adams所求的值更靠进准确值。
时间平均开销上,改进的四阶Adams和二阶Adams基本差不多,改进的四阶Adams略多一点。
第四章
二分法和Newton下山法的比较实验报告
求解的方程
functionf=func2(x)
f=sqrt(x^2+1)-tan(x);
function[f,d]=func3(x)
f=sqrt(x^2+1)-tan(x);
d1='sqrt(x^2+1)-tan(x)';
d=subs(diff(d1));
4.1二分法和4.3Newton下山法的程序
4.1
function[x,k]=demimethod(a,b,f,emg)
formatlonge
fa=feval(f,a);
fab=feval(f,(a+b)/2);
k=0;
whileabs(b-a)>emg
iffab==0
x=(a+b)/2;
return;
elseiffa*fab<0
b=(a+b)/2;
else
a=(a+b)/2;
end
fa=feval(f,a);
fab=feval(f,(a+b)/2);
k=k+1;
end
x=(a+b)/2;
4.3
function[x,k]=Mendnewton(f,x0,emg)
formatlonge
[f1,d1]=feval(f,x0);
k=1;
x
(1)=x0;
x
(2)=x
(1)-f1/d1;
whileabs(f1)>emg
u=1;
k=k+1;
[f1,d1]=feval(f,x(k));
x(k+1)=x(k)-u*f1/d1;
[f2,d2]=feval(f,x(k+1));
whileabs(f2)>abs(f1)
u=u/2;
x(k+1)=x(k)-u*f1/d1;
[f2,d2]=feval(f,x(k+1));
end
end
1)令:
f=@func2;
运行:
[x0,k]=demimethod(0,pi/2,f,10^-5)
2)令:
x0=-1.2;f=@func3;
运行:
[x,k]=Mendnewton(f,x0,10^-6)
运行结果如下:
运行结果
(1)
x0=9.414597361712279e-01
k=18
运行结果
(2)
x=
Columns1through3
-1.200000000000000e+00-7.069047932971935e-011.942400972108480e-01
Columns4through6
1.163518073303871e+001.023918977930554e+009.530711345686330e-01
Columns7through9
9.416925081385333e-019.414616152761416e-019.414615238528302e-01
k=8
结果分析:
综上所述:
二分法的优点是算法简单,缺点就是收敛速度慢;
Newton下山法的优点是收敛速度快,缺点就是需要选取初值点。
第五章
Jacobi迭代与Gauss-Seidel迭代的比较实验报告
求解的方程组
-4x1+x2+x3+x4=1
x1-4x2+x3+x4=1
x1+x2-4x3+x4=1
x1+x2+x3-4x4=1
5.1Jacobi迭代与5.2Gauss-Seidel迭代程序
5.1
function[x,k]=Jacobimethod(A,b,x0,N,emg)
formatlonge
n=length(A);
x1=zeros(n,1);
x2=zeros(n,1);
x1=x0;k=0;
r=max(abs(b-A*x1));
whiler>emg
fori=1:
n
sum=0;
forj=1:
n
ifi~=j
sum=sum+A(i,j)*x1(j);
end
end
x2(i)=(b(i)-sum)/A(i,i);
end
r=max(abs(x2-x1));
x1=x2;
k=k+1;
ifk>N
disp('迭代失败,返回');
return;
end
end
x=x1;
5.3
function[x,k]=Gaussmethod(A,b,x0,N,emg)
formatlonge
n=length(A);
x1=zeros(n,1);
x2=zeros(n,1);
x1=x0;
r=max(abs(b-A*x1));
k=0;
whiler>emg
fori=1:
n
sum=0;
forj=1:
n
ifj>i
sum=sum+A(i,j)*x1(j);
elseifj
sum=sum+A(i,j)*x2(j);
end
end
x2(i)=(b(i)-sum)/A(i,i);
end
r=max(abs(x2-x1));
x1=x2;
k=k+1;
ifk>N
disp('µü´úʧ°Ü£¬·µ»Ø');
return;
end
end
x=x1;
令:
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]';
1)运行:
[x,k]=Jacobimethod(A,b,x0,100,10^-5)
2)运行:
[x,k]=Gaussmethod(A,b,x0,100,10^-5)
运行结果如下:
运行结果
(1)
x=-9.999761621685057e-01
-9.999761621685057e-01
-9.999761621685057e-01
-9.999761621685057e-01
k=37
运行结果
(2)
x=-9.999896479636309e-01
-9.999910053552269e-01
-9.999921847613638e-01
-9.999932095200554e-01
k=21
结果分析:
综上所述:
Jacobi迭代要比Gauss-Seidel迭代花费更多的时间,浪费了大量时间,所以Gauss-Seidel迭代算法要比Jacobi迭代算法好。