非线性方程迭代解法实验报告
- 格式:docx
- 大小:226.72 KB
- 文档页数:10
《数值分析》实验报告学院:数学与计算机学院专业:班级:姓名学号实验组实验时间指导教师成绩实验项目名称利用迭代法求方程的根实验目的1、掌握迭代法求根的数学原理。
2、掌握迭代法求根的计算机算法。
实验内容及要求内容:1、用迭代法求方程cosx5.0=x的近似根,要求误差不超过710-。
2.详细描述算法步骤并画出算法流程图形。
3.用表格列出迭代法的中间和最终结果。
要求:1、利用C语言,或Asp环境,或Matlab数学软件实现上述算法。
2、程序运行结果用表格显示出来3、保存程序运行结果,并结合算法进行分析。
4、要求实验报告最多两页,正反两面都要求打印。
实验原理将方程改写成x=)(xϕ,当方程在指定的区间上具有唯一的不动点(即迭代收敛)时,求原方程的零点就等价于求)(xϕ的不动点,选择一个初值x代入等式右端可得新的x的值,通过如此反复迭代后,求得的x的值会越来越逼近方程的根,一直迭代到误差满足要求即可。
实验仪器1、计算机一台。
2、安装IIS。
实验步骤Step1:选定满足迭代收敛的自变量的区间;Step2:选择迭代初值;Step3: 开始迭代,产生迭代后的新根,计算此时的误差;Step4: 如果误差不满足要求,返回Step3,否则输出结果,过程结束。
实验流程图开始选择迭代初值x确定收敛区间[a,b]迭代)(1kkxxϕ=+,2,1,0=k计算误差kkxx-+1结束误差是否小于7-10输出结果是否实验结果实验总结通过本次实验,我对迭代法求方程的根有了更深的认识,对其所用到的数学原理通过编程理解的更加清晰。
我是用Asp完成本次实验的,因为这样可以将结果很方便的用表格显示出来,让结果看起来比较清楚、明白和友好。
同时,我也用C语言编程实现过,结果是一样的,这也说明实验结果的正确性。
因为所给迭代方程是收敛的,不需要收敛性的验证,只要迭代达到误差的要求即可。
实验中遇到的一个问题是如何将结果中的小数点前的0补上去,让显示的更完整,通过网上查询,了解到可以根据对结果的判断将0加上去已达到完整显示,最终解决了这个问题。
⾮线性⽅程的迭代解法深圳⼤学实验报告实验课程名称:计算⽅法实验项⽬名称:⾮线性⽅程的迭代解法学院:计算机软件专业:计算机与科学技术报告⼈:学号:班级:04指导教师:实验时间:2010.5实验报告提交时间:2010.5.10教务处制实验报告包含内容⼀、实验⽬的与要求熟悉典型的迭代⽅法:⽜顿法、弦截法、⼆分法,了解各⾃的优缺点和适⽤范围掌握⾮线性⽅程的数值解法的基本思想和原理,深刻认识⾮线性⽅程的数值解法的意义⼆、模型建⽴x 5-3x 3+x-1= 0求该⽅程在区间[-8,8〕上的全部实根在区间[-8,8〕上的全部实根⼆分法:确定区间(a,b )后,取(a,b )的中点x(0)=(a+b)/2,若f(x(0))=0,则x(0)是根,否则,如f(a)*f(x(0))<0,令a1=a,b1=x(0);如f(x(0))*f(b)<0,令a1=x(0),b1=b 在(a1,b1)内⾄少有⼀个根,再取的中点如此进⾏下去Newtown 法:将⾮线性问题逐步线性化⽽形成如下迭代程序:弦截法:将Newton 迭代中的导数,⽤差商代替,有格式 Newtown 下⼭法:将⽜顿的迭代公式修改为),2,1,0()(')(1 =-=+k x f x f x x k k k k λ其中λ是⼀个参数,λ的选取应使)()(1k k x f x f <+ 成⽴当11)(ε<+k x f 或21ε<-+k k x x 时就停⽌迭代,且取x *≈ x k +1,否则再减⼩λ,继续迭代。
三、模型求解:3.1开发环境: Visual C++ 6.0)()()(111--+---=k k k k k k k x f x f x x x f x x3.2程序设计说明:程序设计根据⽜顿法、弦截法、⼆分法和newtown下⼭法思想和原理设计3.3:源代码:⼆分法:#include#include#define P 0.000001float getx(float x){return (x*x*x*x*x-(3*x*x*x)+x-1);};void main (){float y;float str1[20],str2[20];int i=0;str1[0]=-8;str2[0]=-1.3;while (str2[i]-str1[i]>P){y=(str1[i]+str2[i])/2;if(getx(str1[i])*getx(y)>P){str1[i+1]=y;str2[i+1]=str2[i];}else{str1[i+1]=str1[i];str2[i+1]=y;}i++;printf("%f %f\n",str1[i],str2[i]);}y=(str1[i]+str2[i])/2;printf("%f\n",y);}Newtown法:#include#include#define X 0.00000]1float nt(float x){return (x*x*x*x*x-(3*x*x*x)+x-1); }; float nt2(float y){return (5*y*y*y*y-9*y*y+1);};void main(){float c1,c2,x1=-1.3,x,dt;int i=1;while(i<20){c1=nt(x1);c2=nt2(x1);if(c1*c2==0){printf("%f\n",x1);exit(0);}x=x1-c1/c2;if(fabs(x)<=1)dt=fabs(x-x1);elsedt=fabs(x-x1)/fabs(x);if(dt{printf("%f \n",x1);printf("迭代次数=%d\n",i);exit(0);}}printf("%f\n",i);printf("迭代次数=%f\n",i);}弦截法:#include#include#include#define X 0.000001float xj(float x){return (x*x*x*x*x-(3*x*x*x)+x-1); };void main(){float x[20];float c1,c2,dt;int i=1;x[0]=1.5;x[1]=8;while(i<200){c1=xj(x[i]);c2=xj(x[i])-xj(x[i-1]);if(c1*c2==0){printf("%f\n",x[i]);exit(0);}x[i+1]=x[i]-(x[i]-x[i-1])*c1/c2;if(fabs(x[i+1])<=1)dt=fabs(x[i+1]-x[i]);elsedt=fabs(x[i+1]-x[i])/fabs(x[i+1]);printf("%f\n",x[i]);printf("迭代次数=%d\n",i);exit(0);}i++;}printf("%f %d\n",x[i],i);}Newtown下⼭法:#include#include#include#define X 0.000001double ntd(double x){return (x*x*x*x*x-(3*x*x*x)+x-1); }; double ntd2(double y){return (5*y*y*y*y-9*y*y+1);};void main(){double h,c1,c2,xo=8,x,dt;int i=1,j=0;while(i<20){j=0;c1=ntd(xo);c2=ntd2(xo);if(c1*c2==0){printf("%f\n",xo);exit(0);while(1){h=1*pow(0.5,j);x=xo-h*c1/c2;if(fabs(ntd(x))break;j++;}if(fabs(x)<=1)dt=fabs(x-xo);elsedt=fabs(x-xo)/fabs(x);if(dt{printf("%f\n",xo);printf("迭代次数=%d\n",i);exit(0);}xo=x;i++;}}3.4使⽤说明:直接运⾏程序3.5模型的解:⼼得体会:通过对⽐四种不同的迭代法解⾮线性⽅程,认识到各种的⽅法的优点和缺点。
非线性方程的迭代解法1.迭代函数对收敛性的影响实验目的:初步认识非线性问题的迭代法及其收敛性,认识迭代函数对收敛性的影响,知道当迭代函数满足什麽条件时,迭代法收敛。
实验内容:用迭代法求方程 012)(3=--=x x x f 的根。
方案一: 化012)(3=--=x x x f 为等价方程 )(213x x x φ=+= 方案二: 化012)(3=--=x x x f 为等价方程 )(123x x x φ=-= 实验要求:分别对方案一、方案二取初值00=x ,迭代10次,观察其计算值,并加以分析。
实验程序:实验结果:2. 初值的选取对迭代法的影响实验目的:通过具体的数值实验,体会选取不同的初值对同一迭代法的影响。
实验内容:用牛顿迭代法求方程 013=--x x 在x =1.5附近的根。
实验要求:对牛顿迭代公式 131231----=+k k k k k x x x x x ,分别取00=x ,5.10=x 迭代10次,观察比较其计算值,并分析原因。
实验程序:实验结果:3.收敛性与收敛速度的比较实验目的:通过用不同迭代法解同一非线性方程,比较各种方法的收敛性与收敛速度。
实验内容:求解非线性方程 0232=-+-x e x x 的根,准确到106-。
实验要求:(1) 用你自己设计的一种线性收敛的迭代法求方程的根,然后用斯蒂芬森加速迭代计算。
输出迭代初值、各次迭代值及迭代次数。
(2) 用牛顿迭代法求方程的根,输出迭代初值、各次迭代值及迭代次数,并与(1)的结果比较。
实验程序:1.普通迭代,选用初值0.52. 斯蒂芬森加速迭代3.牛顿迭代法实验结果:。
《数值计算方法》实验报告实验名称:实验1 非线性方程的简单迭代法和Steffensen 迭代法 实验题目:分别用简单迭代法和Steffensen 迭代法求方程 010423=-+x x在 [1, 2] 的一个实根.实验目的:理解并掌握简单迭代法和Steffensen 迭代法 基础理论:简单迭代法和Steffensen 迭代法1).简单迭代法的原理:将一元非线性方程:0)(=x f 改写成等价方程:)(x x ρ= ,对此,从某个初始值x0开始,对应式)(x x ρ= 构成迭代公式 ,...1,0),(1==+k x x k k ρ ,这样就可以确定序列 {}k x (k=0,1,2…)。
如果 {}k x 有极限*lim x x k k =∞→ ,由式 ,...1,0),(1==+k x x k k ρ 两边取极限可得 )(**x x ρ= ,可知 *x 为方程0)(=x f 的近似解。
2)Steffensen 迭代法的原理:通过把改进的Aitken 方法应用于根据不动点迭代所得到的线性收敛序列,将收敛速度加速到二阶。
()⎪⎪⎪⎩⎪⎪⎪⎨⎧+---===+k k k k k k k k k k k x y z x y x x y z x y 2)()(21ρρ[]x x x x x x x +---=)(2)(()()(2ρρρρψ实验环境:操作系统:Windows 7;实验平台:Turbo C++实验过程:写出算法→编写程序→调试运行程序→计算结果1)简单迭代法的算法:Input:初始近似值x0,精度要求del,最大迭代次数NOutput:近似解x 或失败信息1. n ←12. While n≤N do;3. x ←f(x0);4. if | x-x0|<del then5. | return x;6. end7. n←n+1;8. X0←x;9. End10. return False;// 超出最大迭代次数2)Steffensen迭代法的算法:Input : 区间端点a,b;精度要求del;最大迭代次数N Output:近似解或失败信息1. n←12. while n ≤N do;3. y←f(x0);4.z←f(y);5.x←x0-()202xyzxy+--;6.If |x-x0|<del then;7.| return x;8.end9.n←n+1;10.x0←x;11.end12.return False;实验结果a,用简单迭代法计算的结果结果约为1.365230b.用Steffensen迭代法计算的结果:近似解为:1.365230给出程序:1,简单迭代法的程序(C++)#include "stdio.h"#include "math.h"#define phi(x) 0.5*sqrt(10-x*x*x)void main(){int n=1,N;float x,x0,del;printf("x0="); scanf("%f",&x0); printf("\ndel=:"); scanf("%f",&del); printf("\nN="); scanf("%d",&N);printf("\nk x(k)");printf("\n %2d %f ",0,x0);while (n<N){ x=phi(x0);if(fabs(x-x0)<del){ printf("\n \n=近似解= %f \n",x);return;}printf("\n %2d %f ",n,x0);n=n+1; x0=x;}printf("\n \n%d次迭代后未达到精度要求.\n",N); }2,Steffensen迭代法的程序(C++)#include "stdio.h"#include "math.h"#define phi(x) 0.5*sqrt(10-x*x*x);void main(){int n=1,N;float x,x0,del,y,z,a,b;printf("x0="); scanf("%f",&x0);printf("\ndel=:"); scanf("%f",&del);printf("\na="); scanf("%f",&a);printf("\nb="); scanf("%f",&b);printf("\nN="); scanf("%d",&N);printf("\nk x(k)");printf("\n %2d %f ",0,x0);while (n<N){ y=phi(x0);z=phi(y);x=x0-(y-x0)*(y-x0)/(z-2*y+x0);if(fabs(x-x0)<del){ printf("\n \n=近似解= %f \n",x);return;}printf("\n %2d %f ",n,x0);n=n+1; x0=x;}printf("\n \n%d次迭代后未达到精度要求.\n",N);}结果分析:1.用简单迭代法和Steffensen迭代法都能求出非线性方程的近似解,且用简单迭代法和Steffensen迭代法求出的近似解基本一样。
实验二 非线性方程的数值解法1.1 实验内容和要求在科学研究和工程技术中大量的实际问题是非线性的,求非线性方程()0f x =满足一定精确度的近似根是工程计算与科学研究中诸多领域经常需要解决的问题。
实验目的:进一步理解掌握非线性方程求根的简单迭代法、埃特金Aitken 加速法、牛顿迭代法的思想和构造。
实验内容: 求方程2320x x x e -+-=的实根。
要求:(1)设计一种简单迭代法,要使迭代序列收敛,然后再用埃特金Aitken 加速迭代,计算到-8110k k x x --<为止。
(2)用牛顿迭代法,同样计算到-8110k k x x --<(3)输出迭代初值、迭代次数k 及各次迭代值,并比较算法的优劣。
1.2 算法描述普通迭代法计算步骤:(1)给定初始近似值0x ,eps 为精确度。
(2)用迭代公式x =x 2+2−e x 3进行迭代,直到-8110k k x x --<为止。
埃特金Aitken 加速迭代法计算步骤:(1)将()0f x =化成同解方程()x x ϕ=()k k y x ϕ= ,()k k z y ϕ=21()2k k k k k k k y x x x z y x +-=--+=22k k k k k kx z y z y x --+ (2)计算到-8110k k x x --<为止。
牛顿法计算步骤:给定初始近似值0x ,1ε为根的容许误差,2ε为()f x 的容许误差,N 为迭代次数的容许值。
计算00(),()f x f x '(1)如果0()0f x '=或者迭代次数大于N ,则算法失败,结束;否则执行(2)(2)按公式0100()()f x x x f x =-'迭代一次,得到新的近似值1x ,计算11(),()f x f x ' (3)如果101x x ε-<或者12()f x ε<,则迭代终止,以1x 作为所求的根,结束;否则执行(4)(4)以111(,(),())x f x f x '代替000(,(),())x f x f x ',转步骤(1)继续迭代。
计算方法实验报告专业班级:姓名:学号:实验成绩:1.【实验题目】非线性方程组求解2.【实验目的】(1).掌握二分法、迭代法、牛顿迭代法求方程近似根的基本思想与原理。
(2).掌握常用迭代算法的程序实现。
3.【实验内容】迭代法是求解非线性方程的基本方法,其构造方法可以有多种多样,但关键是怎样才能使迭代收敛且有较快的收敛速度。
考虑一个简单的代数方程,针对该方程,可以构造多种迭代法,如:取初始值,取,分别用以上迭代格式作实验,记录各算法的迭代过程4. 【实验要求】(1)取定某个初始值,按方案1~3对非线性方程求根,它们的收敛性如何?重复选取不同的初始值,反复实验。
请读者自行设计一种比较形象的记录方式(如利用Matlab的图形功能),分析三种迭代法的收敛性与初值选取的关系。
(2)对三个迭代格式的某一种,分别取不同的初始值进行迭代,结果如何?试分析迭代法对不同的初值是否有差异?(3)对代数方程,分别用方案1 用二分法求解;方案2 用牛顿法求解;5. 【算法描述】二分法算法步骤1)计算有根区间的端点a,b及预先给定的精度e。
2)计算中点(a+b)/2。
3)若f(x)f(a)<0,则x b,转向4);否则,x a,转向4).⇒⇒4)若b-a<e,则输出满足精度的根x,结束;否则转向2)。
牛顿法迭代法的计算步骤x01)给出初始近根及精度e。
2)计算。
x x x x f f 1000)(')(⇒-3)若|-|<e ,则转向4);否则转向2)。
x 1x 0x x 01⇒4)输出满足精度的根,结束。
x 16. 【源程序(带注释)】二分法#include<stdio.h>#include<math.h>#include<conio.h>#include<windows.h>float f(float x){float a;a=x*x*x-x-1;return a;} /*求函数值,如果求其它函数,只需改成其它函数即可*/ main(){float a,b,e,x; /* a,b 分别表示有根区间的左、右端点, e 是精度要求,x 区间中点值*/system("CLS");//清屏printf("对代数方程x^3-x-1=0,分别用\n 方案1 用二分法求解\n");printf(" \n please input data a =");scanf("%f",&a);printf(" \n please input data b=");scanf("%f",&b);if(f(a)*f(b)<0){while(f(x)!=0){x=(a+b)/2;if(f(x)*f(a)<0){b=x;if(fabs(b-a)<0.000001)break;elsecontinue;}else{a=x;if(fabs(b-a)<0.000001)break;else continue;}}printf("\n");x=(b+a)/2;printf("the root of f(x)=0 is x=%f\n",x);}elseprintf("\ not root! afresh input\n"); /*表示[a,b] 区间无根,重新选择有根区间*/getch();return(x);}牛顿法#include<stdio.h>#include<math.h>#include<conio.h>#include<windows.h>#define maxrept 1000 /*最大迭代次数*/float f(float x) {float a;a=x*x*x-x-1;return a; /*函数f(x) */}float df(float x) {return(1+exp(-x)); /* 函数f(x)的导数) (x f ′*/ }float iterate(float x) {float x1;x1=x-f(x)/df(x); /* 牛顿迭代函数iterate(x)=x-f(x) / ) (x f ′*/return(x1);}main() {float x0,x1,d;int k=0;//clrscr();system("CLS");printf("对代数方程x^3-x-1=0,分别用\n方案2 用牛顿法求解\n");printf("\n please input x0="); /* 输入迭代初值x0 */scanf("%f",&x0);printf("\n k xk\n");printf("\ %d %f\n",k,x0);do {k++;x1=iterate(x0);printf(" %d %f\n",k,x1);d=fabs(x1-x0);x0=x1;}while((d>=0.000001)&(k<maxrept));if(k<maxrept)printf("the root of f(x)=0 is x=%f, k=%d\n",x1,k);elseprintf("\n the iteration is failed!\n");getch();}7.【实验结果与分析总结(含运行结果截图)】。
非线性方程的迭代法”1. 实验题目设方程f (x )=x 3-3x-1=0有3个实根x1*=1.8793,x2*=-0.34727,x3*=-1.53209.现采用下面6种不同计算格式,求f (x )=0的根x1*,x2*。
(a) x=2x 1x 3+ (b) x=313+x (c) x=313+x (d) x=312-x (e) x=x/13+ (f) x=x-31 要求如下:(1)编制一个程序进行运算,最后打印出每种迭代格式的敛散情况;(2)用误差估计|x1n +-xn |<del来控制迭代次数,并且打印出迭代的次数;(3)观察初始值的选取对迭代收敛有何影响;(4)分析迭代收敛和发散的原因。
2. 实验目的掌握用迭代法求解线性方程组,加深对用迭代方程求方程根的理解3. 基础理论4. 实验环境Visual C++ 语言5. 实验过程#include<iostream.h>#include<stdio.h>#include<math.h>#define pha(x) 3*x+1/x*x#define phb(x) (x*x*x-1)/3#define phc(x) pow(3*x+1,1/3.0)#define phd(x) 1/(x*x-3)#define phe(x) sqrt(3+1/x)#define phf(x) x-((x*x*x-3*x-1)/((x*x-1)*3)) void main(){int N;double x,x0,del;cout<<"初始近似值x0=";cin>>x0;cout<<"精度del=";cin>>del;cout<<"最大迭代次数N=";cin>>N;double s;for(int k=1;k<7;k++){int n=1;if(k==1){s=fabs(pha(x0+1e-4)-pha(x0))/1e-4;cout<<"使用a计算方法:"<<endl; }if(k==2){s=fabs(phb(x0+1e-4)-phb(x0))/1e-4;cout<<"使用b计算方法:"<<endl; }if(k==3){s=fabs(phc(x0+1e-4)-phc(x0))/1e-4;cout<<"使用c计算方法:"<<endl; }if(k==4){s=fabs(phd(x0+1e-4)-phd(x0))/1e-4;cout<<"使用d计算方法:"<<endl; }if(k==5){s=fabs(phe(x0+1e-4)-phe(x0))/1e-4;cout<<"使用e计算方法:"<<endl; }if(k==6){s=fabs(phf(x0+1e-4)-phf(x0))/1e-4;cout<<"使用f计算方法:"<<endl; }if(s>0&&s<1){cout<<"该迭代公式收敛"<<endl;while(n<N){if(k==1) x=pha(x0);if(k==2) x=phb(x0);if(k==3) x=phc(x0);if(k==4) x=phd(x0);if(k==5) x=phe(x0);if(k==6) x=phf(x0);if(fabs(x-x0)<del){cout<<"近似解为:"<<x<<endl;cout<<"迭代次数为:"<<n<<endl<<endl;n=N+1;}elsen=n+1;x0=x;if(n==N)cout<<"超过最大的迭代次数,得不到所要求近似解。
《数值分析》实验报告实验1 非线性方程的迭代法1.实验名称实验 非线性方程的迭代法2.实验题目设方程f(x)=x3-3*x-1=0有三个实根,X1*=1.8793,X2*= -0.34727,X3*= -1.53209,现采用下面6种不同的计算格式,求f(x)=0的根x1*,x2*。
(a) x=21x 3+ (b) x=31x 3- (c) x=31x 3+ (d) x=3x 12- (e) x=x 13+ (f) x=x-311-x 1-x 3-x 23 要求如下:(1)编制一个程序进行运算,最后打印出每种迭代格式的敛散情况。
(2)用误差估计|xn+1-xn|<ε来控制迭代次数,并且打印出迭代的次数。
(3)观察初始值的选取对迭代收敛有何影响。
(4)分析迭代收敛和发散的原因。
3实验过程:(利用C 语言及迭代算法编写代码如下)#include<stdio.h>#include<math.h>double fa(double x){return (3*x+1)/(x*x);}double fb(double x){return (x*x*x-1)/3;}double fc(double x){return pow( (3*x+1),1.0/3.0);}double fd(double x){return 1/(x*x -3);}double fe(double x){return sqrt(3+1/x);}double ff(double x){return x-(x*x*x-3*x-1)/( 3* (x*x-1) ); }int main(){double e,x,x0,x1;int n,count,i;printf("请输入最大迭代次数N: ");scanf("%d",&n);printf("请输入函数的一个近似值X: "); scanf("%lf",&x1);printf("请输入误差估计值e: ");scanf("%lf",&e);for(i=1;i<=6;i++){printf("函数f%c()的结果\n",'a'-1+i);count=1;x0=x1;while(count<=n){switch(i){case 1: x=fa(x0); break;case 2: x=fb(x0); break;case 3: x=fc(x0); break;case 4: x=fd(x0); break;case 5: x=fe(x0); break;case 6: x=ff(x0); break;}// x=fb(x0);if(fabs(x-x0)<e){printf(" x= %lf\n\n",x0);break;}else{printf("%d %lf\n",count,x);x0=x;count++;}}if(count>n)printf("循环次数超过%d,没求出结果\n\n",count-1);}return 0;}实验结果:取迭代最大次数N为50,ε=0.0000001,近似初始值如下表的结果如下表(n为迭代次数):实验数据分析:显然:对于函数a取初始值X1*=1.8793,X2*= -0.34727时,迭代次数是超过50次的,即函数a在X1*=1.8793,X2*= -0.34727可能是发散的。
求解非线性方程实验报告一.实验目的:通过本节实验课的学习,要求我们理解并掌握二分法、不动点迭代、牛顿切线法及弦截法解非线性方程求根的原理,掌握相应的算法原理,通过计算机解决实验问题二.实验内容:1、用对分区间法方程1-x-sinx=0在区间[0,1]上的误差小于10^(-4)的一个根,并记录对方区间的次数。
2、用不动点迭代法求解方程下x-log(x)=2(x>1)要求相对误差容限e=10^(-8)。
3、用Newton法求方程x^3-x-1=0在区间[-3,3]上的误差不大于10^(-5)的根,分别取初值x0=1.5, x0=0, x0=-1进行计算,比较他们的迭代次数。
三. 实验方案(程序设计说明)[包括算法设计思路,必要的流程图,界面设计说明、使用模块及变量的说明等。
]1、二分法是对区间收索法的一种改进,具体做法为:先求一区间的中点,并计算其函数值,若恰好有函数值为0,就是方程的根,若不为0,在判断此点的函数值与两端的函数值乘积的情况,取小于0的那个端点在进行上述对分,直到满足要求为止。
2、迭代法分为两种,一种是从任何可取的初值出发都能保证收敛,称之为大范围收敛的方法。
另一类称之为局部收敛法,即为了保证收敛必须选取初值充分接近于所要求的解。
迭代法的基本思想是一种逐渐逼近的方法,首先给定一个粗造的初值,然后用一个迭代公式,反复矫正这个初值,直到满足预先给出的精确要求为止。
3、双点弦接法与Newton法不同,两者有本质的区别,它分为两步,不属于不动点迭代法。
四. 实验步骤或程序(经调试后正确的源程序)(填写主要步骤与程序代码等,不够可附页)1、f=inline('x+sin(x)-1');a=0;b=1;dlt=1.0e-4;k=1;while abs(b-a)>dltc=(a+b)/2;if f(c)==0break;elseif f(c)*f(b)<0a=c;else b=c;endfprintf('k=%d,x=%.5f\n',k,c); k=k+1;end2、eps=10^(-8);dx=1;x0=3.5;k=0;while(dx>eps)k=k+1;x=log(x0)+2;dx=abs(x-x0)/(1+abs(x));x0=x;endkx3、f=inline('x^3-x-1');df=inline('3*x^2-1');d2f=inline('6*x');a=-3;b=3;dlt=1.0e-5;if f(a)*d2f(a)>0x0=a;elsex0=b;endm=min(abs(df(a)),abs(df(b)));k=0;while abs(f(x0))>m*dltk=k+1;x1=x0-f(x0)/df(x0);x0=x1;fprintf('k=%d x=%.5f\n',k,x0); end for x0=1.5fprintf('k=%d x=%.5f\n',k,x0); end for x0=0fprintf('k=%d x=%.5f\n',k,x0); end for x0=-1fprintf('k=%d x=%.5f\n',k,x0); end 五.程序运行结果:1、k=1,x=0.50000k=2,x=0.75000k=3,x=0.62500k=4,x=0.56250k=5,x=0.53125k=6,x=0.51563k=7,x=0.50781k=8,x=0.51172k=9,x=0.50977k=10,x=0.51074k=11,x=0.51123k=12,x=0.51099k=13,x=0.51086k=14,x=0.51093 2、k =15x =3.14623、k=1 x=-2.03846 k=2 x=-1.39028k=3 x=-0.91161k=4 x=-0.34503k=5 x=-1.42775k=6 x=-0.94242k=7 x=-0.40495k=8 x=-1.70690k=9 x=-1.15576k=10 x=-0.69419 k=11 x=0.74249k=12 x=2.78130k=13 x=1.98273k=14 x=1.53693k=15 x=1.35726k=16 x=1.32566k=17 x=1.32472当x0=1.5时:k=17 x=1.50000当x0=0时:k=17 x=0.00000当x0=-1时:k=17 x=-1.000002、六.实验总结:通过实验学会理解并掌握二分法、不动点迭代、牛顿切线法及弦截法解非线性方程求根的原理,掌握相应的算法原理,通过计算机解决实验问题并通过反复的上机实验操作,解决了在实验过程中遇到的实验问题,并了解了一些函数的特殊用法,学会了用这三种基本方法解决实际遇到的问题,并了解了二分法、不动点迭代、牛顿切线法及弦截法的各种变形算法。
深圳大学实验报告
课程名称:计算方法
实验项目名称:非线性方程迭代解法
学院:计算机与软件学院
专业、班级:09 计算机科学与技术05班
}
ax[k]=x2;
//printf("用%d次牛顿迭代求得一个根,值为:\n",j);//迭代次数
//printf("用%d次牛顿简化迭代求得一个根,值为:\n",j);//牛顿简化//sprintf("用%d次弦割迭代求得一个根,值为:\n",j);//弦割
printf("用%d次下山迭代求得一个根,值为:\n",j);//下山
printf("ax%d=%.9lf\n",k+1,ax[k]);//输出根
k++;//记录根个数
}
getchar();
getchar();
}
3.3 模型的解(含运行结果截图)
图1:牛顿迭代
图1:简化牛顿迭代
图3:弦割法
图4:下山法
3.4 结果分析
用牛顿迭代解法的收敛速度最快,求解的时候分别只用4次和3。