计算方法上机实验报告.docx
- 文档编号:29212867
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:13
- 大小:19.67KB
计算方法上机实验报告.docx
《计算方法上机实验报告.docx》由会员分享,可在线阅读,更多相关《计算方法上机实验报告.docx(13页珍藏版)》请在冰豆网上搜索。
计算方法上机实验报告
计算方法上机实验报告
《计算方法》上机实验报告
班
级:
XXXXXX
小组成员:
:
XXXXXXX
XXXXXXX
XXXXXXXXXXXXXX
任课教师:
XXX二〇一八年五月二十五日前言
通过进行多次得上机实验,我们结合课本上得内容以及老师对我们得指导,能够较为熟练地掌握Newton迭代法、Jacobi迭代法、Gauss-Seidel迭代法、Newton插值法、Lagrange插值法与Gauss求积公式等六种算法得原理与使用方法,并参考课本例题进行了MATLAB程序得编写。
以下为本次上机实验报告,按照实验内容共分为六部分.实验一:
一、实验名称及题目:
:
Newtnon迭代法
例2、7(P38):
应用Newton迭代法求在附近得数值解,并使其满足、二、解题思路:
设就是得根,选取作为初始近似值,过点做曲线得切线,得方程为,求出与轴交点得横坐标,称为得一次近似值,过点做曲线得切线,求该切线与轴得横坐标称为得二次近似值,重复以上过程,得得近似值序列,把称为得次近似值,这种求解方法就就是牛顿迭代法。
三、bMatlab程序代码:
ffunction
newton_iterration(x0,tol)
symsz%%定义自变量
fformat
llonng
%定义精度
f==z*z*zz--zz-1;
f1=diff(f);%求导
y=subs(f,z,x0);
y1=subs(f1,,z,x0);%%向函数中代值
x1=x0-y/y1;k=1;
wwhile
abs((x11—x0)〉==tol
xx0=x1;
y=subs(f,z,x0);
y1=subs((f1,z,,x0);
x1=x0--y/y1;k=k+1;
end
x=double(xx1))
K
四、运行结果:
实验二:
:
一、实验名称及题目:
Jacobbi迭代法
例3、7(P74):
试利用Jacobi迭代公式求解方程组
要求数值解为方程组得精确解、二、解题思路:
首先将方程组中得系数矩阵分解成三部分,即:
,为对角阵,为下三角矩阵,为上三角矩阵。
之后确定迭代格式,,(,即迭代次数),称为迭代矩阵。
最后选取初始迭代向量,开始逐次迭代。
最后验证精度。
(迭代阵:
。
)雅克比迭代法得优点明显,计算公式简单,每迭代一次只需计算一次矩阵与向量得乘法,且计算过程中原始矩阵A始终不变,比较容易并行计算.然而这种迭代方式收敛速度较慢,而且占据得存储空间较大。
三、Mbatlab程序代码:
:
function
jacobi(AA,b,x0,eps,x1))
D
==
diag(diag(A)
);%%求A得对角矩阵
L=—ttrill(A,--1);%%求求AA得下三角矩阵
UU
=--trriu((A,,1);%求AA得上三角矩阵
B=D\\(L+U));
f=
D\b;
x=B*xx0+f;
n=1;%%迭代次数
while
noorm((x—x1)>=epss
x=B*x+f;
n=
n+1;
end
formatlongg
nn
x
jingdu=norm(x—x1)
四、运行结果:
实验三:
:
一、实验名称及题目:
:
Gauss—Seidel
迭代法
例3、8(P75):
试利用Gauss-Seidel迭代公式求解方程组,并使其数值解为方程组得精确解、二、解题思路:
:
Gauss-Seidel迭代法与Jacobi迭代法思路相近,首先将方程组中得系数矩阵分解成三部分,即:
,为对角阵,为下三角矩阵,为上三角矩阵.之后确定迭代格式,,(,即迭代次数),称为迭代矩阵。
最后选取初始迭代向量,开始逐次迭代。
最后验证精度。
(迭代阵:
.)Gauss—Seidel迭代法与Jacobi迭代法相比速度更快,但不全如此。
有例子表明:
Gauss-Seidel迭代法收敛时,Jacobi迭代法可能不收敛;而Jacobi迭代法收敛时,Gauss—Seidel迭代法也可能不收敛。
三、Maatllab程序代码:
function
ggauss_seeidel(A,b,x00,eps,x1)
D=diag(diag((A)));%%求求AA得对角矩阵
LL
==
-tril((A,—1);;%求AA得下三角矩阵
UU
=—triu(A,1);%求AA得上三角矩阵
B=(D-L))\\U;
ff
=(DD—L))\\b;
x
==
BB*x0+f;;
n=1;%%迭代次数
while
norm(x1--x)>=eps
x=B*x+f;
n=n+1;
end
formatlong
nn
xx
jjingdu=norm(x1—x)
四、运行结果:
:
实验四:
:
一、实验名称及题目:
:
Lagrange
插值法
例4、1(P88):
给定函数及插值节点、试构造Lagrange插值多项式,给出其误差估计,并由此计算及其误差、二、解题思路:
:
一般来说,如果我们有个点,各互不相同。
那么应用拉格朗日插值公式所得到得拉格朗日插值多项式为:
其中每个为拉格朗日基本多项式(或称插值基函数),其表达式为:
。
三、Matlabb程序代码:
:
ffunction
yy=lagrange(x0,x)
n=length(x0);%%向量长度
s=0;
for
k=1:
nk%k从从11到到nn得循环
p=11、0;
for
j=1:
n
if
jj~=k%“~=”不等于得意思
p=p*(xx—x0(j))/(x0(k)--x0(j));
end
end
y0=x0((k)*(1+cos(xx0(k)));;
s=p*y0+s;;
end
formatlong
s
wucha=abs(x*((1+cos(x)))--s)
四、运行结果:
、五、Lagrangee插值图像绘制
%Lagrange插值图像算法
x=linspace(0,1002,200);
s=linspace(0,1000,200);
x0=[0;pi/8;pi/4;3*pi/8;pi/2];
n=length(x0);
s=0;
fork=1:
n
p=1、0;
forj=1:
n
ifj~=k
p=p、*(x-x0(j))/(x0(k)—x0(j));
end
end
y0=x0(k)*(1+cos(x0(k)));
s=p*y0+s;
end
plot(x,s,’r");
gridon;
title("Lagrange²åֵͼÏñ’)
xlabel(’X’),ylabel("Y");
axisnormal;
实验五:
:
一、实验名称及题目:
:
Newton插值法
例4、3(P96):
已知,试取插值节点,构造4次Newton插值多项式,由此计算得逼近值,并指出其绝对误差、二、解题思路:
:
将拉格朗日插值公式中得改写成:
))...((...))(()()(10102021nnnxxxxaxxxxaxxaaxN,其中,为待定定系数.又,,。
将带入可得:
))...()(](,...,,[...)](,[)()(110100100nnxxxxxxxxxfxxxxfxfxf.
三、Matlabb程序代码:
:
function
newton_interpolation(x0,x))
fformmatt
longg
nn=llength((x0);
syms
z
f=sqrtt(1+cosh(z)^2);
a
(1)=subs(f,z,x0
(1));;
for
k=1:
n—1
y0=subs(f,zz,xx0(k)));
y1=subs(f,z,x0(k+1)));;
d(k,1)
=(y1--yy0)/(x0(k+11)-xx0(kk));;%一阶差商
end
fforr
j=2:
n--11
for
kk=11:
nn—jj
d(k,j)
=(d(k+1,jj—1))—d(k,j-1))/(x0((k+j)-xx0((k)
);%%二阶差商及以上
end
endd
ddouble(d))
for
j=2:
n
a(j)=d(1,j—1);
end
bb(11)
=1;cc
(1)=a
(1);
fforr
j=2:
nn
bb(j)
=(x--x0(jj--1))、*b(jj—1);;
c(j)=a(j)、*b(j);
eendd
nnp=double(sum(cc))
wwucha=double(abs(np--subs(f,z,x)))))
四、运行结果:
五、Newton插值图像绘制
实验六:
:
一、实验名称及题目:
Gauss
求积公式
例5、7(P140):
试构造Gauss型求积公式,
并由此计算积分、二、解题思路:
:
设高斯-勒让德求积公式就是:
依次代入,解得.利用换元公式变换原式得积分上下限,在套用高斯—勒让德求积公式求得积分.三、bMatlab程序代码:
:
fuunctioon
gauss(a,b)
symstt
f=sqrt(tt)/(1+t)^2;
PP=[--ssqrt(3/5)0sqrt(3/5)];
A=[5/98/95/99];
s=0;
for
ii=1:
3;
x=P(i);
y=subs(f,t,(b--a)*x/2+(a+bb)
/2);;
s=s+A(i)*y;
end
formatlong
S=double((aa—b)/2*s)
四、运行结果:
:
结束语
在本学期得《计算方法》课程学习中,我们感受到了巧妙得数学计算方法在解决实际问题中带来得便利与高效,借助计算机解决科学计算问题也就是我们当代大学生应当掌握得必要技能。
在本课程得上机实验过程中,我们亲自体验了课本中所学到得算法在计算机上得使用,使用计算机语言,如MATLAB与C语言等进行编程,加深了我们对各类算法及其理论得理解,并进一步激发了我们对《计算方法》这门课程进行持续学习得学习兴趣。
情节一点也不突兀。
实在佩服作者的才华。
龙格-库塔
#include
#include
floatfunction(floatx,floaty)
{
return(0-(y*y));//f(x,y)µÄ±í´ïʽ}
intmain()
{
floatx0,x1,y0,y1,k1,k2,k3,k4,a,b,c,n,h;inti;
scanf("%f%f%f%f",&a,&b,&c,&n);x0=a;
y0=c;
h=(b-a)/n;
for(i=1;i\n
{
k1=h*function(x0,y0);
k2=h*function(x0+h/2,y0+k1/2);k3=h*function(x0+h/2,y0+k2/2);k4=h*function(x0+h,y0+k3);x1=x0+h;
y1=y0+(k1+2*k2+2*k3+k4)/6;
printf("x%d=%f,y%d=%f\\\\n",i,x1,i,y1);x0=x1;
y0=y1;
}
return0;
}
拉格朗日
#include
#include
#include
#definemaxlength500
#definepi3.xxxx84
floata[maxlength],f[maxlength];
floatn;
floatlagrange(floata[],floatf[],floatx,intn)
{
intk=0,j;
floaty=0.0,l;
while(k\n
{
l=1.0;
//printf("%lf\\\\n",y);
for(j=0;j\n
{
if(j!
=k)
{
l=l*(x-a[j])/(a[k]-a[j]);//printf("%lf\\\\n",l);
}
}
//printf("%lf\\\\n",f[k]);
//printf("%lf\\\\n",l);
y=y+l*f[k];
k++;
}
printf("x=%f,y=%f\\\\n",x,y);
returny;
}
floatfx1(floatx)
{
return(1/(1+x*x));
}
floatfx2(floatx)
{
returnexp(x);
}
floatfx3(floatx)
{
returnsqrt(x);
}
voidmath1(floatc,floatn)
{
inti=0;
floath;
h=2*c/n;
while(i\n
{
a[i]=i*h-5;
i++;
}
}
voidmath2()
{
inti=0;
while(i\n
{
a[i]=cos((2*i+1)*pi/2/(n+1));
i++;
}
}
intmain()
{
n=20;
inti;
math1(5,n);
for(i=0;i\n
{
f[i]=fx1(a[i])
}
lagrange(a,f,0.75,n);
return0;
}
龙贝格
#include
#include
#include
doublet[1000],r[1000];
doublef(doublex)
{
return(x*x*exp(x));
}
intmain()
{
doubleh,a,b,e;
inti,N,m;
scanf("%lf,%lf,%d,%lf",&a,&b,&N,&e);
h=b-a;
m=0;
t[1]=0.5*h*(f(a)+f(b));
printf("%lf",t[1]);
r[0]=t[0];
while
(1)
{
printf("\\\\n");
for(i=0;i\n
t[i]=r[i];
m++;
h=h/2;
r[0]=t[0]/2;
for(i=1;i\n
r[0]+=h*f(a+(i-0.5)*h)/2;
printf("%lf",r[0]);
r[1]=(4*r[0]-t[0])/3;
printf("%lf",r[1]);
if(m==1)
continue;
r[2]=(16*r[1]-t[1])/15;
printf("%lf",r[2]);
if(m==2)
continue;
r[3]=(64*r[2]-t[2])/63;
printf("%lf",r[3]);
if(m==3)
continue;
if((fabs(r[3]-t[3])\n
break;
}
printf("\\\\nthecurrenttimeis:
%d\\\\n",m);
return0;
}
牛顿
#include
#include
#include
doublefunction(doublepoint)
{
return(point*point-2*point*exp(-point)+exp(-2*point));
}
doubled_function(doublepoint)
{
return(2*point+2*point*exp(-point)-2*exp(-point)-2*exp(-2*point));}
intmain()
{
doublebeginner,error1,error2;
intmax_times=0;
beginner=error1=error2=0;
scanf("%lf%lf%lf%d",&beginner,&error1,&error2,&max_times);intcurrent_times=0;
while(current_times\n
{
if(fabs(function(beginner))\n
{
printf("%lf\\\\n",beginner);
return0;
}
if(fabs(d_function(beginner))\n
{
printf("failure\\\\n");
return0;
}
beginner=beginner-function(beginner)/d_function(beginner);if(fabs(function(beginner)/d_function(beginner))\n
printf("%lf\\\\n",beginner);
return0;
}
current_times++;
}
printf("failure\\\\n");
return0;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算方法 上机 实验 报告