当前位置:文档之家› 计算方法实验报告4

计算方法实验报告4

计算方法实验报告(四)(一)线性方程的迭代解法一、实验问题利用简单迭代法,两种加速技术,牛顿法,改进牛顿法,弦割法求解习题5-1,5-2,5-3中的一题,并尽可能准确。

选取5-3:求在x=1.5附近的根。

二、问题的分析(描述算法的步骤等)(1)简单迭代法算法:给定初始近似值,求的解。

Step 1 令i=0;Step 2 令(计算);Step 3 如果,则迭代终止,否则重复Step 2。

(2)Aitken加速法算法Step 1 令k=0,利用简单迭代算法得到迭代序列;Step 2 令-(计算得到一个新的序列,其中k=0,1,2…);Step 3 如果,则迭代终止,否则重复Step 2。

(3)插值加速法算法Step 1 令k=0,利用简单迭代算法得到迭代序列;Step 2 令+(计算得到一个新的序列,其中k=1,2,3…);Step 3 如果,则迭代终止,否则重复Step 2。

(4)牛顿法算法Step 1给定初始近似值;Step 2令,其中k计算得到的序列;Step 3如果,则迭代终止,否则重复Step 2。

(5)改进牛顿法的算法Step 1给定初始近似值;Step 2令,其中k迭代计算得到的序列;Step 3如果,则迭代终止,否则重复Step 2。

(6)弦割法算法(双点弦割法)Step 1给定初始近似值,;Step 2令其中k计算得到的序列;Step 3如果,则迭代终止,否则重复Step 2。

三、程序设计(1)简单迭代法利用迭代公式进行迭代运算。

#include <iostream.h>#include <math.h>#include<stdio.h>double fun(double x){double c=1+x*x;returnpow(c,1/3.0);}void main(){double x=1.5;double y=0;double D=1;double e=0.001;while(D>e){D=0;y=fun(x);if(fabs(y-x)>=D){D=fabs(y-x);}x=y;}cout<<x<<endl;}(2) )Aitken加速法源程序如下:x1=1.5;eps=0.0001;y1=(1+x1^2)^(1/3);z1=(1+y1^2)^(1/3);x=z1-(z1-y1)^2/(z1-2*y1+x1); while eps<abs(x2-x)x=x2;x1=y1;y1=(1+x1^2)^(1/3);z1=(1+y1^2)^(1/3);x2=z1-(z1-y1)^2/(z1-2*y1+x1); n=n+1;endfprintf('迭代次数 n=%.0f\n',n); fprintf('x2=%.5f\n',x2)(3)插值加速法源程序如下:x1=0;x2=1.5;eps=0.0000001;y1=0;z1=0;n=0;while eps<abs(x2-x1)x1=x2;y1=(1+x1^2)^(1/3);z1=(1+y1^2)^(1/3);x2=z1+(z1-y1)^2/(z1-2*y1+x1); n=n+1;endfprintf('迭代次数 n=%.0f\n',n);fprintf('x2=%.5f\n',x2)(4)牛顿法:利用公式进行迭代运算程序设计如下:#include <iostream.h>#include <math.h>double fun(double x){double a=2*pow(x,3.0)-pow(x,2.0)+1; double b=3*pow(x,2.0)-2*x;return a/b;}void main(){double x=1.5;double y=0;double D=1;double e=0.001;double f=0;while(D>e){D=0;y=fun(x);if(fabs(y-x)>=D){D=fabs(y-x);}x=y;f++;}cout<<x<<endl;cout<<"f="<<f<<endl;}(5)运用改进牛顿法:迭代公式:程序代码如下:#include <iostream.h>#include <math.h>double fun(double x){double a=2*pow(x,3.0)-pow(x,2.0)+1; double b=3*pow(x,2.0)-2*x;double c=pow((pow(x,3.0)-pow(x,2.0)-1),2.0); double d=(6*x-2)/12;return a/b-c*d;}void main(){double x=1.5;double y=0;double D=1;double e=0.001;double f=0;while(D>e){D=0;y=fun(x);if(fabs(y-x)>=D){D=fabs(y-x);}x=y;f++;}cout<<x<<endl;cout<<"f="<<f<<endl;}(6)利用弦割法利用公式程序代码:#include "stdafx.h"#include <iostream>using namespace std;#include <math.h>doublefua(double l){returnpow(l,3.0)-pow(l,2.0)-1;}int _tmain(intargc, _TCHAR* argv[]){double x=1.4;double y=0;double D=1;double e=0.001;double f=0;while(D>e){D=0;y=x-fua(x)*(x-1.5)/(fua(x)-0.125);if(fabs(y-x)>=D){D=fabs(y-x);}x=y;f++;}cout<<x<<endl;cout<<"f="<<f<<endl;return 0;}四、计算结果(1)简单迭代法的运行结果:x=1.46624(2)Aitken加速法运行结果如下:迭代次数 n=15x2=1.46557(3)插值加速法运行结果如下:迭代次数 n=15x2=1.46557(4)牛顿迭代法的运行结果如下(5)改进牛顿迭代法运行结果:(6)弦割法的运行结果五、结果分析通过实验很容易发现在相同的准确数字时,加速迭代法的迭代次数明显少于简单的迭代法。

但仅仅就实验结果而言,牛顿迭代法和改进的牛顿迭代法与弦割法所得运行结果相同,但是改进的迭代法速度比牛顿迭代法要快速。

六、实验的总结与体会迭代法是一种逐次逼近的方法,且都是局部收敛的,具有原理简单,编写程序方便等优点,但还存在是否收敛与收敛速度快慢的问题,不能盲目使用。

当迭代过程只有线性收敛速度时,可采用埃特金加速法实现加速。

牛顿法是一种特殊的迭代法,用于求方程单根时具有二阶收敛速度。

但牛顿法对初值的要求苛刻,而且需要求函数的导数,遇到求导数复杂的情形,常用弦割法求解。

弦割法是对牛顿法的变形,不需要求函数的导数,但收敛阶不高,而且需要提供两个较好的初值。

(二)线性方程组的迭代解法一、实验问题利用雅可比迭代法,赛德尔迭代法求解如下方程组二、问题的分析(描述算法的步骤等)雅克比迭代法算法如下:(1)对令(2)令(3)对做令对但令令若则令(4)对i=1令(5)若D则转到()(6)输出并停止计算赛德尔迭代法算法如下()对令()令(3)对做令对但令令若则令令(4)若D则转到()(5)输出并停止计算三、程序设计(1)运用雅可比迭代法进行迭代:代码如下:#include <iostream.h>#include <math.h>void main(){double x[3]={0,0,0};double a[3][3]={-8,1,1,1,-5,1,1,1,-4}; double b[3]={1,16,7};double y[3];double e=0.04;double D=1;int f=0;while(D>e){D=0;for(int c=0;c<5;c++){for(int i=0;i<3;i++){y[i]=b[i];for(int j=0;j<3;j++){if(j!=i){y[i]=y[i]-a[i][j]*x[j];}y[i]=y[i]/a[i][i];if(fabs(x[i]-y[i])>=D){D=fabs(x[i]-y[i]);}}for(int l=0;l<3;l++){x[l]=y[l];}}f++;}for(int k=0;k<3;k++){cout<<x[k]<<endl;}cout<<f<<endl;}(2)赛德尔迭代法源代码如下:程序代码:#include <iostream.h>#include <math.h>#include<stdio.h>void main(){double x[3]={0,0,0};double a[3][3]={-8,1,1,1,-5,1,1,1,-4}; double b[3]={1,16,7};double y;double e=0.0001;double D=1;double f=0;while(D>e){D=0;for(int c=0;c<5;c++){for(int i=0;i<3;i++){y=b[i];for(int j=0;j<3;j++)if(j!=i){y=y-a[i][j]*x[j];}}y=y/a[i][i];if(fabs(x[i]-y)>=D){D=fabs(x[i]-y);}}for(int l=0;l<3;l++){x[l]=y[l];}}f++;}for(int k=0;k<3;k++){cout<<x[k]<<endl;};cout<<f<<endl;}四、计算结果(1)雅克比迭代法运行结果如下:(2)赛德尔迭代法运行结果如下:五、结果分析通过观察运行结果很容易发现使用赛德尔迭代法求解此线性方程组具有明显的优势,它的迭代次数明显少于雅克比迭代法,因此收敛速度更快。

相关主题