=0;i--)scanf("%f",&a[i]);printf("请输入x\n");scanf("%f",&x);y=a[n];for(i=n-1;i>=0;i--)y=y*x+a[i];" />
秦九韶算法:
#include "stdio.h"
void main()
{float a[20],y,x; int i,n;
printf("请输入多项式的次数n:\n"); scanf("%d",&n);
printf("",n+1);
for(i=n;i>=0;i--)
scanf("%f",&a[i]);
printf("请输入x\n");
scanf("%f",&x);
y=a[n];
for(i=n-1;i>=0;i--)
y=y*x+a[i];
printf("多项式值为%f\n",y);
}
用牛顿法求a的立方根:
#include"stdio.h"
#include"math.h"
main()
{float x1,x0;
int a;
printf("input a\n");
scanf("%d",&a);
if (a==0)
{printf("a=0\n");exit(0);}
x1=a;
do
{x0=x1;
x1=x0-(x0*x0*x0-a)/(3*x0*x0);
}
while(fabs(x0-x1)>=1e-5);
printf("root=%f\n",x1);
}
扫描法实现根的隔离:
#include "stdio.h"
float f(float x)
{return x*x*x*x-5*x*x+x+2;}
float df(float a,float b)
{float c;
while(b-a>=1e-5)
{c=(a+b)/2;
if(f(c)==0) break;
else if(f(a)*f(c)<0)
b=c;
else a=c;
}
return c;
}
main()
{float a,b,x,h,eps,c;
int i=0;
a=-6;b=6;h=0.1;eps=1e-5;
x=a;
while(x<=b-h/2)
{if(f(x)*f(x+h)<=0)
{printf("[%f,%f]\n",x,x+h);
i++;
c=df(x,x+h);
printf("x%d=%f\n",i,c);
}
x=x+h;
}
}
LU分解:
#include "stdio.h"
#include "math.h"
#define N 4
main ()
{
int i,j,k,m;
float t,a[n][n],u[n][n],l[n][n],b[n],x[n],y[n];
for(i=0;i for(j=0;j {scanf("%f",&t); a[i][j]=t; } for(i=0;i scanf("%f",&b[i]); for(k=0;k { for(j=k;j {t=0; for (m=0;m<=k-1;m++) t=t+l[k][m]*u[m][j]; u[k][j]=a[k][j]-t; } for (i=k+1;i {t=0; for (m=0;m<=k-1;m++) t=t+l[i][m]*u[m][k]; l[i][k]=(a[i][k]-t)/u[k][k]; } } for (i=0;i {t=0; for(j=0;j<=i-1;j++) t=t+l[i][j]*y[j]; y[i]=b[i]-t; } for (i=n-1;i>=0;i--) {t=0; for(k=i+1;k t=t+u[i][k]*x[k]; x[i]=(y[i]-t)/u[i][i]; } for (i=0;i printf("%f",x[i]); } 用高斯-塞德尔迭代法解线性方程组:#include "stdio.h" #include "math.h" float wucha(float x[4],float y[4]) { float z; int i,k,n=4; z=fabs(y[0]-x[0]); for(i=1;i if(z z=fabs(y[i]-x[i]); return (z); } main () { float a[4][4],b[4],x[4],y[4],t=0,s; int i,j,k,n=4,m=100,mark=1; for(i=0;i for(j=0;j {scanf("%f",&t); a[i][j]=t; } for(i=0;i scanf("%f",&b[i]); for(i=0;i scanf("%f",&x[i]); for(i=0;i if(a[i][i]==0) mark=0; if(mark==0) {printf("data error");exit(0);} for(k=1;k<=m;k++) { for (i=0;i { t=0; for(j=0;j if (j!=i) t=t+a[i][j]*x[j]; x[i]=(b[i]-t)/a[i][i]; } if (wucha(x,y)<=1e-5) { printf("%d\n",k); for(i=0;i printf ("%f\n",x[i]); break; } else for(i=0;i y[i]=x[i]; } if(k>m) printf("fail\n"); } 高斯赛德尔迭代: #include "stdio.h" #include "math.h" float wucha(float x[3],float y[3]) { float z; int i,k,n=3; z=fabs(y[0]-x[0]); for(i=1;i if(z z=fabs(y[i]-x[i]); return (z); } main () { float a[3][3],b[3],x[3],y[3],t=0,s; int i,j,k,n=3,m=100,mark=1; for(i=0;i for(j=0;j {scanf("%f",&t); a[i][j]=t; } for(i=0;i scanf("%f",&b[i]); for(i=0;i scanf("%f",&x[i]); for(i=0;i if(a[i][i]==0) mark=0; if(mark==0) {printf("data error");exit(0);} for(k=1;k<=m;k++) { for (i=0;i { t=0; for(j=0;j if (j!=i) t=t+a[i][j]*x[j]; x[i]=(b[i]-t)/a[i][i]; } if (wucha(x,y)<=1e-5) { printf("%d\n",k); for(i=0;i printf ("%f\n",x[i]); break; } else for(i=0;i y[i]=x[i]; } if(k>m) printf("fail\n"); } 雅克比迭代: #include "stdio.h" #include "math.h" float wucha(float x[3],float y[3]) { float z; int i,k,n=3; z=fabs(y[0]-x[0]); for(i=1;i if(z z=fabs(y[i]-x[i]); return (z); } main () { float a[3][3],b[3],x[3],y[3],t=0,s; int i,j,k,n=3,m=100,mark=1; for(i=0;i for(j=0;j {scanf("%f",&t); a[i][j]=t; } for(i=0;i scanf("%f",&b[i]); for(i=0;i scanf("%f",&x[i]); for(i=0;i if(a[i][i]==0) mark=0; if(mark==0) {printf("data error");exit(0);} for(k=1;k<=m;k++) { for (i=0;i { t=0; for(j=0;j if (j!=i) t=t+a[i][j]*x[j]; y[i]=(b[i]-t)/a[i][i]; } if (wucha(x,y)<=1e-3) { printf("%d\n",k); for(i=0;i printf ("%f\n",y[i]); break; } else for(i=0;i x[i]=y[i]; } if(k>m) printf("fail\n"); } 牛顿插值: #include"stdio.h" main() {int i,k,n; float x[200],y[200],t,h,p; n=5; for(i=0;i<=n;i++) scanf("%f%f",&x[i],&y[i]); scanf("%f",&t); for(k=1;k<=n;k++) for(i=n;i>=k;i--) y[i]=(y[i]-y[i-1])/(x[i]-x[i-k]); p=y[0]; h=1; for(i=1;i<=n;i++) {h=h*(t-x[i-1]); p=p+h*y[i]; } printf("%f\n",p); } 拉格朗日差值: #include "stdio.h" main() {int i,k,n; float s,x[200],y[200],t,h,p; scanf("%d",&n); for(i=0;i<=n;i++) scanf("%f%f",&x[i],&y[i]); scanf("%f",&t); p=0; for(k=0;k<=n;k++) {s=1; for(i=0;i<=n;i++) if(i!=k) s=s*(t-x[i])/(x[k]-x[i]); p=p+y[k]*s; } printf("%f\n",p); } 二次拟合: #include"stdio.h" #define N 7 #include "math.h" main() {float x[N+1]={0,1,2,3,4,5,6,7},y[N+1]={0,5,3,2,1,2,4,7},s,t[10],a[10][10],d,t1; int i,j,m,k,l; scanf("%d",&m); for(i=0;i<=m;i++) {s=0; for(k=1;k<=N;k++) s+=pow(x[k],i)*y[k]; a[i][m+1]=s; for(j=0;j<=m;j++) {s=0; for(k=1;k<=N;k++) s=s+pow(x[k],i+j); a[i][j]=s; } } for (k=0;k { d=a[k][k]; l=k; for (i=k+1;i<=m;i++) if (fabs(a[i][k])>fabs(d)) {d=a[i][k]; l=i;} if (fabs(d)<1e-6) { printf ("data error");exit(0);} if (l!=k) for (j=k;j<=m+1;j++) {t1=a[l][j];a[l][j]=a[k][j];a[k][j]=t1;} for (j=k+1;j<=m+1;j++) a[j][k]=a[j][k]/a[k][k]; for (i=k+1;i<=m;i++) for (j=k+1;j<=m+1;j++) a[i][j]=a[i][j]-a[i][k]*a[k][j]; } for (k=m;k>=0; k--) { s=0; for (j=k+1;j<=m;j++) s=s+a[k][j]*t[j]; t[k]=(a[k][m+1]-s)/a[k][k]; } printf("y="); for(i=m;i>0;i--) {printf("%.6f*x^%d",t[i],i); if(t[i-1]>=0 ) printf("+"); } printf("%.6f\n",t[0]); } #include"math.h" #include"stdio.h" #define N 8 float f(float x) { return 1/(x*x+1); } main() { int i; float a=0,b=1,h,x.s; h=(b-a)/(2*N) x=a; s=f(a); for(i=1;i<=N;i++) { x=x+h; s=s+4*f(x); x=x+h; s=s+2*f(x); } s=(h*(s-f(b)))/3; printf("s=%f\n",s); } 【 数值计算方法试题一 一、 填空题(每空1分,共17分) 1、如果用二分法求方程043=-+x x 在区间]2,1[内的根精确到三位小数,需对分( )次。 2、迭代格式)2(2 1-+=+k k k x x x α局部收敛的充分条件是α取值在( )。 3、已知?????≤≤+-+-+-≤≤=31)1()1()1(211 0)(2 33x c x b x a x x x x S 是三次样条函数, 则 a =( ), b =( ), c =( )。 4、)(,),(),(10x l x l x l n 是以整数点n x x x ,,,10 为节点的Lagrange 插值基函数,则 ∑== n k k x l 0)(( ), ∑== n k k j k x l x 0 )(( ),当2≥n 时 = ++∑=)()3(20 4x l x x k k n k k ( )。 ; 5、设1326)(2 47+++=x x x x f 和节点,,2,1,0,2/ ==k k x k 则=],,,[10n x x x f 和=?07 f 。 6、5个节点的牛顿-柯特斯求积公式的代数精度为 ,5个节点的求积公式最高代数精度为 。 7、{}∞ =0)(k k x ?是区间]1,0[上权函数x x =)(ρ的最高项系数为1的正交多项式族,其中1)(0=x ?,则?= 1 4)(dx x x ? 。 8、给定方程组?? ?=+-=-2211 21b x ax b ax x ,a 为实数,当a 满足 ,且20<<ω时,SOR 迭代法收敛。 9、解初值问题 00 (,)()y f x y y x y '=?? =?的改进欧拉法 ??? ??++=+=++++)],(),([2),(] 0[111] 0[1n n n n n n n n n n y x f y x f h y y y x hf y y 是 阶方法。 . / 《计算方法》上机实验报告 班级:XXXXXX 小组成员:XXXXXXX XXXXXXX XXXXXXX XXXXXXX 任课教师:XXX 二〇一八年五月二十五日 前言 通过进行多次的上机实验,我们结合课本上的内容以及老师对我们的指导,能够较为熟练地掌握Newton 迭代法、Jacobi 迭代法、Gauss-Seidel 迭代法、Newton 插值法、Lagrange 插值法和Gauss 求积公式等六种算法的原理和使用方法,并参考课本例题进行了MATLAB 程序的编写。 以下为本次上机实验报告,按照实验内容共分为六部分。 实验一: 一、实验名称及题目: Newton 迭代法 例2.7(P38):应用Newton 迭代法求在附近的数 值解,并使其满足. 二、解题思路: 设'x 是0)(=x f 的根,选取0x 作为'x 初始近似值,过点())(,00x f x 做曲线)(x f y =的切线L ,L 的方程为))((')(000x x x f x f y -+=,求出L 与x 轴交 点的横坐标) (') (0001x f x f x x - =,称1x 为'x 的一次近似值,过点))(,(11x f x 做曲线)(x f y =的切线,求该切线与x 轴的横坐标) (') (1112x f x f x x - =称2x 为'x 的二次近似值,重复以上过程,得'x 的近似值序列{}n x ,把) (') (1n n n n x f x f x x - =+称为'x 的1+n 次近似值,这种求解方法就是牛顿迭代法。 三、Matlab 程序代码: function newton_iteration(x0,tol) syms z %定义自变量 format long %定义精度 f=z*z*z-z-1; f1=diff(f);%求导 y=subs(f,z,x0); y1=subs(f1,z,x0);%向函数中代值 x1=x0-y/y1; k=1; while abs(x1-x0)>=tol x0=x1; y=subs(f,z,x0); y1=subs(f1,z,x0); x1=x0-y/y1;k=k+1; end x=double(x1) K 四、运行结果: 数值分析上机实验报告 选题:曲线拟合的最小二乘法 指导老师: 专业: 学号: 姓名: 课题八曲线拟合的最小二乘法 一、问题提出 从随机的数据中找出其规律性,给出其近似表达式的问题,在生产实践和科学实验中大量存在,通常利用数据的最小二乘法求得拟合曲线。 在某冶炼过程中,根据统计数据的含碳量与时间关系,试求含碳量y 与时间t 的拟合曲线。 二、要求 1、用最小二乘法进行曲线拟合; 2、近似解析表达式为()33221t a t a t a t ++=?; 3、打印出拟合函数()t ?,并打印出()j t ?与()j t y 的误差,12,,2,1 =j ; 4、另外选取一个近似表达式,尝试拟合效果的比较; 5、*绘制出曲线拟合图*。 三、目的和意义 1、掌握曲线拟合的最小二乘法; 2、最小二乘法亦可用于解超定线代数方程组; 3、探索拟合函数的选择与拟合精度间的关系。 四、计算公式 对于给定的测量数据(x i ,f i )(i=1,2,…,n ),设函数分布为 ∑==m j j j x a x y 0)()(? 特别的,取)(x j ?为多项式 j j x x =)(? (j=0, 1,…,m ) 则根据最小二乘法原理,可以构造泛函 ∑∑==-=n i m j i j j i m x a f a a a H 1 10))((),,,(? 令 0=??k a H (k=0, 1,…,m ) 则可以得到法方程 ???? ??????? ?=????????????????????????),(),(),(),(),(),(),(),(),(),(),(),(1010101111000100m m m m m m m m f f f a a a ????????????????????? 求该解方程组,则可以得到解m a a a ,,,10 ,因此可得到数据的最小二乘解 ∑=≈m j j j x a x f 0)()(? 曲线拟合:实际工作中,变量间未必都有线性关系,如服药后血药浓度与时间的关系;疾病疗效与疗程长短的关系;毒物剂量与致死率的关系等常呈曲线关系。曲线拟合是指选择适当的曲线类型来拟合观测数据,并用拟合的曲线方程分析两变量间的关系。 五、结构程序设计 在程序结构方面主要是按照顺序结构进行设计,在进行曲线的拟合时,为了进行比较,在程序设计中,直接调用了最小二乘法的拟合函数polyfit ,并且依次调用了plot 、figure 、hold on 函数进行图象的绘制,最后调用了一个绝对值函数abs 用于计算拟合函数与原有数据的误差,进行拟合效果的比较。 数值计算方法试题一 一、填空题(每空1分,共17分) 1、如果用二分法求方程在区间内的根精确到三位小数,需对分()次。 2、迭代格式局部收敛的充分条件是取值在()。 3、已知是三次样条函数,则 =( ),=(),=()。 4、是以整数点为节点的Lagrange插值基函数,则 ( ),( ),当时( )。 5、设和节点则 和。 6、5个节点的牛顿-柯特斯求积公式的代数精度为,5个节点的求积公式最高代数精度为。 7、是区间上权函数的最高项系数为1的正交多项式族,其中,则。 8、给定方程组,为实数,当满足,且时,SOR迭代法收敛。 9、解初值问题的改进欧拉法是 阶方法。 10、设,当()时,必有分解式,其中为下三角阵,当其对角线元素满足()条件时,这种分解是唯一的。 二、二、选择题(每题2分) 1、解方程组的简单迭代格式收敛的充要条件是()。(1), (2) , (3) , (4) 2、在牛顿-柯特斯求积公式:中,当系数是负值时,公式的稳定性不能保证,所以实际应用中,当()时的牛顿-柯特斯求积公式不使用。 (1),(2),(3),(4), (1)二次;(2)三次;(3)四次;(4)五次 4、若用二阶中点公式求解初值问题,试问为保证该公式绝对稳定,步长的取值范围为()。 (1), (2), (3), (4) 三、1、 2、(15 (1)(1) 试用余项估计其误差。 (2)用的复化梯形公式(或复化 Simpson公式)计算出该积分的近似值。 四、1、(15分)方程在附近有根,把方程写成三种不同的等价形式(1)对应迭代格式;(2)对应迭代格式;(3)对应迭代格式。判断迭代格式在的收敛性,选一种收敛格式计算附近的根,精确到小数点后第三位。选一种迭代格式建立Steffensen迭代法,并进行计算与前一种结果比较,说明是否有加速效果。 2、(8分)已知方程组,其中 , (1)(1)列出Jacobi迭代法和Gauss-Seidel迭代法的分量形式。 (2)(2)求出Jacobi迭代矩阵的谱半径,写出SOR 迭代法。 五、1、(15分)取步长,求解初值问题用改进的欧拉法求的值;用经典的四阶龙格—库塔法求的值。 2、(8分)求一次数不高于4次的多项式使它满足 ,,,, 六、(下列2题任选一题,4分) 1、1、数值积分公式形如 (1)(1)试确定参数使公式代数精度尽量高;(2)设,推导余项公式,并估计误差。 2、2、用二步法 求解常微分方程的初值问题时,如何选择参数使方法阶数尽可能高,并求局部截断误差主项,此时该方法是几阶的。 数值计算方法试题二 一、判断题:(共16分,每小题2分) 1、若是阶非奇异阵,则必存在单位下三角阵和上三角阵,使唯一成立。() 计算方法上机报告 姓名: 学号: 班级:能动上课班级: 题目及求解: 一、对以下和式计算: ∑ ∞ ? ?? ??+-+-+-+=0681581482184161n n n n S n ,要求: ① 若只需保留11个有效数字,该如何进行计算; ② 若要保留30个有效数字,则又将如何进行计算; 1 算法思想 (1)根据精度要求估计所加的项数,可以使用后验误差估计,通项为: 1421114 16818485861681 n n n a n n n n n ε??= ---<< ?+++++??; (2)为了保证计算结果的准确性,写程序时,从后向前计算; (3)使用Matlab 时,可以使用以下函数控制位数: digits(位数)或vpa(变量,精度为数) 2 算法结构 ;0=s ?? ? ??+-+-+-+= 681581482184161n n n n t n ; for 0,1,2,,n i =??? if 10m t -≤ end; for ,1,2,,0n i i i =--??? ;s s t =+ 3 Matlab 源程序 clear; %清除工作空间变量 clc; %清除命令窗口命令 m=input('请输入有效数字的位数m='); %输入有效数字的位数 s=0; for n=0:50 t=(1/16^n)*(4/(8*n+1)-2/(8*n+4)-1/(8*n+5)-1/(8*n+6)); if t<=10^(-m) %判断通项与精度的关系break; end end; fprintf('需要将n值加到n=%d\n',n-1); %需要将n值加到的数值 for i=n-1:-1:0 t=(1/16^i)*(4/(8*i+1)-2/(8*i+4)-1/(8*i+5)-1/(8*i+6)); s=s+t; %求和运算 end s=vpa(s,m) %控制s的精度 4 结果与分析 若保留11位有效数字,则n=7,此时求解得: s =3.1415926536; 若保留30位有效数字时,则n=22, 此时求解得: s =3.8。 通过上面的实验结果可以看出,通过从后往前计算,这种算法很好的保证了计算结果要求保留的准确数字位数的要求。 二、某通信公司在一次施工中,需要在水面宽度为20米的河沟底部沿直线走向铺设一条沟底光缆。在铺设光缆之前需要对沟底的地形进行初步探测,从而估计所需光缆的长度,为工程预算提供依据。已探测到一组等分点位置的深度数据(单位:米)如下表所示: 第一章 一、题目 设∑ =-= N N j S 2 j 2 1 1,其精确值为)11 123(21+--N N 。 1) 编制按从大到小的顺序1 1 13112122 2-+??+-+-=N S N ,计算S N 的通用程序。 2) 编制按从小到大的顺序1 21 1)1(111222-+ ??+--+-= N N S N ,计算S N 的通用程序。 3) 按两种顺序分别计算64210,10,10S S S ,并指出有效位数。(编制程序时用单精度) 4) 通过本次上机题,你明白了什么? 二、通用程序 N=input('Please Input an N (N>1):'); AccurateValue=single((0-1/(N+1)-1/N+3/2)/2); Sn1=single(0); for a=2:N; Sn1=Sn1+1/(a^2-1); end Sn2=single(0); for a=2:N; Sn2=Sn2+1/((N-a+2)^2-1); end fprintf('The value of Sn (N=%d)\n',N); fprintf('Accurate Calculation %f\n',AccurateValue); fprintf('Caculate from large to small %f\n',Sn1); fprintf('Caculate from small to large %f\n',Sn2); disp('____________________________________________________') 三、结果 从结果可以看出有效位数是6位。 感想:可以得出,算法对误差的传播有一定的影响,在计算时选一种好的算法可以使结果更为精确。从以上的结果可以看到从大到小的顺序导致大数吃小数的现象,容易产生较大的误差,求和运算从小数到大数所得到的结果才比较准确。 2.用下列方法求方程e^x+10x-2=0的近似根,要求误差不超过5*10的负4次方,并比较计算量 (1)二分法 (局部,大图不太看得清,故后面两小题都用局部截图) (2)迭代法 (3)牛顿法 顺序消元法 #include for(k=p+1;k 《计算方法》上机实验报告 班级:XXXXXX 小组成员:XXXXXXX XXXXXXX XXXXXXX XXXXXXX 任课教师:XXX 二〇一八年五月二十五日 前言 通过进行多次的上机实验,我们结合课本上的内容以及老师对我们的指导,能够较为熟练地掌握Newton 迭代法、Jacobi 迭代法、Gauss-Seidel 迭代法、Newton 插值法、Lagrange 插值法和Gauss 求积公式等六种算法的原理和使用方法,并参考课本例题进行了MATLAB 程序的编写。 以下为本次上机实验报告,按照实验内容共分为六部分。 实验一: 一、实验名称及题目: Newton 迭代法 例2.7(P38):应用Newton 迭代法求 在 附近的数值解 ,并使其满足 . 二、解题思路: 设'x 是0)(=x f 的根,选取0x 作为'x 初始近似值,过点())(,00x f x 做曲线)(x f y =的切线L ,L 的方程为))((')(000x x x f x f y -+=,求出L 与x 轴交点的横坐标) (') (0001x f x f x x - =,称1x 为'x 的一次近似值,过点))(,(11x f x 做曲线)(x f y =的切线,求该切线与x 轴的横坐标) (') (1112x f x f x x - =称2x 为'x 的二次近似值,重复以上过程,得'x 的近似值序列{}n x ,把 ) (') (1n n n n x f x f x x - =+称为'x 的1+n 次近似值,这种求解方法就是牛顿迭代法。 三、Matlab 程序代码: function newton_iteration(x0,tol) syms z %定义自变量 format long %定义精度 f=z*z*z-z-1; f1=diff(f);%求导 y=subs(f,z,x0); y1=subs(f1,z,x0);%向函数中代值 x1=x0-y/y1; k=1; while abs(x1-x0)>=tol x0=x1; y=subs(f,z,x0); y1=subs(f1,z,x0); x1=x0-y/y1;k=k+1; end x=double(x1) K 四、运行结果: 实验二: 数值计算方法I 上机实验考试题(两题任选一题) 1.小型火箭初始质量为900千克,其中包括600千克燃料。火箭竖直向上发射时燃料以15千克/秒的速率燃烧掉,由此产生30000牛顿的恒定推力.当燃料用尽时引擎关闭。设火箭上升的整个过程中,空气阻力与速度平方成正比,比例系数为0.4(千克/米).重力加速度取9.8米/秒2. A. 建立火箭升空过程的数学模型(微分方程); B. 求引擎关闭瞬间火箭的高度、速度、加速度,及火箭到达最高点的时间和高度. 2.小型火箭初始质量为1200千克,其中包括900千克燃料。火箭竖直向上发射时燃料以15千克/秒的速率燃烧掉,由此产生40000牛顿的恒定推力.当燃料用尽时引擎关闭。设火箭上升的整个过程中,空气阻力与速度平方成正比,比例系数记作k ,火箭升空过程的数学模型为 0)0(,0,01222==≤≤-+?? ? ??-==t dt dx x t t mg T dt dx k dt x d m 其中)(t x 为火箭在时刻t 的高度,m =1200-15t 为火箭在时刻t 的质量,T (=30000牛顿)为推力,g (=9.8米/秒2)为重力加速度, t 1 (=900/15=60秒)为引擎关闭时刻. 今测得一组数据如下(t ~时间(秒),x ~高度(米),v ~速度(米/秒)): 现有两种估计比例系数k 的方法: 1.用每一个数据(t,x,v )计算一个k 的估计值(共11个),再用它们来估计k 。 2.用这组数据拟合一个k . 请你分别用这两种方法给出k 的估计值,对方法进行评价,并且回答,能否认为空气阻力系数k=0.5(说明理由). 《数值计算方法》上机实验报告华北电力大学 实验名称数值il?算方法》上机实验课程名称数值计算方法专业班级:电力实08学生姓名:李超然学号:200801001008 成绩: 指导教师:郝育黔老师实验日期:2010年04月华北电力大学实验报告数值计算方法上机实验报吿一. 各算法的算法原理及计算机程序框图1、牛顿法求解非线性方程 *对于非线性方程,若已知根的一个近似值,将在处展开成一阶 xxfx ()0, fx ()xkk 泰勒公式 "f 0 / 2 八八,fxfxfxxxxx 0 0 0 0 0 kkkk2! 忽略高次项,有 ,fxfxfxxx 0 ()()(),,, kkk 右端是直线方程,用这个直线方程来近似非线性方程。将非线性方程的 **根代入,即fx ()0, X ,* fxfxxx 0 0 0 0, ,, kkk fx 0 fx 0 0, 解出 fX 0 *k XX,, k' fx 0 k 水将右端取为,则是比更接近于的近似值,即xxxxk, Ik, Ik fx ()k 八XX, Ikk* fx()k 这就是牛顿迭代公式。 ,2,计算机程序框图:,见, ,3,输入变量、输出变量说明: X输入变量:迭代初值,迭代精度,迭代最大次数,\0 输出变量:当前迭代次数,当前迭代值xkl ,4,具体算例及求解结果: 2/16 华北电力大学实验报吿 开始 读入 l>k /fx()0?,0 fx 0 Oxx,,01* fx ()0 XX,,,?10 kk, ,1,kN, ?xx, 10 输出迭代输出X输出奇异标志1失败标志 ,3,输入变量、输出变量说明: 结束 例:导出计算的牛顿迭代公式,并il ?算。(课本P39例2-16) 115cc (0), 求解结果: 10. 750000 10.723837 10. 723805 10. 723805 2、列主元素消去法求解线性方程组,1,算法原理: 高斯消去法是利用现行方程组初等变换中的一种变换,即用一个不为零的数乘 -个 方程后加只另一个方程,使方程组变成同解的上三角方程组,然后再自下而上 对上三角 3/16 华北电力大学实验报告方程组求解。 列选主元是当高斯消元到第步时,从列的以下(包括)的各元素中选出绝 aakkkkkk 对值最大的,然后通过行交换将其交换到的位置上。交换系数矩阵中的 两行(包括常ekk 数项),只相当于两个方程的位置交换了,因此,列选主元不影响求解的结 ,2,计算机程序框图:,见下页, 输入变量:系数矩阵元素,常向量元素baiji 输出变量:解向量元素bbb,,12n 第一章绪论 习题一 1.设x>0,x*的相对误差为δ,求f(x)=ln x的误差限。解:求lnx的误差极限就是求f(x)=lnx的误差限,由公式(1. 2.4)有 已知x*的相对误差满足,而 ,故 即 2.下列各数都是经过四舍五入得到的近似值,试指出它们有几位有效数字,并给出其误差限与相对误差限。 解:直接根据定义和式(1.2.2)(1.2.3)则得 有5位有效数字,其误差限,相对误差限 有2位有效数字, 有5位有效数字, 3.下列公式如何才比较准确? (1) (2) 解:要使计算较准确,主要是避免两相近数相减,故应变换所给公式。 (1) (2) 4.近似数x*=0.0310,是 3 位有数数字。 5.计算取,利用:式计算误差最小。 四个选项: 第二、三章插值与函数逼近 习题二、三 1. 给定的数值表 用线性插值与二次插值计算ln0.54的近似值并估计误差限. 解:仍可使用n=1及n=2的Lagrange插值或Newton插值,并应用误差估计(5.8)。线性插值时,用0.5及0.6两点,用Newton插值 误差限,因 ,故 二次插值时,用0.5,0.6,0.7三点,作二次Newton插值 误差限 ,故 2. 在-4≤x≤4上给出的等距节点函数表,若用二次插值法求的近似值,要使误差不超过,函数表的步长h 应取多少? 解:用误差估计式(5.8), 令 因 得 3. 若,求和. 解:由均差与导数关系 于是 4. 若互异,求 的值,这里p≤n+1. 解:,由均差对称性 可知当有 而当P=n+1时 于是得 5. 求证. 解:解:只要按差分定义直接展开得 6. 已知的函数表 计算方法 一、填空题 1.假定x ≤1,用泰勒多项式?+??+++=! !212n x x x e n x ,计算e x 的值,若要求截断误差不超过0.005,则n=_5___ 2. 解 方 程 03432 3=-+x - x x 的牛顿迭代公式 )463/()343(121121311+--+--=------k k k k k k k x x x x x x x 3.一阶常微分方程初值问题 ?????= ='y x y y x f y 0 0)() ,(,其改进的欧拉方法格式为)],(),([21 1 1 y x y x y y i i i i i i f f h +++++= 4.解三对角线方程组的计算方法称为追赶法或回代法 5. 数值求解初值问题的四阶龙格——库塔公式的局部截断误差为o(h 5 ) 6.在ALGOL 中,简单算术表达式y x 3 + 的写法为x+y ↑3 7.循环语句分为离散型循环,步长型循环,当型循环. 8.函数)(x f 在[a,b]上的一次(线性)插值函数= )(x l )()(b f a b a x a f b a b x --+-- 9.在实际进行插值时插值时,将插值范围分为若干段,然后在每个分段上使用低阶插值————如线性插值和抛物插值,这就是所谓分段插值法 10、数值计算中,误差主要来源于模型误差、观测误差、截断误差和舍入误差。 11、电子计算机的结构大体上可分为输入设备 、 存储器、运算器、控制器、 输出设备 五个主要部分。 12、算式2 cos sin 2x x x +在ALGOL 中写为))2cos()(sin(2↑+↑x x x 。 13、ALGOL 算法语言的基本符号分为 字母 、 数字 、 逻辑值、 定义符四大 《计算方法》期中复习试题 一、填空题: 1、已知3.1)3(,2.1)2(,0.1)1(===f f f ,则用辛普生(辛卜生)公式计算求得 ?≈3 1 _________ )(dx x f ,用三点式求得≈')1(f 。 答案:2.367,0.25 2、1)3(,2)2(,1)1(==-=f f f ,则过这三点的二次插值多项式中2 x 的系数为 ,拉 格朗日插值多项式为 。 答案:-1, )2)(1(21 )3)(1(2)3)(2(21)(2--------= x x x x x x x L 3、近似值*0.231x =关于真值229.0=x 有( 2 )位有效数字; 4、设)(x f 可微,求方程)(x f x =的牛顿迭代格式是( ); 答案 )(1)(1n n n n n x f x f x x x '--- =+ 5、对1)(3 ++=x x x f ,差商=]3,2,1,0[f ( 1 ),=]4,3,2,1,0[f ( 0 ); 6、计算方法主要研究( 截断 )误差和( 舍入 )误差; 7、用二分法求非线性方程 f (x )=0在区间(a ,b )内的根时,二分n 次后的误差限为 ( 1 2+-n a b ); 8、已知f (1)=2,f (2)=3,f (4)=5.9,则二次Newton 插值多项式中x 2系数为( 0.15 ); 11、 两点式高斯型求积公式?1 d )(x x f ≈( ?++-≈1 )] 321 3()3213([21d )(f f x x f ),代数精度 为( 5 ); 12、 为了使计算 32)1(6 )1(41310-- -+-+ =x x x y 的乘除法次数尽量地少,应将该表达 式改写为 11 ,))64(3(10-= -++=x t t t t y ,为了减少舍入误差,应将表达式1999 2001- 本科实验报告 课程名称:计算机数值方法 实验项目:方程求根、线性方程组的直接解 法、线性方程组的迭代解法、代数插值和最 小二乘拟合多项式 实验地点:行勉楼 专业班级: ******** 学号: ********* 学生姓名: ******** 指导教师:李誌,崔冬华 2016年 4 月 8 日 y = x*x*x + 4 * x*x - 10; return y; } float Calculate(float a,float b) { c = (a + b) / 2; n++; if (GetY(c) == 0 || ((b - a) / 2) < 0.000005) { cout << c <<"为方程的解"<< endl; return 0; } if (GetY(a)*GetY(c) < 0) { return Calculate(a,c); } if (GetY(c)*GetY(b)< 0) { return Calculate(c,b); } } }; int main() { cout << "方程组为:f(x)=x^3+4x^2-10=0" << endl; float a, b; Text text; text.Getab(); a = text.a; b = text.b; text.Calculate(a, b); return 0; } 2.割线法: // 方程求根(割线法).cpp : 定义控制台应用程序的入口点。// #include "stdafx.h" #include"iostream" 心得体会 使用不同的方法,可以不同程度的求得方程的解,通过二分法计算的程序实现更加了解二分法的特点,二分法过程简单,程序容易实现,但该方法收敛比较慢一般用于求根的初始近似值,不同的方法速度不同。面对一个复杂的问题,要学会简化处理步骤,分步骤一点一点的循序处理,只有这样,才能高效的解决一个复杂问题。 实验报告一 题目:非线性方程求解 摘要:非线性方程的解析解通常很难给出,因此线性方程的数值解法就尤为重要。本实验采用两种常见的求解方法二分法和Newton法及改进的Newton法。 前言:(目的和意义) 掌握二分法与Newton法的基本原理和应用。 数学原理: 对于一个非线性方程的数值解法很多。在此介绍两种最常见的方法:二分法和Newton法。 对于二分法,其数学实质就是说对于给定的待求解的方程f(x),其在[a,b]上连续,f(a)f(b)<0,且f(x)在[a,b]内仅有一个实根x*,取区间中点c,若,则c恰为其根,否则根据f(a)f(c)<0是否成立判断根在区间[a,c]和[c,b]中的哪一个,从而得出新区间,仍称为[a,b]。重复运行计算,直至满足精度为止。这就是二分法的计算思想。 Newton法通常预先要给出一个猜测初值x0,然后根据其迭代公式 产生逼近解x*的迭代数列{x k},这就是Newton法的思想。当x0接近x*时收敛很快,但是当x0选择不好时,可能会发散,因此初值的选取很重要。另外,若将该迭代公式改进为 其中r为要求的方程的根的重数,这就是改进的Newton法,当求解已知重数的方程的根时,在同种条件下其收敛速度要比Newton法快的多。 程序设计: 本实验采用Matlab的M文件编写。其中待求解的方程写成function的方式,如下 function y=f(x); y=-x*x-sin(x); 写成如上形式即可,下面给出主程序。 二分法源程序: clear %%%给定求解区间 b=1.5; a=0; %%%误差 R=1; k=0;%迭代次数初值 while (R>5e-6) ; c=(a+b)/2; if f12(a)*f12(c)>0; a=c; else b=c; end R=b-a;%求出误差 k=k+1; end x=c%给出解 Newton法及改进的Newton法源程序:clear %%%% 输入函数 f=input('请输入需要求解函数>>','s') %%%求解f(x)的导数 df=diff(f); 计算方法实验报告 班级: 学号: 姓名: 成绩: 1 舍入误差及稳定性 一、实验目的 (1)通过上机编程,复习巩固以前所学程序设计语言及上机操作指令; (2)通过上机计算,了解舍入误差所引起的数值不稳定性 二、实验内容 1、用两种不同的顺序计算10000 21n n -=∑,分析其误差的变化 2、已知连分数() 1 01223//(.../)n n a f b b a b a a b =+ +++,利用下面的算法计算f : 1 1 ,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 计算并打印f 3、给出一个有效的算法和一个无效的算法计算积分 1 041 n n x y dx x =+? (0,1,...,1 n = 4、设2 2 11N N j S j == -∑ ,已知其精确值为1311221N N ?? -- ?+?? (1)编制按从大到小的顺序计算N S 的程序 (2)编制按从小到大的顺序计算N S 的程序 (3)按两种顺序分别计算10001000030000,,,S S S 并指出有效位数 三、实验步骤、程序设计、实验结果及分析 1、用两种不同的顺序计算10000 2 1n n -=∑,分析其误差的变化 (1)实验步骤: 分别从1~10000和从10000~1两种顺序进行计算,应包含的头文件有stdio.h 和math.h (2)程序设计: a.顺序计算 #include 数值分析作业答案 插值法 1、当x=1,-1,2时,f(x)=0,-3,4,求f(x)的二次插值多项式。 (1)用单项式基底。 (2)用Lagrange插值基底。 (3)用Newton基底。 证明三种方法得到的多项式是相同的。 解:(1)用单项式基底 设多项式为: , 所以: 所以f(x)的二次插值多项式为: (2)用Lagrange插值基底 Lagrange插值多项式为: 所以f(x)的二次插值多项式为: (3) 用Newton基底: 均差表如下: xk f(xk) 一阶均差二阶均差 1 0 -1 -3 3/2 2 4 7/ 3 5/6 Newton插值多项式为: 所以f(x)的二次插值多项式为: 由以上计算可知,三种方法得到的多项式是相同的。 6、在上给出的等距节点函数表,若用二次插值求ex的近似值,要使截断误差不超过10-6,问使用函数表的步长h应取多少? 解:以xi-1,xi,xi+1为插值节点多项式的截断误差,则有 式中 令得 插值点个数 是奇数,故实际可采用的函数值表步长 8、,求及。 解:由均差的性质可知,均差与导数有如下关系: 所以有: 15、证明两点三次Hermite插值余项是 并由此求出分段三次Hermite插值的误差限。 证明:利用[xk,xk+1]上两点三次Hermite插值条件 知有二重零点xk和k+1。设 确定函数k(x): 当或xk+1时k(x)取任何有限值均可; 当时,,构造关于变量t的函数 显然有 在[xk,x][x,xk+1]上对g(x)使用Rolle定理,存在及使得 在,,上对使用Rolle定理,存在,和使得 再依次对和使用Rolle定理,知至少存在使得 而,将代入,得到 推导过程表明依赖于及x 综合以上过程有: 确定误差限: 记为f(x)在[a,b]上基于等距节点的分段三次Hermite插值函数。在区间[xk,xk+1]上有 而最值 进而得误差估计: 16、求一个次数不高于4次的多项式,使它满足,,。 计算方法实验报告格式 小组名称: 组长姓名(班号): 小组成员姓名(班号): 按贡献排序情况: 指导教师评语: 小组所得分数: 一个完整的实验,应包括数据准备、理论基础、实验内容及方法,最终对实验结果进行分析,以达到对理论知识的感性认识,进一步加深对相关算法的理解,数值实验以实验报告形式完成,实验报告格式如下: 一、实验名称 实验者可根据报告形式需要适当写出. 二、实验目的及要求 首先要求做实验者明确,为什么要做某个实验,实验目的是什么,做完该实验应达到什么结果,在实验过程中的注意事项,实验方法对结果的影响也可以以实验目的的形式列出. 三、算法描述(实验原理与基础理论) 数值实验本身就是为了加深对基础理论及方法的理解而设置的,所以要求将实验涉及到的理论基础,算法原理详尽列出. 四、实验内容 实验内容主要包括实验的实施方案、步骤、实验数据准备、实验的算法以及可能用到的仪器设备. 五、程序流程图 画出程序实现过程的流程图,以便更好的对程序执行的过程有清楚的认识,在程序调试过程中更容易发现问题. 六、实验结果 实验结果应包括实验的原始数据、中间结果及实验的最终结果,复杂的结果可以用表格 形式列出,较为简单的结果可以与实验结果分析合并出现. 七、实验结果分析 实验结果分析包括对对算法的理解与分析、改进与建议. 数值实验报告范例 为了更好地做好数值实验并写出规范的数值实验报告,下面给出一简单范例供读者参考. 数值实验报告 小组名称: 小组成员(班号): 按贡献排序情况: 指导教师评语: 小组所得分数: 一、实验名称 误差传播与算法稳定性. 二、实验目的 1.理解数值计算稳定性的概念. 2.了解数值计算方法的必要性. 3.体会数值计算的收敛性与收敛速度. 三、实验内容 计算dx x x I n n ? += 1 10 ,1,2,,10n = . 四、算法描述 由 dx x x I n n ? += 1 10 ,知 dx x x I n n ?+=--101110,则 数值计算方法上机实习题 1. 设?+=1 05dx x x I n n , (1) 由递推公式n I I n n 1 51+ -=-,从I 0=0.1824, 0=0.1823I 出发,计算20I ; (2) 20=0I ,20=10000I , 用n I I n n 51 5111+- =--,计算0I ; (3) 分析结果的可靠性及产生此现象的原因(重点分析原因)。 答:第一个算法可得出 e 0=|I 0?I 0 ?| e n =|I n ?I n ?|=5n |e 0| 易知第一个算法每一步计算都把误差放大了5倍,n 次计算后更是放大了5n 倍,可靠性低。 第二个算法可得出 e n =|I n ?I n ?| e 0=(15 )n |e n | 可以看出第二个算法每一步计算就把误差缩小5倍,n 次后缩小了5n 倍,可靠性高。 2. 求方程0210=-+x e x 的近似根,要求41105-+?<-k k x x ,并比较计算量。 (1) 在[0,1]上用二分法; 计算根与步数程序: fplot(@(x) exp(x)+10*x-2,[0,1]); grid on; syms x; f=exp(x)+10*x-2; [root,n]=EFF3(f,0,1); fprintf('root=%6.8f ,n=%d \n',root,n); 计算结果显示: root=0.09057617 ,n=11 (2) 取初值00=x ,并用迭代10 21 x k e x -=+; (3) 加速迭代的结果; (4) 取初值00 x ,并用牛顿迭代法; 1. 设?+=1 05dx x x I n n , (1) 由递推公式n I I n n 1 51+-=-,从0I 的几个近似值出发,计算20I ; 解:易得:0I =ln6-ln5=0.1823, 程序为: I=0.182; for n=1:20 I=(-5)*I+1/n; end I 输出结果为:20I = -3.0666e+010 (2) 粗糙估计20I ,用n I I n n 51 5111+- =--,计算0I ; 因为 0095.05 6 0079.01020 201 020 ≈<<≈??dx x I dx x 所以取0087.0)0095.00079.0(2 1 20=+= I 程序为:I=0.0087; for n=1:20 I=(-1/5)*I+1/(5*n); end I 0I = 0.0083 (3) 分析结果的可靠性及产生此现象的原因(重点分析原因)。 首先分析两种递推式的误差;设第一递推式中开始时的误差为000I I E '-=,递推过程的舍入误差不计。并记n n n I I E '-=,则有01)5(5E E E n n n -==-=-Λ。因为=20E 20020)5(I E >>-,所此递推式不可靠。而在第二种递推式中n n E E E )5 1(5110-==-=Λ,误差在缩小, 所以此递推式是可靠的。出现以上运行结果的主要原因是在构造递推式过程中,考虑误差是否得到控制, 即算法是否数值稳定。 2. 求方程0210=-+x e x 的近似根,要求4 1105-+?<-k k x x ,并比较计算量。 (1) 在[0,1]上用二分法; 程序:a=0;b=1.0; while abs(b-a)>5*1e-4 c=(b+a)/2; 计算方法B 上机报告 第1题 某通信公司在一次施工中,需要在水面宽度为20米的河沟底部沿直线走向铺设一条沟底光缆。在铺设光缆之前需要对沟底的地形进行初步探测,从而估计所需光缆的长度,为工程预算提供依据。已探测到一组等分点位置的深度数据(单位:米)如下表所示: (1)请用合适的曲线拟合所测数据点; (2)估算所需光缆长度的近似值,并作出铺设河底光缆的曲线图; 问题分析和算法思想: 本题的主要目的是对21个测量数据进行拟合,同时对拟合曲线进行线积分即可得到河底光缆长度的近似值,可以用的插值方法很多:多项式插值、Lagrange 插值、Newton 插值、三次样条插值等。由于数值点较多时,采用高次多项式插值将产生很大的误差,用拉格朗日插值多项式会出现龙格现象。故为了将所有的数据点都用上,且题中光缆为柔性,可光滑铺设于水底,鉴于此特性,采用三次样条插值的方法较为合适。 计算光缆长度近似值,只需将每两点之间的距离算出,然后依次相加,所得的折线长度,即为光缆长度的近似值。 光缆长度计算公式: 19 1 k k k l +===∑? ? ? 算法结构: 三次样条算法结构见《计算方法教程》P110。 源程序: clear;clc; x=0:20; y=[9.01 8.96 7.96 7.97 8.02 9.05 10.13 11.18 12.26 13.28 13.32 12.61 11.29 10.22 9.15 7.90 7.95 8.86 9.81 10.80 10.93]; d=y; plot(x,y,'k.','markersize',15) hold on %%%计算二阶差商 for k=1:2 for i=21:-1:(k+1) d(i)=(d(i)-d(i-1))/(x(i)-x(i-k)); end end %%%假定d的边界条件,采用自然三次样条 for i=2:20 d(i)=6*d(i+1); end d(1)=0; d(21)=0; %%%追赶法求解带状矩阵的m值 a=0.5*ones(1,21); b=2*ones(1,21); c=0.5*ones(1,21); a(1)=0;c(21)=0; u=ones(1,21); u(1)=b(1); r=c; yy(1)=d(1); %%%追的过程 for k=2:21 l(k)=a(k)/u(k-1); u(k)=b(k)-l(k)*r(k-1); yy(k)=d(k)-l(k)*yy(k-1); end %%%赶的过程 m(21)=yy(21)/u(21); for k=20:-1:1 m(k)=(yy(k)-r(k)*m(k+1))/u(k); end %%%利用插值点画出拟合曲线 k=1; nn=100; xx=linspace(0,20,nn); l=0; for j=1:nn for i=2:20 if xx(j)<=x(i) k=i;数值计算方法试题及答案
计算方法上机实验报告
数值分析上机作业
数值计算方法试题及答案
西安交通大学计算方法B上机报告
数值分析上机题目详解
计算方法上机题答案
计算方法上机实验报告
数值计算方法I上机实验考试题
《数值计算方法》上机实验报告
数值分析习题与答案
计算方法试题库讲解
数值计算方法》试题集及答案
太原理工大学数值计算方法实验报告
(完整版)哈工大-数值分析上机实验报告
计算方法上机实习题大作业(实验报告).
数值分析作业答案
计算方法实验报告格式
数值计算方法上机实习题
(完整版)数值计算方法上机实习题答案
计算方法B上机报告