非线性方程求解实验报告
- 格式:docx
- 大小:53.41 KB
- 文档页数:4
第七章非线性方程解法⒈二分法考察有根区间[a, b],取中点x0=(b+a)/2 将它分为两半,假设中点x0不是f(x)的零点,然后进行根的搜索,即查找f(x0)与f(a)是否同号,如果确系同号,说明所求的根x*在x0的右侧,这是令a1= x0,b1=b;否则x*必在x0的左侧,这是令a1=a,b1=x0,不管出现哪一种情况,新的有根区间[a1, b1]的长度仅为[a, b]的一半。
.重复以上做法得新近似根x1,…这样不断将区间分半,得到一系列区间[an , bn],和近似根(区间中点)nx,n=0,1,2,3…,nx误差为(b-a)/2n+1.这样的方法称为二分法。
下面是一个关于二分法的例子。
例1求f(x)=x3- x-1=0在区间[1,1.5]内的一个实根,要求准确到小数点后的第二位.这里a=1,b=1.5,而f(a)<0,f(b)>0。
取[a,b]的中点x0=1.25,将区间二等分,由于f(x0 )<0, 既f(x0 )与f(a)同号,故所求的根x*必在x0 右侧,这是应令a1=x0 =1.25, b1=b=1.5,而得到新的有根区间[a1,b1],这样继续结果如下表:x6.实际上x5就有三位有效数字了.二分法实验(1)上机题目:二分法的应用实验目的:熟悉二分法并在计算机上实现实验要求:①上机前充分准备,复习有关内容,写出计算步骤,查对程序;②完成实验后写出完整的实验报告,内容应该包括:所用的算法语言,算法步骤陈述,变量说明,程序清单,输出计算结果,结果分析等等;③用编好的程序在Matlab环境中执行。
算法说明:①找出计算f(x)在有限根区间[a, b]端点的值,f(a),f(b)②计算计算f(x)在区间中点(2ba+)处的值f(2ba+) .③判断若f(2ba+)=0,则2ba+即是根,计算过程结束,否则检验若f(2ba+)f(a)<0,则以2ba+代替b,否则以2ba+代替a.反复执行步骤②和步骤③,直到区间[a, b]长度小于允许误差ξ,此时中点2ba+即为所求近似根。
实验报告学院:电子信息工程实验课程:计算方法学生姓名:学号:专业班级:通信工程实验二非线性方程求根1 目的与要求(1)进一步熟练掌握求解非线性方程的二分法与Newton迭代法。
(2)掌握二分法与Newton迭代法的算法,能运用程序设计语言和此方法编制软件求出任意指定一元三次方程在给定点附近的根。
2 实验内容用二分法和Newton迭代法求方程310x x--=在1.5 附近的根,精确到310-,输出每次的迭代结果并统计所用的迭代次数。
3 实验原理(1)二分法实验原理取[a,b]区间二等分的中点x1 =(a+b)/2(1)若f(x1)=0,则x1是f(x)=0的实根。
(2)若f(a)f(x1)<0 成立,则x* 必在区间(a, x1)内,取a1=a,b1= x1;否则x*必在区间(x1,b)内,则取a1= x1,b1=b,这样,得到新区间[a1,b1],其长度为[a,b]的一半。
(3)如此继续下去,进行n次等分(2)Newton迭代法实验原理4 程序设计(1)流程图二分法程序流程图Newton迭代法程序流程图(2)程序代码①二分法求非线性方程根#include<stdio.h>#include<math.h>double fun1(double x){return x*x*x-x-1;}double fun2(double x1,double x2){return (x1+x2)/2;}main(){int n=1;float a,b,c;printf("二分法求非线性方程的根\n"); scanf("a=%f,b=%f",&a,&b);if (fun1(a)*fun1(b)<0){while(fabs(b-a)>1e-3){c=fun2(a,b);if (fun1(a)*fun1(c)<0){b=c;}else if (fun1(c)*fun1(b)<0){a=c;}else{break;}printf("当前计算次数为%d 计算结果为%lf\n",n,fun2(a,b));n++;}}else{printf("不符合二分法使用条件,请重新输入:\n"); }}②Newton迭代法#include<stdio.h>#include<math.h>double fun1(double x){return x*x*x-x-1;}double fun2(double x){return 3*x*x-1;}double root(double num){double x1,x0;int n=1;x0=num;if (fun2(x0)==0){printf("Algorithm failed. Exit !"); }else{x1=x0-fun1(x0)/fun2(x0);printf("Newton迭代法求根\n");}while (fabs(x1-x0)>1e-3){printf("当前计算次数为%d 计算结果为%lf\n",n,x1); x0=x1;x1=x0-fun1(x0)/fun2(x0);n++;}}main(){root(1.5);}5 实验结果与分析(1)二分法求根结果界面(2)Newton迭代法求根结果界面分析:(1)本次试验两种算法均采用了while循环及if-else判断语句,编程函数并由主函数调用,较简单的实现了二分法与Newton迭代法的编程任务。
数值分析实验报告——非线性方程求根一、实验目的:1.掌握求解非线性方程的常用方法;2.了解非线性方程求根问题的数值解法;3.熟悉使用数值分析软件进行非线性方程求根的实现。
二、实验原理:非线性方程指的是形如f(x)=0的方程,其中f(x)是一个非线性函数。
非线性方程求根的常用方法包括二分法、割线法和牛顿法等。
其中,二分法是通过不断缩小区间范围来逼近方程的解;割线法是通过使用割线来逼近方程的解;牛顿法则是通过使用切线来逼近方程的解。
对于给定的非线性方程,可以根据实际情况选择合适的方法进行求根。
三、实验内容:1.编写求解非线性方程的函数,包括二分法、割线法和牛顿法;2.使用编写的函数求解给定的非线性方程,比较各个方法的收敛速度和精确程度;3.根据实际情况分析和选择合适的方法进行求根。
四、实验步骤:1.针对给定的非线性方程,编写二分法的函数实现:(1)首先确定方程的解存在的区间;(2)根据方程的解存在的区间,使用二分法逐步缩小区间范围;(3)根据设定的精度要求,不断循环迭代,直至满足要求或达到迭代次数限制;2.针对给定的非线性方程,编写割线法的函数实现:(1)首先需要确定方程的解存在的初始点;(2)根据方程的解存在的初始点,根据割线的定义进行迭代;(3)设定迭代的精度要求和限制次数,结束迭代;3.针对给定的非线性方程,编写牛顿法的函数实现:(1)首先需要确定方程的解存在的初始点;(2)根据方程的解存在的初始点,根据牛顿法的定义进行迭代;(3)设定迭代的精度要求和限制次数,结束迭代;4.根据给定的非线性方程,分别使用二分法、割线法和牛顿法进行求解,并比较各个方法的收敛速度和精确程度;5.分析实际情况,选择合适的方法进行求解。
五、实验结果:4.通过比较,发现割线法和牛顿法的收敛速度较快,精确程度较高,因此选择割线法进行求解。
六、实验总结:通过本次实验,我掌握了求解非线性方程的常用方法,并使用数值分析软件实现了二分法、割线法和牛顿法。
高数实验报告一.实验问题.1.利用弦截法编程求求解x^5+x+-1=0的近似解;2.方程f(x)=x^2+x-4=0在(0,4)内有唯一的实根,现构造以下三种迭代函数(1)g1(x)=4-x^2,迭代初值为x0=4;(2)g2(x)=4/(1+x),迭代初值为x0=4;(3)g3(x)=x-(x^2+x-4)/(2x+1), 迭代初值为x0=4;3.分别取不同的参数值r,做迭代序数(11 -6),观察分叉和馄饨现象二.问题分析这三个题目中前两个题目都是利用弦截法和迭代法处理近似解,亦即利用无限替代与收敛判定达到求近似解的目的,所以按老师所讲授的方法类比操作即可。
第三个题目要求完成不同的参数r下迭代的实验步骤。
通过多次迭代变换以及收敛判定,易得实验结果及图像如下(四实验结果)中所示。
三.程序设计程序源代码1.弦截法f=inline('x^5+x-1');a=0;b=1;dlt=1.0e-5;x=1;k=1;while abs(f(x))>a*dltx=b-(b-a)*f(b)/(f(b)-f(a))a=x;k=k+1vpa(x,7)end2.迭代1f=inline('x^2+x-4');fzero(f,[0,4])a=0;b=4;dlt=1.0e-5;x=1;k=0;while k<4;x=4-a^2a=x;endans =1.5616k =1x =4k =2x =-12k =3x =-140k =4x =-19596迭代2f=inline('x^2+x-4'); fzero(f,[0,4])a=0;b=4;dlt=1.0e-5; x=1;k=0;while k<4;k=k+1x=4/(1+x)a=x;endans =1.5616k =1x =2k =2x =1.3333k =3x =1.7143k =4x =1.4737迭代3f=inline('x^2+x-4'); fzero(f,[0,4])a=0;b=4;dlt=1.0e-5; x=1;k=0;k=k+1x=x-(x^2+x-4)/(2*x+1)a=x;endans =1.5616k =1x =1.6667k =2x =1.5641k =3x =1.5616k =4x =1.56163.步骤1clear;for r=0:0.3:3.9;x=0.9;for i=1:150x=r*x*(1-x);x1(i)=i;y(i)=x;endfor k=1:50xx(k)=r; yy(k)=y(100+k); endhold on; grid on;plot(xx,yy,'ko')end步骤3clear;for j=270:390;x=0.9; r=j/100;for i=1:100x=r*x*(1-x);x1(i)=i;y(i)=x;endfor k=1:50xx(k)=r; yy(k)=y(50+k);endhold on;grid on;plot(xx,yy,'ko')end四.实验结果实验输出图像1k =2ans =.5000000k =3ans =.6595745k =4ans =.7199516k =5ans =.7422761k =6ans =.7503618k =7ans =.7532636k =8ans =.7543013k =9ans =.7546719k =10ans =.7548042k =11ans =.7548515k =12ans =.7548683k =13ans =.7548743k =14ans =.7548765由实验结果可知,弦截法比牛顿收敛法的运算速度慢,效率较低。
计算方法实验报告专业班级:姓名:学号:实验成绩: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)=0,需要求解方程的根。
2.初始化:选择一个初始解x_0,并给定停止准则,如迭代次数、函数误差等。
3.迭代计算:a)计算函数f(x)在x_i处的导数f'(x_i)。
b)利用牛顿迭代公式进行迭代计算:x_{i+1}=x_i-f(x_i)/f'(x_i)。
c)检查迭代终止条件,若满足条件则停止迭代,否则返回步骤a)继续迭代。
4.输出结果:输出迭代过程中的迭代次数和解x。
三、实验结果我们选择一个较为简单的非线性方程f(x)=x^2-2来进行牛顿法求解。
初始解选取为x_0=1,停止准则为函数误差小于等于0.0001根据上述计算方法,我们进行迭代计算,并记录迭代次数和解x的变化情况。
具体结果如下表所示:迭代次数解x-----------------11.521.416731.414241.4142(收敛)从表中可以看出,当迭代4次时,解x已经收敛于1.4142,符合停止准则,因此我们可以认为此时已经找到了方程的根。
四、实验讨论通过上述实验可以发现,牛顿法是一种有效的求解非线性方程的方法。
它利用了函数在特定点处的导数的信息来逼近函数的零点,从而实现了迭代计算。
同时,牛顿法的收敛速度比较快,迭代次数较少,可以在较短的时间内找到方程的根。
然而,牛顿法也存在一些不足之处。
首先,它对初始解的选择较为敏感,不同的初始解可能导致迭代结果的差异。
其次,牛顿法可能出现发散现象,即迭代过程无法收敛到方程的根。
因此,对于一些复杂的非线性方程,我们需要选择合适的方法来求解。
五、总结通过本次实验,我们了解了牛顿法求解非线性方程的基本过程,并验证了其有效性。
实验6 非线性方程求解化学工程系分0 毕啸天 2010011811【实验目的】1.掌握用MATLAB 软件求解非线性方程和方程组的基本用法,并对结果作初步分析。
2.练习用非线性方程和方程组建立实际问题的模型并进行求解。
【实验内容】题目1分别用fzero和fsolve程序求方程sinx−x 22=0的所有根,准确到10-10,取不同的初值计算,输出初值、根的近似值和迭代次数,分析不同根的收敛域;自己构造某个迭代公式(如x=(2sinx)1/2等)用迭代法求解,并自己编写牛顿法的程序进行求解和比较。
1.1模型分析fzero命令主要用于单变量方程的求根,主要采用二分法、割线法和逆二次插值法等的混合方法。
fzero至少需要两个输入参数:函数、迭代初值(或有根区间)。
fsolve命令主要用于非线性方程组的求解,可以输出结果(如x点对应的雅可比矩阵等)。
本题可先作出该方程两边所代表的函数的图像。
可以看出,y=sinx是一个周期性有界函数,而二次函数在对称轴两边增长无界。
我们可以直接观察出x=0是方程的解,再从图上可以观察到在1到2之间有一个根。
而由两函数性质,在[0,2]之外,二次函数增长,而三角函数波动,再也不会有交点。
从而可知此方程只有两解。
1.2求根程序代码1.2.1 用fzero求解x=-4:0.1:4;y1=sin(x);y2=x.^2/2;plot(x,y1,x,y2);%先作出函数图像,大致观察出解的数目与分布opt=optimset('fzero');opt=optimset(opt,'tolx',1e-10);[x,fv,ef,out]=fzero(inline('sin(x)-x^2/2'),[1,2],opt)[x,fv,ef,out]=fzero(inline('sin(x)-x^2/2'),[-1,1],opt)输出结果如下:x =1.40441482402454fv =8.41122727024413e-011ef =1out =iterations: 7funcCount: 9algorithm: 'bisection, interpolation'message: [1x33 char]另一根为:x =1.74713912083679e-011fv =1.74713912082153e-011从而可知,方程一根为x=1.4404,另一根即为x=0。
实验名称: 牛顿法解非线性方程组1引言我们已经知道,线性方程组我们可以采取Jacobi 迭代法,G-S 迭代法以及SOR 迭代方法求解。
而在科学技术领域里常常提出求解非线性方程组的问题,例如,用非线性函数拟合实验数据问题、非线性网络问题,用差分法求解非线性微分方程问题等。
我们在解非线性方程组时,也考虑用迭代法求解,其思路和解非线性方程式一样,首先要将F(x)=0转化为等价的方程组12(,,,),(1,2,)i i n x g x x x i n == 或者简记为x =g (x ),其中:,:n n ni g R R g R R →→1122()()(),()nn n g x g x g R g x ⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥==∈⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦x x x x x 迭代法:首先从某个初始向量开始,按下述逐次代入方法构造一向量序列:(0)x (){}k x (1)()()1(,,),(1,2,,)k k k i i n x g x x i n +== 其中,。
()()()()12(,,,)k k k k T n x x x =x 或写成向量形式:(1)()(),(0,1,2,)k k g k +==x x 如果(存在),称为收敛。
且当为连续函数时,可得()*l i m k k →∞≡x x (){}k x ()i g x *()*(l i m )()k k g g →∞==x x x 说明为方程组的解。
又称为x =g (x )的不动点。
*x 本实验中采用牛顿迭代法来求解非线性方程组。
2实验目的和要求运用matlab 编写一个.m 文件,要求用牛顿法非线性方程组:12(0)(1)()3211cos 02,(取(0,0),要求10)1si n 02Tk k x x x x x x x +-∞⎧-=⎪⎪=-<⎨⎪-=⎪⎩3算法原理与流程图1、算法原理设有非线性方程组F(x )=0其中:12()((),(),,())Tk F f f f =x x x x 由偏导数作成的矩阵记为J(x )或称为F(x )的Jacobi 矩阵()i f x '()F x 111122221212()()()()()()()'()()()()n n n n n n f f f x x x f f f J x F x x x x f f f x x x ⎡⎤∂∂∂⎢⎥∂∂∂⎢⎥⎢⎥∂∂∂⎢⎥≡≡∂∂∂⎢⎥⎢⎥⎢⎥⎢⎥∂∂∂⎢⎥∂∂∂⎢⎥⎣⎦x x x x x x x x x设为F(x )=0的解,且设,为的近似解,现利用多元函*x ()()()()12(,,,)k k k k T n x x x =x *x 数 在点的泰勒公式有()i f x ()k x ()()()()()1112()(),1()()()()()()()1()()()2k k k k k i i i i n n nn k k i ij j l l i j l j lf f f f x xx x x x f x x x x P R x x =∂∂=+-++-∂∂∂+--≡+∂∂∑x x x x C x 其中,在与x 的所连的线段内。
实验十一非线性方程组求解练习三(4)题目:用牛顿切线迭代法求x^2-2*x*eps(-x)+eps(-x)=0的根。
能否构造出其他形式的迭代序列,使其收敛到该方程的一个根。
牛顿切线迭代法程序:f=inline('x^2-2*x*exp(x)+exp(-x)');df=inline('2*x-2*exp(x)-2*x*exp(x)-exp(-x)');d2f=inline('2-4*exp(x)-2*x*exp(x)+exp(-x)');a=-1;b=1;dlt=1.0e-5;if f(a)*d2f(a)>0x0=a;elsex0=b;endm=min(abs(df(a)),abs(df(b)));k=1;while abs(f(x0))>m*dltx1=x0-f(x0)/df(x0);x0=x1;vpa(x0,7)k=k+1end结果:弦截法程序:f=inline('x^2-2*x*exp(x)+exp(-x)');x0=0;b=1;dlt=1.0e-5;k=1;while abs(f(x0))>dltx1=b-(b-x0)*f(b)/(f(b)-f(x0));x0=x1;vpa(x0,7)k=k+1end结果:练习四(1)题目:Feigenbaum在做研究时,对超越函数y=rsin(pi*x)(r为非负实数)进行了分叉和混沌的研究,试利用迭代格式x(k+1)=r*sin(pi*x(k)),做出相应的Feigenbaum图。
程序:clear;clf;hold onfor r=0.1:0.005:1x=[0.1];fori=2:150x(i)=r*sin(pi*x(i-1));endfprintf('r=%.3f\n',r)fori=101:150plot(r,x(i),'k.');endend结果:练习五(3)题目:有一艘宽为5m的长方形驳船欲驶过某河道的直角湾,经测量知河道的宽为10m 和5m,试问要驶过该直角湾驳船的长度不能超过多少米?程序:Syms xf=(((10/tan(x))+12)*sin(x)-5)/(sin(x)*cos(x)); %建立船长与角度的关系diff(f,x)z=inline('(-10/tan(x)^2*(1+tan(x)^2)*sin(x)+(10/tan(x)+12)*cos(x))/sin(x)/cos(x)-((10/tan(x)+12)* sin(x)-5)/sin(x)^2+((10/tan(x)+12)*sin(x)-5)/cos(x)^2');a=0;b=3.14;dlt=1.0e-5;while abs(b-a)>dltc=(a+b)/2if z(c)==0break;elseif z(c)*z(b)<0a=c;else b=c;endfprintf('k=%d,x=%.5f\n',k,c);k=k+1;end结果:k=1,x=1.57000k=2,x=0.78500k=3,x=0.39250k=4,x=0.58875k=5,x=0.68688k=6,x=0.73594k=7,x=0.71141k=8,x=0.72367k=9,x=0.72980k=10,x=0.73287k=11,x=0.73134k=12,x=0.73210k=13,x=0.73172k=14,x=0.73191k=15,x=0.73201k=16,x=0.73196k=17,x=0.73198k=18,x=0.73200k=19,x=0.73200结论:用程序x=0.73200;s=eval(f);求得s=21.0372。