好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

非线性方程的数值计算方法实验.pdf

19页
  • 卖家[上传人]:飞***
  • 文档编号:53906060
  • 上传时间:2018-09-06
  • 文档格式:PDF
  • 文档大小:517.15KB
  • / 19 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 数值计算方法1 非线性方程的数值计算方法实验一、实验描述:在科学研究和工程实践中, 经常需要求解大量的非线性方程本实验正是通过计算机的程序设计,使用迭代法、波尔查诺二分法、试值法、牛顿 -拉夫森法和割线法,来实现非线性方程的求解本实验中通过对各种方法的实践运用,可以比较出各种方法的优缺点并且,通过完成实验,可加深对各种方法的原理的理解,熟悉掌握 C语言在这些方法中的运用二、实验内容:1、求函数cos(x)(x)xgx的不动点(尽可能多)近似值,答案精确到小数点后 12 位;2、如果在 240 个月内每月付款 300美元,求解满足全部年金A为 500000美元的利率I,的近似值(精确到小数点后 10 位)3、利用加速牛顿 - 拉夫森算法,用其求下列函数M 阶根 p的近似值a) 、f(x)=(x-2)5,M=5,p=2,初始值 p 0=1b) 、f(x)=sin(x3),M=3,p=0,初始值 p 0=1c) 、f(x)=(x-1)ln(x),M=2,p=1,初始值p0=24、 设投射体的运动方程为:y=f(t)=9600(1-e-t/15)-480t 数值计算方法2 x=r(t)=2400(1-e-t/15) (a)求当撞击地面时经过的时间, 精确到小数点后 10位。

      b)求水平飞行行程,精确到小数点后10 位三、实验原理:(1) 、不动点迭代法: 它是一种逐次逼近的方法, 即用某个固定公式反复校正根的近似值 ,使之逐步精确化 , 最后得到满足精度要求的结果它利用计算机运算速度快,适合做重复性操作的特点,让计算机对一个函数进行重复执行, 在每次执行这个函数时, 都从变量的原值推出它的一个新值,直至推出最终答案为止迭代法一般可用于寻找不动点,即:存在一个实数P,满足 P=g(P),则称 P为函数 g(x) 的一个不动点且有定理:若g(x) 是一个连续函数,且 pnn=0∞是由不动点迭代生成的序列如果limn→∞pn=P, 则 P是 g(x) 的不动点所以,不动点的寻找多用迭代法2) 、波尔查诺二分法:起始区间 [a,b] 必须满足 f(a) 与 f(b) 的符号相反的条件 由于连续函数 y=f(x) 的图形无间断, 所以它会在零点x=r 处跨过 x 轴,且 r在区间内通过二分法可将区间内的端点逐步逼近零点,直到得到一个任意小的包含零点的间隔二分法定理: 设 f ∈ C(a,b),且存在数 r∈ [a,b] 满足 f(r)=0 如果f(a) 和 f(b) 的符号相反,且cnn=0∞为二分法生成的中点序列,则:r - cn≤b - a2n +1其中 n=0,1, ⋯ (1) 数值计算方法3 这样,序列 cnn=0∞收敛到零点 x=r 即可表示为:limn→∞cn= r (2) (3) 、试值法:假设一个函数中,有 f(a) 和 f(b) 符号相反。

      二分法使用区间 [a,b]的中点进行下一次迭代 如果找到经过点 (a,f(a))和(b,f(b))的割线L 与 x 轴的交点 (c,0),则可得到一个更好的近似值为了寻找值c,定义了线 L 的斜率 m的两种表示方法,一种表示方法为:m=f b - f(a)b- a(3) 这里使用了点 (a,f(a))和(b,f(b))另一种表示方法为:m=0- f(b)c- b(4)这里使用了点 (c,0) 和(b,f(b))使式(3)和式(4)的斜率相等,则有:f b - f(a)b- a=0- f(b)c- b(5)为了更容易求解 c,可进一步表示为:c=b-f b (b - a)f b - f(a)(6)这样会出现 3 种可能性:如果 f(a) 和 f(c) 的符号相反,则在 [a,c]内有一个零点如果 f(c) 和 f(b) 的符号相反,则在 [c,b]内有一个零点如果 f(c)=0 ,则 c 是零点数值计算方法4 然后,可按二分法的方法进行下一步运算4) 、牛顿- 拉夫森法:此法根据,牛顿-拉夫森定理:设 f ∈C2[a,b],且存在数 p∈ [a,b], 满足 f(p)=0 如果 f(p) ≠0, 则存在一个数 δ >0,对任意初始近似值p0∈ [p- δ ,p+ δ ] ,使得由如下迭代定义的序列pkk=0∞收敛到 p: pk=g(pk-1)= pk-1-f(pk - 1) f(pk - 1)其中 k=1,2,⋯(7)其中,函数 g(x) 由如下定义:g(x)=x--f(x)f(x)(8) 且被称为牛顿 -拉夫森迭代函数。

      由于f(p)=0,显然 g(p)=p 这样,通过寻找函数的不动点, 可以实现寻找方程f(x)=0的根的牛顿 - 拉夫森迭代附:定理 (牛顿- 拉夫森迭代的加速收敛 ):设牛顿 - 拉夫森算法产生的序列线性收敛到M 阶根 x=p, 其中M>1, 则牛顿- 拉夫森迭代公式:pk=pk- 1- Mf(pk - 1)f(pk - 1)(9) (5) 、割线法:割线法包含的公式与试值法的公式一样,只是在关于如何定义每个后续 项 的 逻 辑 判 定 上 不 一样 需 要 两个 靠 近 点 (p,0)的 初 始 点(p0,f(p0))和(p1,f( p1)) 可根据两点迭代法公式,得到一般项: pk+1=g(pk, pk- 1)= pk-f pk(pk- pk - 1)f pk- f(pk- 1)(10)数值计算方法5 四、结果计算及分析:1、函数 g(x)=xx-cos(x)的不动点的迭代 (迭代法 ) :(a) 计算结果:(b) 结果分析 : 此题经过matlab图形仿真,可以看出其解的大致范围在[0.8,1.2]之间此结果是在取p0=0.879 的情况下得出的,其误差精度取为0.000000000001。

      从迭代过程的误差收敛速度可以看出不动点迭代的误差收敛较慢,所需迭代次数较多数值计算方法6 2、满足条件的利率I的计算 ( 试值法 ) :(a) 、计算结果:(b) 、结果分析:此题经过一定的计算分析,将书中所给公式结合题中的条件可得出最终的计算式:3600I[1 +I12240 -1]-500000=0,求解其中的 I 即为利率 又经过一定的计算分析,取其初始计算区间为[0.1,0.2],误差精度取为0.000000000001从其误差收敛的速度可以看出,试值法的误差收敛速度快,所需的迭代次数少数值计算方法7 3、利用加速牛顿- 拉夫森算法,求函数f(x)=(x-2)5、f(x)=sin(x3) 和 f(x)=(x-1)ln(x)的 M阶根 p 的近似值其中每个函数的 M 、p0和最终结果 p 已给出a) 、计算结果:(b) 、结果分析:由于 C语言函数库中没有求导功能函数,而此题所要求用的加速牛顿 - 拉夫森算法的计算公式pk=pk- 1- Mf(pk- 1) f(pk- 1)中要用到题中所 给 函 数 的 导 函 数 , 所 以 求 出 它 们 的 导 函 数 分 别 为f(x) =5(x-2)2, f(x) =3x2cos(x3)和f(x) =In(x)-1- 1x。

      此题的误差精度取为 0.00000000001从输出结果中可以大致判断出,加速牛顿 - 拉夫森法的收敛速度非常快4、给出投射物体的运动方程y=f(t)=9600(1-e-t/15)-480t数值计算方法8 和 x=r(t)=2400(1-e-t/15)求物体落地时经过的时间和水平飞行程割线法 )(a)计算结果:(b) 、结果分析:此题用了割线法的思路进行程序设计,由于割线法的公式要求,需要给出 t0,t1 两个初始值经过一定的分析,给出 t0=5.0, t1=15.0,误差精度设为 0.0000000001从输出结果中可以看出, 割线法的误差收敛速度比较快,所需的迭代次数比较少五、实验结果分析:数值计算方法9 经过以上四个实验的比较分析,结合书上的实例与原理分析,可以得出不动点迭代法比起其他的迭代法,迭代速度慢、次数多试值法的迭代次相对少一些, 但若对其初始区间估算得太大的话,会导致迭代步数增多,甚至会导致发散割线法比试值法要快得多,可以达到相对较高的精度, 且在其迭代过程中每步只需一次新的函数赋值,其收敛阶一般能达到1.1618加速牛顿 -拉夫森法再求多重根时速度很快,收敛阶能达到2。

      附件:数值计算方法10 第一题:#include #include #include//为了调用 FLT_EPSILON ,防止出现分母为零的情况 // #define N 1000// 保证有足够多的运算次数能达到比较精确的结果,且便于修改 // #define pre 0.0000000000001//使循环能够在达到某一误差精度后停下来 // double main() { double p[N],m,err[N],relerr[N]; int k,n; p[0]=0.879;//给定一个合理的初始值以此来进行迭代// for(k=0;k #include #include #define N 10000 #define pre 0.000000000001// 使循环能够在达到某一误差精度后停下来 // double main() { 数值计算方法12 double f(double x); double a[N],b[N],I[N],err[N],relerr[N]; int i,n; a[0]=0.10,b[0]=0.20;//预估它们的初始区间 // for(i=0;i0) a[i+1]=I[i],b[i+1]=b[i];//根据试值法,判断区间。

      // else a[i+1]=a[i],b[i+1]=I[i];//根据试值法,判断区间// err[i]=fabs(I[i]-I[i-1]);//对绝对误差的运算 // relerr[i]=err[i]/(fabs(I[i])+FLT_EPSILON);//对相对误差的运算 // n=i;//将 i 值赋给 n, 使输出能够在合适的时候停下来// if(err[i] 数值计算方法14 #include #include//为了调用 FLT_EPSILON ,防止出现分母为零的情况 // #define pre 0.00000000001//使循环能够在达到某一误差精度后停下来 // #define N 1000//迭代次数,以保证能得到最精确的值// double main() { double fa(double x);//声明 fa 函数// double fb(double x);//声明 fb 函数 // double fc(double x);//声明 fc 函数 // double a[N],b[N],c[N],err[N];//定义结果数组,与误差数组// int k,i,j,m; a[0]=1.0,b[0]=1.0,c[0]=2.0;//赋初始值,由书上给出。

      // for(k=0;kj) j=i;if(m>j) m=j;//对 i,m,j进行比较,并求出最大值,并用于输出// for(k=0;k #include//方便各种数学函数的调用// 数值计算方法17 #include//为了调用 FLT_EPSILON ,防止出现分母为零的情况 // #define N 1000// 保证有足够多的运算次数能达到比较精确的结果,且便于修改 // #define pre 0.0000000001// 使循环能够在达到某一误差精度后停下来 // double main() { double f(double t);//声明 f 函数// double r(double t);//声明 r 函数// double t[N],err[N],relerr[N],dif[N];//使结果能够以数组形式输出,便于分析// char ch1。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.