计算数值方法上机作业
数值计算方法上机实习题考证

数值计算⽅法上机实习题考证--------------------------------------------------- 此⽂档包含我们计算⽅法的经典算法包含(数值计算⽅法上机实习题)1.设?+=105dx xx I nn ,(1)由递推公式n I I n n 151+-=-,从0I 的⼏个近似值出发,计算20I ;(2)粗糙估计20I ,⽤nI I n n 51511+-=-,计算0I ;(3)分析结果的可靠性及产⽣此现象的原因(重点分析原因)。
(1) 解答:n=0,0.1823)05ln()15ln()5(51515101010=+-+=++=+=+=x d xdx x dx x x I nn这⾥可以⽤for 循环,while 循环,根据个⼈喜好与习惯:for 循环程序: While 循环程序: I=0.1823; I=0.1823; for n=1:20 i=1;I=(-5)*I+1/n; while i<21 End I=(-5)*I+1/i; I i=i+1; fprintf('I20=%f',I) end I = -2.0558e+009 >> II20=-2055816073.851284>> I = -2.0558e+009 (2) 粗略估计I 20: Mathcad 计算结果: for 循环程序: While 循环程序: >> I=0.007998; I=0.007998; >> for n=1:20 n=1;I=(-0.2)*I+1/(5*n); while n<21End I=(-0.2)*I+1/(5*n); >> I n=n+1; I =0.0083 end >> II =0.0083(3) 算法误差分析:计算在递推过程中传递截断误差和舍⼊误差第⼀种算法:(从1——>20)1x x 205x +d 7.998103-?=*000e I I =-*115(5)5()555n n n n n n n n n n e I I I I I I e e e n n------=-=-+--+=-===误差放⼤了5n倍,算法稳定性很不好;第⼆种算法:(从20——>1)*n n ne I I =-***111111111()()555555n n n n n n nn e I I I I I I e n n ---=-=-+--+=-=0111...()55n ne e e ===误差在逐步缩⼩,算法趋近稳定,收敛。
数值计算上机作业

西南交通大学数值计算课程上机作业组号第1组组员学号班级任课教师2017年12月10日目录第1题........................................................................................................ 错误!未定义书签。
1.1 (a) ..................................................................................................... 错误!未定义书签。
1.2 (b) ..................................................................................................... 错误!未定义书签。
第2题. (1)2.1 (a)................................................................................................. 错误!未定义书签。
2.2 (b) ................................................................................................ 错误!未定义书签。
第3题. (1)第4题 (2)4.1 (a)................................................................................................. 错误!未定义书签。
4.2 (b) ................................................................................................ 错误!未定义书签。
数值计算方法上机题目资料

2. 程序输入、输出用文件形式。 3. 编程语言要求用C, 编程环境TC或VC 4. 程序要求调试通过。 5. 每个方法要求给出一个具体的算例(可选
作业题)来验证。
五、上机报告要求
1.报告内容包括:
每种方法的算法原理及程序框图。 程序使用说明 具体算例及结果
上机调试体会及收获。
2.报告要手写。
六、上机报告及源程序提交时间
1.上机报告在考试当天提交。 2.源程序在考试前提交。
提交格式:文件夹(班级+姓名)
输入文件 程序文件夹 输出文件
不要拷贝其它文件!!! 源程序
六、上机报告及源程序提交时间
源程序提交: 把以上文件压缩后,发送到以下邮箱:
haoyq@
七、考核方式
1.算法手算笔试(80%)+上机内容笔试 (10%)+上机报告(10%)
2.上机内容笔试可能形式:
编一段算法程序 给出一段算法程序,说明算法的名称。 程序填空 程序改错(包括算法和语法的错误)
数值计算方法上机练习
一、上机练习目的
复习和巩固数值计算方法的基本数学模型, 全面掌握运用计算机进行数值计算的具体 过程及相关问题。
利用计算机语言独立编写、调试数值计算 方法程序,培养学生利用计算机和所学理 论知识分析解决实际问题的能力。
二、上机练习任务
• 利用计算机基本C语言编写并调试一系列 数值方法计算通用程序,并能正确计算给 定题目,掌握调试技能。
• 掌握文件使用编程技能,如文件的各类操 作,数据格式设计、通用程序运行过程中 文件输入输出运行方式设计等。
• 写出上机练习报告。
三、数值计算方法上机题目
数值代数与计算方法上机作业

数值代数与计算方法上机作业作业一:Matlab的基本操作P311.根据习题12和习题13构造算法和MATLAB程序,以便精确计算所有情况下的二次方程的根,包括b?b2?4ac的情况。
2.参照例1.25,对下列3个差分方程计算出前10个数值近似值。
在每种情况下引入一个笑?1?得出是误差。
如果没有初始误差,则没个差分方程将生成序列?n? 。
构造类似表1.4、2??n?1表1.5以及图1.8至图1.10的输出。
?1rn?1,其中n=1,2,… 23(b) p0?1,p1?0.497,pn?pn?2, 其中n=2,3,…25(c) q0?1,q1?0.497,qn?qn?1?qn?2, 其中n=2,3,…2(a) r0?0.994;rn?作业二:非线性方程f(x)?0的解法P401. 使用程序2.1求解下面每个函数的不动点(尽可能多)近似值,答案精确到小数点后12为。
同时,构造每个函数和直线y=x来显示所有不动点。
(a)(b)(c)(d)g(x)?x5?3x3?2x2?2g(x)?cos(sin(x)) g(x)?x2?in(x?0.15) g(x)?xx?cos(x)P493. 修改程序2.2和程序2.3,使得输出分别类似于表2.1和表2.2的矩阵(即矩阵的第一行应当为[0a0 c0 b0 f(c0) ] )。
P69 4,用习题11中的立方根算法修改程序2.5,并用其近似下列每个立方根到小数点后10位。
(a) p0?2,求7的近似值。
(b) p0?6,求200的近似值。
(c)p0??2,求(?7)的近似值。
作业三:线性方程组AX?B的求解方法131313P93 1. P97 2.P109 2.P120 1.P130 4.作业四:插值与多项式逼近P154Matlab的矩阵特性使其能够快速计算一个函数在其多个点处的值。
例如,如果X=[-1 0 1],则sin(X)将得到[sin(-1),sin(0),sin(1)]。
数值计算方法上机作业

《数值计算方法》上机作业学院:机械学院专业:机械设计及理论姓名:陈国保学号:2010412118日期:2010年12月18日第二章:插值法 2.1,问题:1.编制通用程序,对n+1个节点i x 及()ii y f x = (0,,)i n = (1)n 次拉格朗日插值计算公式Ln(x); (2)n 次牛顿向前插值计算公式; (3)n 次牛顿向后插值计算公式; 2.已知()ln ,[,][1,2]f x x a b ==,取0.1,1,01,,10.i h x i hi ==+=用通用程序计算ln1.54及ln1.98的近似值。
流程图:2.2,源程序:主调函数:#include <stdio.h>#include <math.h>float Ln(float x1,int n,float x[80],float y[80]);float Nnf(float x1,int n,float x[80],float y[80]);float Nnr(float x1,int n,float x[80],float y[80]);main(){float x[80],y[80],x1,h,f_Ln,f_Nnf,f_Nnr;int n,i;//输入插值点printf("Please enter the interpolating point x:");scanf("%f",&x1);//输入拟合阶数printf("Enter the order n:");scanf("%d",&n);//输入已知数表的第一点x坐标printf("Enter the start point:");scanf("%f",&x[0]);//输入插值步长printf("Enter the step size h:");scanf("%f",&h);//计算已知数表的第一点y坐标y[0]=log(x[0]);//计算其余点的坐标for(i=1;i<=n;i++){x[i]=x[0]+i*h;y[i]=log(x[i]);}//拉格朗日法插值求解f_Ln=Ln(x1,n,x,y);//牛顿向前插值法求解f_Nnf=Nnf(x1,n,x,y);//牛顿向后插值法求解f_Nnr=Nnr(x1,n,x,y);//输出结果printf("The appoximate value caculated using Lagrange interpolation mathod is:\n%f\n",f_Ln);printf("The appoximate value caculated using Netown forward interpolation mathod is:\n%f\n",f_Nnf);printf("The appoximate value caculated using Netown backward interpolation mathod is:\n%f\n",f_Nnr);}拉格朗日插值函数:#include <stdio.h>#include <math.h>float Ln(float x1,int n,float x[80],float y[80]){int i,j;float sum=0;float nom=1,denom=1; //nom为基函数的分子,denom为基函数的分母 for(i=0;i<=n;i++){nom=1;denom=1;for(j=0;j<=n;j++)if(i==j) {nom*=1;denom*=1;} //当i=j时,分子分母不乘任何项 else {nom=nom*(x1-x[j]);denom=denom*(x[i]-x[j]);}//否则,分子自乘x-xj,分母自乘xi-xjsum=sum+nom/denom*y[i];//sum自加(x-xj)/(xi-xj)*yj}return sum;}牛顿向前插值函数:#include <stdio.h>#include <math.h>float Nnf(float x1,int n,float x[80],float y[80]){int i,j;float sum=0,t,h;float dif[80][80];float nom=1,denom=1;//nom为分子t(t-1)...(t-n+1)//denom为分母(n+1)!//计算步长hh=(x[n]-x[0])/n;//计算tt=(x1-x[0])/h;//构造向前差分表for(i=0;i<=n;i++)dif[0][i]=y[i];for(i=1;i<=n;i++)for(j=0;j<=n-i;j++)dif[i][j]=dif[i-1][j+1]-dif[i-1][j];sum=y[0];//计算插值公式for(i=1;i<=n;i++){nom=1;denom=1;for(j=1;j<=i;j++){nom*=(t-j+1);denom*=j;}sum+=dif[i][0]*nom/denom;}return sum;}牛顿向后插值函数:#include <stdio.h>#include <math.h>float Nnr(float x1,int n,float x[80],float y[80]) {int i,j;float sum=0,t,h;float dif[80][80];float nom=1,denom=1;//nom为分子t(t+1)...(t+n-1)//denom为分母n!//计算步长h=(x[n]-x[0])/n;//计算tt=(x1-x[n])/h;//构造向后差分表for(i=0;i<=n;i++)dif[0][i]=y[i];for(i=1;i<=n;i++)for(j=n;j>=i;j--)dif[i][j]=dif[i-1][j]-dif[i-1][j-1];sum=y[n];//计算插值公式for(i=1;i<=n;i++){nom=1;denom=1;for(j=1;j<=i;j++){nom*=(t+j-1);denom*=j;}sum+=dif[i][n]*nom/denom;}return sum;}计算结果:Please enter the interpolating point x:1.54Enter the order n:10Enter the start point:1Enter the step size h:0.1The appoximate value caculated using Lagrange interpolation mathod is:0.431782The appoximate value caculated using Netown forward interpolation mathod is: 0.431782The appoximate value caculated using Netown backward interpolation mathod is: 0.431782Press any key to continuePlease enter the interpolating point x:1.98Enter the order n:10Enter the start point:1Enter the step size h:0.1The appoximate value caculated using Lagrange interpolation mathod is:0.683097The appoximate value caculated using Netown forward interpolation mathod is: 0.683097The appoximate value caculated using Netown backward interpolation mathod is: 0.6830972.3计算结果分析:由以上计算结果可以看出采用10个点插值所得出的结果比较理想,误差很小,并且拉格朗日法,牛顿向前插值法和牛顿向后插值法计算的结果差不多。
计算方法上机实习题大作业(实验报告)

计算方法实验报告班级: 学号: 姓名: 成绩:1 舍入误差及稳定性一、实验目的(1)通过上机编程,复习巩固以前所学程序设计语言及上机操作指令;(2)通过上机计算,了解舍入误差所引起的数值不稳定性二、实验内容1、用两种不同的顺序计算1000021n n -=∑,分析其误差的变化 2、已知连分数()101223//(.../)n n a f b b a b a a b =++++,利用下面的算法计算f : 11,i n n i i i a d b d b d ++==+ (1,2,...,0)i n n =-- 0f d = 写一程序,读入011,,,...,,,...,,n n n b b b a a 计算并打印f3、给出一个有效的算法和一个无效的算法计算积分1041nn x y dx x =+⎰ (0,1,...,10)n = 4、设2211N N j S j ==-∑,已知其精确值为1311221N N ⎛⎫-- ⎪+⎝⎭(1)编制按从大到小的顺序计算N S 的程序(2)编制按从小到大的顺序计算N S 的程序(3)按两种顺序分别计算10001000030000,,,S S S 并指出有效位数三、实验步骤、程序设计、实验结果及分析1、用两种不同的顺序计算1000021n n -=∑,分析其误差的变化 (1)实验步骤:分别从1~10000和从10000~1两种顺序进行计算,应包含的头文件有stdio.h 和math.h(2)程序设计:a.顺序计算#include<stdio.h>#include<math.h>void main(){double sum=0;int n=1;while(1){sum=sum+(1/pow(n,2)); if(n%1000==0)printf("sun[%d]=%-30f",n,sum);if(n>=10000)break;n++;}printf("sum[%d]=%f\n",n,sum); }b.逆序计算#include<stdio.h>#include<math.h>void main(){double sum=0;int n=10000;while(1){sum=sum+(1/pow(n,2));if(n%1000==0)printf("sum[%d]=%-30f",n,sum);if(n<=1)break;n--;}printf("sum[%d]=%f\n",n,sum);}(3)实验结果及分析:程序运行结果:a.顺序计算b.逆序计算结果分析:两种不同顺序计算结果是一样的,顺序计算误差从一开始就很小,而逆序计算误差最开始十分大,后来结果正确。
计算方法上机作业

方程求根一、目的和意义非线性方程在科学研究与工程实践中广泛出现,例如,优化问题、特征值问题、微分方程问题等。
但是,除少量方程外,大多数非线性方程求根相当困难,常见的几个简单、有效的数值求根方法,包括二分法、迭代法、牛顿法、割线法等,本实验旨在比较各种算法的计算性能和使用范围。
二、计算公式1.二分法2.不动点迭代法三、结构程序设计代码1.二分法1).定义所求解函数function [ y ] = f( x )y = x^3 + 4*x^2 - 10;end2).执行算法%初始化,设置区间端点a、b,误差限tola = 1;b = 2; tol = 0.5*10^(-6);k = 0; fa = f(a);%设置最大二分次数为30for k = 1:50p = (a + b)/2; fp = f(p);if(fp == 0 || (b - a)/2 < tol)breakendif(fa * fp < 0)b = p;elsea = p;enddisp('近似解p = ');disp(vpa(p,10)); disp('迭代次数k = ');disp(k);end2.不动点迭代法1).定义不动点方程g(x)function [ y ] = g( x )y = x^3 + 4*x^2 + x - 10;end2).执行算法%初始化,设置误差限,设置初值p0tol = 0.5*10^(-6);k = 1; p0 = 1.5;%迭代次数为10次while k <= 10p = g(p0);if abs(p - p0) < tolbreakenddisp('近似解p = ');disp(vpa(p,10)); disp('迭代次数k = ');disp(k);k = k + 1; p0 = p;end四、结果及其讨论1.二分法结果由于结果较长,只取了一部分,从图中可以看出,迭代20次可得到误差限范围内的近似解p=1.36522。
数值计算方法上机1

插值1. 用系数矩阵求方程组的方法求得拉氏插值多项式的方法在MATLAB 中,输入命令format rat %使数据格式采用有理数形式x=[-1,1,2,5]’,y=[-7,7,-4,35]’ %输入列向量A=[x.^0,x.^1,x.^2,x.^3] %构造出线性方程组(2.2)的系数矩阵A\yans=[10,5,-10,2]’(运行文件名统一取为ff1.m),其结果表明 23()105102p x x x x =+-+2.拉格朗日插值函数的计算机实现编制计算拉格朗日插值的M 文件:以下是拉格朗日插值的名为y_lagrl 的M 文件:function y=y_lagr1(x0,y0,x)n=length(x0);m=length(x);for i=1:mz=x(i);s=0.0;for k=1:np=1.0;for j=1:nif j~=kp=p*(z-x0(j))/(x0(k)-x0(j));endends=p*y0(k)+s;endy(i)=s;end运用此文件到具体插值问题中的例子:选择函数y=exp(-x 2) (-2≤x ≤2),在n 个节点上(n 不要太大,如5~11)用拉格朗日插值方法,计算m 个插值点的函数值(m 要适中,如50~100),并画出插值图形。
n=7;m=61;x=-2:4/(m-1):2;y=exp(-x.^2);z=0*x;x0=-2:4/(n-1):2;y0=exp(-x0.^2);y1=y_lagr1(x0,y0,x);plot(x,y,’r ’,x,y1,'b:');(文件名取为ff2.m )运行后结果:3.龙格现象在MA TLAB 中,通过编程可以观察到这种“龙格现象”。
%步1 定义名为f.m 的函数文件function y=f(x)y=1./(1+x.^2);%步2 编写计算拉格朗日插值多项式值并作图程序%作被插函数图象x=-5:1:5;y=f(x);plot(x,y);%固化图形屏幕Hold on%计算下列节点处插值多项式的值z=-5:0.005:5;m=max(size(z));n=10;for k=1:mL(k)=0;for i=1:n+1t(i)=1;for j=1:n+1if j~=it(i)=t(i)*(z(k)-x(j))/(x(i)-x(j));endendL(k)=L(k)+t(i)*y(i);endendplot(z,L,'b')hold off在matlab 中实现,(文件名为ff3.m )结果为:4.分段线性插值函数逼近被插函数的计算机摸拟 作函数211xy +=在节点),,1,0(105n i i n x i =⋅+-=的分段线性插值图象,并将它们进行比较,观察可发现,随着n 的增大,两者吻合得越来越好,龙格现象并未发生。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
作业一
4-11(1)用Romberg 方法求下列积分,要求误差不超过a
,8
.00
dx x a=10-2
计算软件MATLAB
程序代码:
第一步:建立M 文件
function [A,err]=romberg(f,a1,a2,e)
%A 为计算结果矩阵;err 为计算误差;
% romberg 参数依次为要积分的函数,下界,上界,精度;
h=a2-a1;
A(1,1)=(h/2)*(feval(f,a1)+feval(f,a2));
A(2,1)=A(1,1)/2+(h/2)*feval(f,a1+(h/2));
i=2;j=1;n=2;
while 1
m=1;
h=h/2;
while j<i
j=j+1;
A(i,j)=(4^m/((4^m)-1))*A(i,j-1)-A(i-1,j-1)/((4^m)-1);
m=m+1;
end
if abs(A(j,j)-A(j-1,j-1))<e
err=(abs(A(j,j)-A(j-1,j-1)))
break;
end
j=1;
i=i+1;
A(i,j)=0;
for k=1:n
A(i,j)=A(i,j)+feval(f,a1+(2*k-1)*(h/2));
end
A(i,j)=A(i,j)*(h/2);
A(i,j)=A(i-1,j)/2+A(i,j);
n=2*n;
end
首先在窗口中输入format long命令,令计算结果显示15位有效数字
>> f=inline('sqrt(x)')
f =
Inline function:
f(x) = sqrt(x)
>> romberg(f,0,0.8,1e-2)
err =
0.00418661034609
ans =
0.35777087639997 0 0 0
0.43186765101345 0.45656657588462 0 0
0.46029587845502 0.46977195426887 0.47065231282782 0
0.47091965235177 0.47446091031736 0.47477350738725 0.47483892317391
用Romberg 方法求得积分结果为0.47483892317391
作业二
计算软件:MATLAB
(1)Jacobi方法
程序代码:
第一步:建立M文件
function [x,k,flag,err]=Jacobi(A,b,delta,max1)
% A为方程组的系数矩阵;
% b为方程组的右端项
% delta为精度要求,默认为le-5;
% max1为最大迭代次数,默认为100;
% x为方程组的解;
% k为迭代次数;
% flag为指标变量flag=‘OK!’表示迭代收敛到指标要求;% flag=‘fail’表示迭代失败;
if nargin<4 max1=100;end
if nargin<3 delta=1e-5;end
n=length(A);k=0;
x=zeros(n,1);y=zeros(n,1);flag='OK!';
while 1
for i=1:n
y(i)=b(i);
for j=1:n
if j~=i
y(i)=y(i)-A(i,j)*x(j);
end
end
if abs(A(i,j))<1e-10|k==max1
flag='Fail';return;
end
y(i)=y(i)/A(i,i);
end
if norm(y-x,inf)<delta
return
end
x=y;k=k+1;
end
首先在窗口中输入format long命令,令计算结果显示15位有效数字然后在命令窗口输入系数矩阵和右端项:
>>A =[5 2 1;-1 4 2;2 -3 10];b=[-12 20 3]
回车得到:
A =
5 2 1
-1 4 2
2 -
3 10
b =
-12 20 3
再输入:
>> [x,k,flag]=Jacobi(A,b)
x =
-3.99998953291871
3.00000094812013
1.99999144958428
k =
19
flag =
OK!
这说明经过19次迭代得到满足精度要求的近似解
x=[-3.999 989 532 918 71, 3.000 000 948 120 13, 1.999 991 449 584 28]T
(2)Gauss-Seidel方法
程序代码:
第一步:建立M文件
function [x,k,flag,err]= Gau_Seid (A,b,delta,max1)
% A为方程组的系数矩阵;
% b为方程组的右端项
% delta为精度要求,默认为le-5;
% max1为最大迭代次数,默认为100;
% x为方程组的解;
% k为迭代次数;
% flag为指标变量flag=‘OK!’表示迭代收敛到指标要求;% flag=‘fail’表示迭代失败
if nargin<4 max1=100;end
if nargin<3 delta=1e-5;end
n=length(A);k=0;
x=zeros(n,1);y=zeros(n,1);flag='OK!';
while 1
for i=1:n
y(i)=b(i);
for j=1:n
if j~=i
y(i)=y(i)-A(i,j)*x(j);
end
end
if abs(A(i,j))<1e-10|k==max1
flag='Fail';return;
end
y(i)=y(i)/A(i,i);
end
if norm(y-x,inf)<delta
return
end
x=y;k=k+1;
end
然后在命令窗口输入系数矩阵和右端项:
>>A =[5 2 1;-1 4 2;2 -3 10];b=[-12 20 3]
回车得到:
A =
5 2 1
-1 4 2
2 -
3 10
b =
-12 20 3
再输入:
>> [x,k,flag]= Gau_Seid (A,b)
回车得到:
x =
-4.00000011851181
3.00000049280490
2.00000017154383
k =
9
flag =
OK!
这说明经过9次迭代得到满足精度要求的近似解
x=[-4.000 000 118 511 81, 3.000 000 492 804 90, 2.000 000 171 543 83]T。