1、0.7498520.749940.7499993通过本上机题,看出按两种不同的顺序计算的结果是不相同的,按从大到小的顺序计算的值与精确值有较大的误差,而按从小到大的顺序计算的值与精确值吻合。从大到小的顺序计算得到的结果的有效位数少。计算机在进行数值计算时会出现“大数吃小数”的现象,导致计算结果的精度有所降低,我们在计算机中进行同号数的加法时,采用绝对值较小者先加的算法,其结果的相对误差较小。习题220(上机题)Newton迭代法(1)给定初值及容许误差,编制Newton法解方程根的通用程序。(2)给定方程,易知其有三个根1由Newton方法的局部收敛性可知存在,当时,Newton迭代序列收敛于
2、根试确定尽可能大的2试取若干初始值,观察当时Newton序列是否收敛以及收敛于哪一个根。(3)通过本上机题,你明白了什么?解:(1)编制的通用程序:math.h#define eps 0.000001 /给定容许误差float f(float x) /定义函数f(x) float f; f=x*x*x/3-x; /f(x)的表达式; return(f);float df(float x) /定义函数df(x),计算f(x)的导函数 float df; df=x*x-1; /f(x)导函数的表达式; return (df);void main(void) float x0,x1,a; int k
3、=0; coutx0; do a=-f(x0)/df(x0); x1=x0+a; k+; x0=x1; while(fabs(a)eps);k0;n-);#define eps 0.000001int judgement(float z) int count=5; float x0,x1,type,type1; x0=z; while(count-0) x1=x0-f(x0)/df(x0); type=fabs(x1); type1=fabs(x1-x0); /调试值用coutcount=counttype=typetype1=type1n if(fabs(x1-x0)eps) return
4、1; delay(30000); return 0; float delta=0; int flag=1; while(flag=1) coutn;输入数组a:endl;for(i=1;i=n;i+)for(j=1;=(n+1);aij; /给矩阵a赋值aijmax)max=fabs(si);t=i;float b=a1j;a1j=atj;atj=b; /进行第一列主元互换ai1=ai1/max; /第一列除以a11/输出进行第一步变换的数组a/进行第k步分解for(k=2;k+)for(i=k;float sum=0;for(q=1;qm)m=fabs(s1i);l=i; /返回行值=n+1
5、;j+) /交换两行元素float s2=akj;akj=alj;alj=s2;for(j=k;/算出第k行行元素的值float sum1=0;sum1+=akq*aqj;akj=akj-sum1;for(i=k+1;/算出第k列列元素的值float sum2=0;sum2+=aiq*aqk;aik=(aik-sum2)/(akk); /第k步分解结束 /输出改变后的数组/输出解float x10;for(i=n-1;i=1;i-)xn=ann+1/ann;float sum3=0;for(j=i+1;sum3+=aij*xj;xi=(ain+1-sum3)/aii; /回代过程x=xi /输
6、出解向量结果:方程的解为:x1= -0.28923,x2= 0.34544,x3= -0.71281,x4= -0.22061,x5= -0.43040,x6= 0.15431,x7= -0.057823,x8= 0.20105,x9= 0.29023。我感觉是提高了查错误点的能力和编循环语句的能力,即利用很规整的迭代公式进行编程。另外列主元三角分解法的阶梯步骤有了更深的了解!36逐次超松弛迭代法(1)编制解n阶线性方程组Ax=b的SOR方法的通用程序(要求);(2)对于35题中所给的线性方程组,取松弛因子,容许误差,打印松弛因子、迭代次数、最佳松弛因子及解向量。#define eps 0.5
7、e-5 /迭代误差 int i,j,l; float w,t; float m9; float sum; float a99=31,-13,0,0,0,-10,0,0,0,-13,35,-9,0,-11,0,0,0,0,0,-9,31,-10,0,0,0,0,0,0,0,-10,79,-30,0,0,0,-9,0,0,0,-30,57,-7,0,-5,0,0,0,0,0,-7,47,-30,0,0,0,0,0,0,0,-30,41,0,0,0,0,0,0,-5,0,0,27,-2, 0,0,0,-9,0,0,0,-2,29; float b9=-15,27,-23,0,-20,12,-7,7,
8、10; float max(float m9); for(t=1;t=eps);if(max(m)=eps)cout迭代次数=lw=wx1x1ik) k=fabs(mi); return k;结果为: 迭代次数 迭代次数 迭代次数 迭代次数0.02 12910.04 7000.06 4860.08 3730.10 3030.12 2550.14 2210.16 1940.18 1730.20 1560.22 1420.24 1300.26 1200.28 1110.30 1030.32 960.34 900.36 850.38 800.40 750.42 710.44 680.46 640.4
9、8 610.50 580.52 550.54 530.56 510.58 480.60 460.62 440.64 420.66 410.68 390.70 370.72 360.74 340.76 330.78 320.80 300.82 290.84 280.86 270.88 260.90 250.92 240.94 230.96 220.98 211.00 201.02 191.04 181.06 171.08 161.10 151.12 151.14 141.16 121.18 101.20 111.22 121.24 121.26 131.28 131.30 141.32 151.
10、34 151.36 161.38 171.40 181.42 191.44 191.46 201.48 211.50 221.52 241.54 251.56 271.58 301.60 311.62 341.64 361.66 391.68 441.70 491.72 551.74 601.76 711.78 811.80 971.82 1211.84 1571.86 2281.88 3981.90 15821.92 54271.94 21781.96 13741.98 1009 从1.92到2.00均出现不合理的迭代次数,迭代次数偏大。不是合理的迭代值。当初值为x=(1,1,1,1,1,1
11、,1,1,1,)T 时,从上表可以看出,最佳松弛因子为=1.18,迭代次数仅为10次,方程的解为:x1= -0.289231,x2= 0.345437,x3= -0.712811, x4= -0.220608,x5= -0.430400,x6= 0.154309,x7= -0.057823,x8= 0.201054,x9= 0.290229。数 值 分 析 上 机 题戴载星 学号:040139习题 438.(上机题)3次样条插值函数(1)编制求第一型3次样条插值函数的通用程序;(2) 已知汽车曲线型值点的数据如下:12789102.513.304.044.705.225.545.785.405
12、.575.705.80端点条件为=0.8,=0.2。用所编制程序求车门的3次样条插值函数S(x),并打印出S(i+0.5)(i=0,1,9)。通用程序: float x11;/存放数组xj float y11;/存放数组yj float h11;/存放数组hj float u11;/存放数组uj float v11;/存放数组vj float d11;/存放数组dj float M11;/存放数组Mj float b11;/ 存放数组bj float t11,l11,yy11,s4,aa1,aa2,aa3,aa4; float s110; int i,j,n; float xx;/x为区间值
13、/将初值初始化输入数组x: for(i=0;i+)cinxi;输入数组y:yi; /输入端点值 float df2;输入两个端点值:2;dfi; /利用书本上的算法求出所需要的值 /求出hj的值 for(j=0;=n-1; hj=xj+1-xj;hhj /求出uj和vj的初值 v0=1; un=1; for(j=1; uj=hj-1/(hj-1+hj); vj=hj/(hj-1+hj); /求出dj的值 dj=6*(yj+1-yj)/hj-(yj-yj-1)/hj-1)/(hj+hj-1); d0=6*(y1-y0)/h0-df0)/h0; dn=6*(df1-(yn-yn-1)/hn-1)/
14、hn-1;uujvvj ddj /利用书本上的追赶法求解方程组 bi=2; t0=b0; yy0=d0; /消元过程 for(i=1; li=ui/ti-1; ti=bi-li*vi-1; yyi=di-li*yyi-1; /回代过程 Mn=yyn/tn; for(i=n-1;=0; Mi=(yyi-vi*Mi+1)/ti; /将Mj的值输出 coutMMi /输出插值多项式的系数 s0=yj; s1=(yj+1-yj)/hj-(Mj/3+Mj+1/6)*hj; s2=Mj/2; s3=(Mj+1-Mj)/(6*hj);当x的值在区间到(j+1)时,输出插值多项式的系数: for(int k=
15、0;4; coutssk (2)编制的程序求车门的3次样条插值函数S(x):x属于区间0,1时;S(x)=2.51+0.8(x)-0.0014861(x)(x)-0.00851395(x)(x)(x)x属于区间1,2时;S(x)=3.3+0.771486(x-1)-0.027028(x-1)(x-1)-0.00445799(x-1)(x-1)(x-1)x属于区间2,3时;S(x)=4.04+0.704056(x-2)-0.0404019(x-2)(x-2)-0.0036543(x-2)(x-2)(x-2)x属于区间3,4时;S(x)=4.7+0.612289(x-3)-0.0513648(x-3)(x-3
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1