求解非线性方程实验报告
非线性方程求解实验
第二部分:提高实验(例题讲解) 第二部分:提高实验(例题讲解) 1、编写二分法法的Matlab程序。 2、利用所编写的程序求解非线性方程的近似解。 例如:求方程 f ( x ) = x 3 − x − 1 = 0在区间[1,1.5]内 的根,要求误差不超过0.005. 首先定义函数erfenfa.m 然后在Matlab窗口下输入: >> erfenfa 输入函数f(x)='x^3-x-1' 输入区间=[1,1.5] 请输入误差=0.005
第二部分:提高实验(学生操作) 第二部分:提高实验(学生操作) 1、编写二分法法的Matlab程序。 2、利用所编写的程序求解非线性方程的近似解。 利用二分法求方程 x 3 − 2 x 2 − 4 x − 7 = 0在区间 [3,4]内的根,要求误差不超过0.0005.
第三部分:创新实验(学生操作) 第三部分:创新实验(学生操作) 1、编写Newton迭代法的Matlab程序。 2、利用源程序求解非线性方程的近似解。 利用牛顿法求方程 x 2 − 2 x − 3 = 0 的近似根,取初 始值为4,要求误差不超过0.0001.
实验二: 实验二:非线性方程典型解法的数值实验 数学实验室
本次实验的目的: 本次实验的目的: 1、掌握基本的绘图命令Plot,ezplot。 掌握基本的绘图命令Plot,ezplot。 Plot,ezplot 2、编写Matlab程序,利用二分法求非线性方程的 编写Matlab程序, Matlab程序 近似解。 近似解。 3、在Matlab软件中,用迭代法求解非线性方程的 Matlab软件中, 软件中 近似解。 近似解。 4、编写Matlab程序,利用牛顿法求非线性方程的近 编写Matlab程序, Matlab程序 似解。 似解。
解非线性方程实验
实验 2 解非线性方程实验实验目的:进一步熟练掌握解非线性方程的二分法算法、Steffensen算法、牛顿迭代法,提高编程能力和解算非线性方程问题的实践技能。
实验内容:用二分法算法(取[a,b]=[1,2])、Steffensen算法(取)、牛顿迭代法(取)解算非线性方程的根实验原理二分法算法Steffensen算法牛顿迭代法实验步骤1 要求上机实验前先编写出程序代码2 编辑录入程序3 调试程序并记录调试过程中出现的问题及修改程序的过程4 经反复调试后,运行程序并验证程序运行是否正确。
5 记录运行时的输入和输出。
实验思考试验改变Steffensen算法的迭代初值进行计算,试验改变牛顿迭代算法的迭代初值进行计算,分别对比计算结果并作出分析总结数学建模与应用:请建立数学模型并应用你的程序解决一个物理计算问题--木质球体浸入水中深度问题。
假若球体是由密度为ρ=0.638且半径为r=10cm 的长叶松木质球体构成的,问球体浸入水中深度是多少?又假若球体是由密度为ρ=0.638且三个长半轴分别为a=10cm,b=15cm,c=20cm的长叶松木质椭圆球体构成的,问球体浸入水中深度是多少?(建模可参考课本32页)实验报告书写要求:根据实验情况和结果撰写并递交实验报告。
实验报告应当有算法原理简介,算法流程图,程序代码,运行调试记录,计算结果阐释;对于数学建模的应用问题要有分析建模的过程、求解计算的过程、实际问题解答或阐释的内容。
实验总结(学会了......; 掌握了......; 训练了......; 发现了......; 今后学习中......有待提高。
)参考程序1.二分法1、实验原理:二分法2、实验步骤1建立函数function y=f3(x)y=x.^3-x-12建立函数function[c,err,yc]=bisect(f,a,b,delta)ya=feval(f,a);yb=feval(f,b);if ya*yb>0returnendmax1=1+round((log(b-a)-log(delta))/log(2)); for k=1:max1c=(a+b)/2;yc=feval(f,c)if yc==0a=c;b=c;elseif yb*yc>0b=c;yb=yc;elsea=c;ya=yc;endif b-a<deltabreakendendc=(a+b)/2;err=abs(b-a);yc=feval(f,c);3调用函数>> [c,err,yc]=bisect('f3',1,2,0.0001)y =-1y =5y =0.8750 yc =0.8750 y =-0.2969 yc =-0.2969 y =0.2246 yc =0.2246 y =-0.0515 yc =-0.0515 y =0.0826 yc =0.0826y =0.0146yc =0.0146y =-0.0187yc =-0.0187y =-0.0021yc =-0.0021y =0.0062yc =0.0062y =0.0020yc =0.0020y =-4.6595e-005yc =-4.6595e-005y =9.9479e-004yc =9.9479e-004y =4.7404e-004yc =4.7404e-004y =2.1371e-004yc =2.1371e-004y =8.3552e-005c =1.3247err =6.1035e-005yc =8.3552e-005 2、牛顿迭代1、实验原理:牛顿迭代法2、实验步骤1.建立函数function y=f(x)y=x.^3-x-12.建立函数function y=f2(x)y=3*x.^2-13.牛顿迭代法函数的程序function [p0,err,k,y]=Newton(f,df,p0,delta,epsilon,max1)for k=1,max1p1=p0-feval(f,p0)/feval(df,p0);err=abs(p1-p0);relerr=2*err/(abs(p1)+delta);p0=p1;y=feval(f,p0);if(err<delta)|(relerr<delta)|(abs(y)<epsilon),break,end end4.函数的调用>> [p0,err,k,y]=Newton('f','f2',1.5,0.001,0.0001,1000)y =0.8750y =5.7500y =0.1007y =0.1007y =4.4499y =0.0021y =0.0021y =4.2685y =9.2438e-07 p0 =1.3247err =4.8222e-04 k =3y =9.2438e-07三、Steffensen算法1、实验原理:Steffensen算法2、实验步骤①function y=f1(x)y=x.^3-x-1②function y=f2(x)y=3*x.^2-1③function [p,Q]=steffensen(f,df,p0,delta,epsilon,max1) R=zeros(max1,3);R(1,1)=p0;for k=1:max1for j=2:3nrdenom=feval(df,R(k,j-1));if nrdenom==0'division by zero in Newton-Raphson method'breakelesR(k,j)=R(k,j-1)-feval(f,R(k,j-1))/nrdenom;endaadenom=R(k,3)-2*R(k,2)+R(k,1);if aadenom==0'division by zero in Aitken’s Acceleration'breakelesR(k+1,1)=R(k,1)-(R(k,2)-R(k,1))^2/aadenom;endendif(nrdenom==0)|(aadenom==0)breakenderr=abs(R(k,1)-R(k+1,1));relerr=err/(abs(R(k+1,1))+delta);y=feval(f,R(k+1,1));if (err<delta)|(relerr<delta)|(y<epsilon)p=R(k+1,1)Q=R(1:k+1,:);breakendend④>> [p,Q]=steffensen('f1','f2',1.5,0.0001,0.001,100)y =5.7500y =-1y =-1p =p =Q =1.5000 0 00 0 0实验总结:学会了用二分法,牛顿迭代法,Steffensen算法来求解线性方程的解; 掌握了一定的解题方法,和建立函数的方法,在调用函数中出现的错误也能及时判断理解并加以改正; 训练了应用MATLAB的技巧和方法,在一定程度上得以提升; 发现了应用此方法的简易方便之处,也认识到自己的很多缺点要继续努力学习掌握好知识技能; 今后学习中不仅要掌握好理论知识理解并记忆,更要多多在实际中操作实验,灵活应用所学知识,来提高自己。
第二次实验报告(非线性方程求根)
数学实验报告实验五学院:数学与统计学院班级:数学与统计学院(2)班姓名:石紫雲学号:0234非线性方程的数值解法实验1实验目的1)进一步熟练掌握求解非线性方程的牛顿迭代法和弦截法。
2)根据牛顿迭代法和弦截法的原理,编写程序求解非线性方程,提高编程解决问题的能力。
2 实验内容(1)用牛顿法和割线法求下列方程的根x^2-e^x=0;x*e^x-1=0;(23实验原理(1)牛顿迭代公式:1()/'()k k k k x x f x f x +=- 双点弦法公式:111()()()()k k k k k k k f x x x x x f x f x +--=--- (2)令2()f x x A =-,再用牛顿法求根。
4实验步骤1)根据牛顿迭代法,双点弦法的算法编写相应的求根函数;2)用牛顿迭代法和双点弦法分别对方程进行求解;5 程序设计牛顿迭代法x0=;N=100;k=0;eps=5e-6;delta=1e-6;while(1)x1=x0-fc1(x0)/fc2(x0);k=k+1;if k>Ndisp('Newton method failed')breakendif(abs(x1-x0)<delta || abs(fc1(x1))<delta) break;endx0=x1;endfprintf('%f',x0)fprintf('%f',abs(fc1(x1)))双点弦法function cutline(x0,x1)N=100;k=0;delta=5e-8;while(1)(abs(x1-x0)>=delta)c=x1;x1=cutnext(x0,x1);x0=c;k=k+1;if k>Ndisp('Cutline method failed')break;endif(abs(x1-x0)<delta || abs(fc1(x1))<delta) break;endendfprintf('%10f\n',x1);function y=cutnext(a,b)y=b-fc(b)/(fc(b)-fc(a))*(b-a);1)原函数function fc1=fc1(x)fc1=x^2-exp(x);end导函数function fc2=fc2(x)fc2=2*x-exp(x);end2)原函数function fc1=fc1(x) fc1=x*exp(x)-1;end导函数function fc2=fc2(x)fc2=1*exp(x)+x*exp(x);end3)原函数function fc1=fc1(x)fc1=x^2-5;end导函数function fc2=fc2(x)fc2=2*x;end6实验结果及分析注:牛顿迭代法由于设置delta=1e-6,所以算出的误差e<*10^-6;割线法由于设置delta=5e-8,所以误差e<*10^-8.7总结。
数值分析实验报告——非线性方程求根
数值分析实验报告——非线性方程求根一、实验目的: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,符合停止准则,因此我们可以认为此时已经找到了方程的根。
四、实验讨论通过上述实验可以发现,牛顿法是一种有效的求解非线性方程的方法。
它利用了函数在特定点处的导数的信息来逼近函数的零点,从而实现了迭代计算。
同时,牛顿法的收敛速度比较快,迭代次数较少,可以在较短的时间内找到方程的根。
然而,牛顿法也存在一些不足之处。
首先,它对初始解的选择较为敏感,不同的初始解可能导致迭代结果的差异。
其次,牛顿法可能出现发散现象,即迭代过程无法收敛到方程的根。
因此,对于一些复杂的非线性方程,我们需要选择合适的方法来求解。
五、总结通过本次实验,我们了解了牛顿法求解非线性方程的基本过程,并验证了其有效性。
非线性方程求解数值分析上机实验报告
实验报告一题目:非线性方程求解摘要:非线性方程的解析解通常很难给出,因此线性方程的数值解法就尤为重要。
本实验采用两种常见的求解方法二分法和Newton法及改进的Newton法。
前言:(目的和意义)掌握二分法与Newton法的基本原理和应用。
数学原理:对于一个非线性方程的数值解法很多。
在此介绍两种最常见的方法:二分法和Newton 法。
对于二分法,其数学实质就是说对于给定的待求解的方程f(x),其在[a,b]上连续,f(a)f(b)<0,且f(x)在[a,b]内仅有一个实根x*,取区间中点c,若,则c恰为其根,否则根据f(a)f(c)<0是否成立判断根在区间[a,c]和[c,b]中的哪一个,从而得出新区间,仍称为[a,b]。
重复运行计算,直至满足精度为止。
这就是二分法的计算思想。
Newton法通常预先要给出一个猜测初值x0,然后根据其迭代公式产生逼近解x*的迭代数列{x k},这就是Newton法的思想。
当x0接近x*时收敛很快,但是当x0选择不好时,可能会发散,因此初值的选取很重要。
另外,若将该迭代公式改进为其中r为要求的方程的根的重数,这就是改进的Newton法,当求解已知重数的方程的根时,在同种条件下其收敛速度要比Newton法快的多。
程序设计:本实验采用Matlab的M文件编写。
其中待求解的方程写成function的方式,如下function y=f(x);y=-x*x-sin(x);写成如上形式即可,下面给出主程序。
二分法源程序:clear%%%给定求解区间b=1.5;a=0;%%%误差R=1;k=0;%迭代次数初值while (R>5e-6) ;c=(a+b)/2;if f12(a)*f12(c)>0;a=c;elseb=c;endR=b-a;%求出误差k=k+1;endx=c%给出解Newton法及改进的Newton法源程序:clear%%%% 输入函数f=input('请输入需要求解函数>>','s')%%%求解f(x)的导数df=diff(f);%%%改进常数或重根数miu=2;%%%初始值x0x0=input('input initial value x0>>');k=0;%迭代次数max=100;%最大迭代次数R=eval(subs(f,'x0','x'));%求解f(x0),以确定初值x0时否就是解while (abs(R)>1e-8)x1=x0-miu*eval(subs(f,'x0','x'))/eval(subs(df,'x0','x'));R=x1-x0;x0=x1;k=k+1;if (eval(subs(f,'x0','x'))<1e-10);breakendif k>max;%如果迭代次数大于给定值,认为迭代不收敛,重新输入初值ss=input('maybe result is error,choose a new x0,y/n?>>','s');if strcmp(ss,'y')x0=input('input initial value x0>>');k=0;elsebreakendendendk;%给出迭代次数x=x0;%给出解结果分析和讨论:1.用二分法计算方程在[1,2]内的根。
数值分析 数值分析 Newton迭代法求解非线性方程实验
}//计算出u[i][j]并输出.
第二部分 for(i=k+1;i<n;i++)
{s=0.0;
for(r=0;r<k-1;r++)
{s=s+l[k][r]*u[r][k];}
l[i][k]=(a[i][k]-s)/u[k][k];
printf("%Lf\n",l[i][k]);
{s=0.0;
for(r=0;r<k-1;r++)
{s=s+l[k][r]*u[r][k];}
l[i][k]=(a[i][k]-s)/u[k][k];
printf("l[%d][%d]%Lf\n",i,k,l[i][k]);}
}
}
六、实验结果
七、上机实验体会
在这个试验中同样叶出现了很多问题,对L,U的求解输出中,输出的位置的不同,结果也就会出差错.经过多次调整,结果总算输出了.
通过此次试验,我理解了多重循环的运用,并了解了古人的聪明智慧,]讲将复杂问题简单化,现在的大学生们,应该学习他们的创新及钻研精神。
for(k=0;k<n;k++)
{for(j=k;j<n;j++)
{s=0.0;
for (r=0;r<k-1;r++)
{s=s+l[k][r]*u[r][j];}
u[k][j]=a[k][j]-s;
printf("u[%d][%d]=%Lf\n",k,j,u[k][j]); }
for(i=k+1;i<n;i++)
实验6非线性方程求解
实验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。
非线性方程组求解实验报告
实验十一非线性方程组求解练习三(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。
求解非线性方程实验报告
求解非线性方程实验报告一.实验目的:通过本节实验课的学习,要求我们理解并掌握二分法、不动点迭代、牛顿切线法及弦截法解非线性方程求根的原理,掌握相应的算法原理,通过计算机解决实验问题二.实验内容: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、六.实验总结:通过实验学会理解并掌握二分法、不动点迭代、牛顿切线法及弦截法解非线性方程求根的原理,掌握相应的算法原理,通过计算机解决实验问题并通过反复的上机实验操作,解决了在实验过程中遇到的实验问题,并了解了一些函数的特殊用法,学会了用这三种基本方法解决实际遇到的问题,并了解了二分法、不动点迭代、牛顿切线法及弦截法的各种变形算法。
非线性方程的解法数学实验报告
[x,fv,ef,out]=fzero(@f,x0(k))
end
结果
x0 =
1 4 10
x =
1.4044
fv =
0
ef =
1
out =
intervaliterations: 9
iterations: 6
funcCount: 25
algorithm: 'bisection, interpolation'
初值为x=3时,结果为
ans =
1.0000 2.0000 3.0000 4.0000 5.0000 6.0000 7.0000 8.0000
3.0000 1.9075 1.5163 1.4130 1.4045 1.4044 1.4044
【实验总结】
通过本次试验我们学会了用Matlab解非线性方程的fzero和fsolve方法,明白了两种方法的相同和不同之处;此外还学会了利用牛顿法构造迭代公式求解已知非线性方程的解。
message: 'Zero found in the interval [0.547452, 1.45255]'
x =
1.4044
fv =
0
ef =
1
out =
intervaliterations: 11
iterations: 12
funcCount: 34
algorithm: 'bisection, interpolation'
firstorderopt: 1.6457e-007
message: 'Optimization terminated: first-order optimality is less than options.TolFun.'
【清华】2.0_实验6-非线性方程求解
实验6-非线性方程求解『实验目的』1.掌握用MATLAB 软件求解非线性方程和方程组的基本用法,并对结果作初步分析。
2.练习用非线性方程和方程组建立实际问题的模型并进行求解。
『实验内容』–––––––––––––––––––––––––––––––––––––––一、题目3:(1)小张夫妇以按揭方式贷款买了1套价值20万元的房子,首付了5万元,每月还款1000元,15年还清。
问贷款利率是多少?(2)某人欲贷款50万元购房,他咨询了两家银行,第一家银行开出的条件是每月还4500元,15年还清;第二家银行开出的条件是每年还450000元,20年还清。
从利率方面看,哪家银行较优惠(简单地假设年利率=月利率×12)?———————————————————————————————————————★首先解答问题(1):【模型建立】假设一开始的总还款额为0a ,在第k 次还款后,还需还款的金额为k a ),,2,1,0(n k =,n 为还款的总月数(或年数)。
贷款月(年)利率设为r ,每月(年)还款额为b 。
则根据题意有如下递推方程组:⎪⎪⎪⎩⎪⎪⎪⎨⎧-+=-+=-+==-br a a b r a a b r a a a a n n )1()1()1(1120100 ……(1)对(1)式处理求通项:)()1())(1(01r b a r r b a r r b a n n n -+==-+=-- ,所以rb r b a r a n n +-+=()1(0……(2)。
因为在第n 个月(年)还清了贷款,所以有0=n a ,于是得到了本题的非线性方程模型:0)()1(0=+-+rb r ba r n ……(3)。
【模型解答】下面运用MATLAB 的fzero 命令求解该单变量方程:———————————————————————————————————————function y=loan1(a0,b,n,r)y=(1+r)^n*(a0-b/r)+b/r;%建立函数文件a0=150000;b=1000;n=180;%第(1)问中,给定的是按月还款,月数为15*12=180[x,fv,ef,out]=fzero(@loan1,0.1,[],a0,b,n)———————————————————————————————————————输出结果为:x=0.0021%该值即位月利率rfv=6.9849e-010%此函数值表明确以找到零点ef=1%发生变号out=intervaliterations:12iterations:16%迭代次数funcCount:40%函数调用次数algorithm:'bisection,interpolation'%表明算法为二分法和插值法message:'Zero found in the interval[-0.028,0.19051]'【结论】贷款的月利率是0.21%。
实验6_非线性方程求解
实验6 非线性方程求解化工系 分0班 2010011805 亚清【实验目的】1、 掌握用MATLAB 软件求解非线性方程和方程组的基本用法,并对结果作初步分析;2、 练习用非线性方程和方程组建立实际问题的模型并进行求解。
【实验容】 1、 题目1分别用fzero 和fsolve 程序求方程的所有根,准确到,取不同的 初值计算,输出初值、根的近似值和迭代次数,分析不同根的收敛域;自己构造某个迭代公式(如等)用迭代法求解,并自己编写牛顿法的程序进行求解和比较。
【问题分析】首先做定性分析,用MATLAB 做出y1=sinx ,y2=x^2/2的图像,研究零点的取值区间。
程序如下:x=-3:0.01:5; y1=sin(x); y2=x.^2/2;plot(x,y1,x,y2)-3-2-1012345-202468101214y1=sinxy2=x 2/2由图可见,原函数有两个零点,分别在[-0.5,0.5]和[1,2]。
【问题解答】用MATLAB中fzero函数求解,程序如下:format long gopt=optimset('fzero');opt=optimset(opt,'tolx',1e-10);[x,fv,ef,out]=fzero(inline('sin(x)-x^2/2'),[-0.5,0.5],opt)[x,fv,ef,out]=fzero(inline('sin(x)-x^2/2'),[1,2],opt)运行后得到结果:x = 2.624e-014fv = 2.622e-014ef = 1out = intervaliterations: 0iterations: 7funcCount: 9algorithm: 'bisection, interpolation'message: 'Zero found in the interval [-0.5, 0.5]'x = 1.454fv = 8.413e-011ef = 1out = intervaliterations: 0iterations: 7funcCount: 9algorithm: 'bisection, interpolation'message: 'Zero found in the interval [1, 2]'由此可得原方程共有两个根,x1=0,x2=1.454。
数值分析实验报告之迭代法求非线性方程的根
数值分析实验报告之迭代法求非线性方程的根1.实验目的掌握迭代法求非线性方程根的基本原理和使用方法,加深对数值计算方法的理解与应用。
2.实验原理迭代法是一种通过不断逼近的方法求解非线性方程的根。
根据不同的函数特点和问题需求,可以选择不同的迭代公式进行计算,如牛顿迭代法、二分法、弦截法等。
3.实验内容本次实验使用牛顿迭代法求解非线性方程的根。
牛顿迭代法基于函数的局部线性逼近,通过不断迭代逼近零点,直至满足收敛条件。
具体步骤如下:Step 1:选择初始点X0。
Step 2:计算函数f(x)在X0处的导数f'(x0)。
Step 3:计算迭代公式Xn+1 = Xn - f(Xn) / f'(Xn)。
Step 4:判断收敛准则,若满足则迭代结束,输出解Xn;否则返回Step 2,继续迭代。
Step 5:根据实际情况判断迭代过程是否收敛,并输出结果。
4.实验步骤步骤一:选择初始点。
根据非线性方程的特点,选择恰当的初始点,以便迭代公式收敛。
步骤二:计算导数。
根据选择的非线性方程,计算函数f(x)的导数f'(x0),作为迭代公式的计算基础。
步骤三:迭代计算。
根据迭代公式Xn+1=Xn-f(Xn)/f'(Xn),计算下一个迭代点Xn+1步骤四:判断收敛。
判断迭代过程是否满足收敛条件,通常可以通过设置迭代次数上限、判断前后两次迭代结果的差值是否足够小等方式进行判断。
步骤五:输出结果。
根据实际情况,输出最终的迭代结果。
5.实验结果与分析以求解非线性方程f(x)=x^3-x-1为例,选择初始点X0=1进行迭代计算。
根据函数f(x)的导数计算公式,得到导数f'(x0)=3x0^2-1,即f'(1)=2根据迭代公式Xn+1=Xn-f(Xn)/f'(Xn),带入计算可得:X1=X0-(X0^3-X0-1)/(3X0^2-1)=1-(1-1-1)/(3-1)=1-0/2=1根据收敛准则,判断迭代结果是否满足收敛条件。
非线性方程求解实验报告
数学实验报告非线性方程求解一、实验目的1.掌握用 MATLAB 软件求解非线性方程和方程组的基本用法,并对结果作初步分析;2.练习用非线性方程和方程组建立实际问题的模型并进行求解。
二、实验内容题目1【问题描述】(Q1)小张夫妇以按揭方式贷款买了1套价值20万元的房子,首付了5万元,每月还款1000元,15年还清。
问贷款利率是多少?(Q2)某人欲贷款50 万元购房,他咨询了两家银行,第一家银行开出的条件是每月还4500元,15 年还清;第二家银行开出的条件是每年还45000 元,20 年还清。
从利率方面看,哪家银行较优惠(简单假设:年利率=月利率×12)?【分析与解】假设初始贷款金额为x0,贷款利率为p,每月还款金额为x,第i个月还完当月贷款后所欠银行的金额为x i,(i=1,2,3,......,n)。
由题意可知:x1=x0(1+p)−xx2=x0(1+p)2−x(1+p)−xx3=x0(1+p)3−x(1+p)2−x(1+p)−x……x n=x0(1+p)n−x(1+p)n−1−⋯−x(1+p)−x=x0(1+p)n−x (1+p)n−1p=0因而有:x0(1+p)n=x (1+p)n−1p (1)则可以根据上述方程描述的函数关系求解相应的变量。
(Q1)根据公式(1),可以得到以下方程:150p(1+p)180−(1+p)180+1=0设 f(p)=150p(1+p)180−(1+p)180+1,通过计算机程序绘制f(p)的图像以判断解p的大致区间,在Matlab中编程如下:for i = 1:25t = 0.0001*i;p(i) = t;f(i) = 150*t*(1+t).^180-(1+t).^180+1;end;plot(p,f),hold on,grid on;运行以上代码得到如下图像:f(p)~p关系曲线图通过观察上图可知p∈[0.002,0.0022]。
Solution1:对于p∈[0.002,0.0022],采用二分法求解,在Matlab 中编程如下:clear;clc;x0=150000;n=180;x=1000;p0=0.002;p1=0.0022;while (abs(p1-p0)>1e-8)f0=x0*(1+p0).^n+x*(1-(1+p0).^n)/p0;f1=x0*(1+p1).^n+x*(1-(1+p1).^n)/p1;p2=(p0+p1)/2;f2=x0*(1+p2).^n+x*(1-(1+p2).^n)/p2;if (f0*f2>0 && f1*f2<0)p0=p2;elsep1=p2;end;end;p0结果得到p0=0.00208116455078125=0.2081%.所以贷款利率是0.2081%。
非线性方程求解实验报告
} void main() { double x1,x2,a,b,e2=1; int i = 0,e1; printf("请输入根的区间:"); scanf("%lf",&a); scanf("%lf",&b); if((f(a)*f(b))<0) { printf("要求小数点后的位数:"); scanf("%d",&e1); while(e1>0) { e2=e2/10; e1--; } e2=e2/2; printf("e2=%f",e2); x1=a; printf("第%d 次迭代后结果是:%20.19f\n",i,x1); x2=f(x1); while(fabs(x2-x1)>e2) { i++; printf("第%d 次迭代后结果是:%20.19f\n",i,x2); x1=x2; x2=fdao(x1); } printf("共进行%d 次迭代过程\n",i); printf("结果是:%20.19f\n",x2); } else printf("无法进行迭代!"); }
及 实 验 步 骤
(3)撰写实验报告 2、实验 2 实验步骤: (1)程序设计 (2)计算实例 (3)撰写实验报告 1、 二分法求根实验结果如图:
调 试 过 程 及 实 验 结 果
2、 迭代法的求根实验结果如图:
总 结
附 录
1、 通过本次实验,使我掌握了使用二分法求非线性方程的根,加深了对 二分法的了解。 2、 通过本次实验,使我掌握了使用迭代法求非线性方程的根的方法,能 够使用使用迭代法正确的求出求非线性方程的根。 1、 二分法程序清单: #include<stdio.h> #include<math.h> #include<conio.h> double f(double x) { double y = 0; y = sin(x) - x*x/2; return y; } void main() { double a,b,y1,y2,temp; int e1,e2=1,n,i=0; printf("请输入根的区间:"); scanf("%lf",&a); scanf("%lf",&b); y1=f(a); y2=f(b); if((y1*y2)<0)
实验4 解非线性方程组实验
实验4 解非线性方程组实验专业班级 信息081 学号 200812030129 姓名 祝珑 成绩 .实验类型:●验证性实验 ○综合性实验 ○设计性实验实验目的:进一步熟练掌握解非线性方程组牛顿迭代算法,提高编程能力和解算非线性方程组问题的实践技能。
实验内容:设有非线性方程组04405.02222=-+=+--y x y x x设初始值())25.0,00.2(,00=y x 误差小于0.001实验原理)()(1111-----=n n n n P F P J P P实验说明实验步骤1 要求上机实验前先编写出程序代码2 编辑录入程序3 调试程序并记录调试过程中出现的问题及修改程序的过程4 经反复调试后,运行程序并验证程序运行是否正确。
5 记录运行时的输入和输出。
实验总结实验报告:根据实验情况和结果撰写并递交实验报告。
第一步:建立程序文件1 newdim.m:function [P,iter,err]=newdim(F,JF,P,delta,epsilon,max1)%Input -F is the system saved as the M-file F.m% -JF is the Jacobian of F saved as the M=file JF.M% -P is the initial approximation to the solution% -delta is the tolerance for P% -epsilon is the tolerance for F(P)% -max1 is the maximum number of iterations%Output -P is the approximation to the solution% -iter is the number of iterations required% -err is the error estimate for PY=feval(F,P);for k=1:max1J=feval(JF,P)Q=P-(J\Y')'Z=feval(F,Q)err=norm(Q-P);relerr=err/(norm(Q)+eps);P=QY=Ziter=kif (err<delta)|(relerr<delta)|(abs(Y)<epsilon)breakendend第二步:建立程序文件2 F.mfunction Z=F(X)x=X(1);y=X(2);Z=zeros(1,2);Z(1)=x^2-2*x-y+0.5;Z(2)=x^2+4*y^2-4;程序文件3 JF.mfunction W=JF(X)x=X(1);y=X(2);W=[2*x-2 -1;2*x 8*y];第三步:建立程序文件3 JF.mfunction W=JF(X)x=X(1);y=X(2);W=[2*x-2 -1;2*x 8*y];第四步:在命令窗口输入命令newdim('F','JF',[2.00 0.25],0.0001,0.0001,100)后的执行结果如下:>> newdim('F','JF',[2.00 0.25],0.0001,0.0001,100)J =2 -14 2Q =1.9063 0.3125Z =0.0088 0.0244P =1.9063 0.3125Y =0.0088 0.0244iter = 1J = 1.8125 -1.00003.8125 2.5000Q =1.9007 0.3112Z =1.0e-004 *0.3091 0.3754P =1.9007 0.3112 Y =1.0e-004 *0.3091 0.3754 iter =2ans =1.90070.3112。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一.实验目的:
通过本节实验课的学习,要求我们理解并掌握二分法、不动点迭代、牛顿切线法及弦截法解非线性方程求根的原理,掌握相应的算法原理,通过计算机解决实验问题
二.实验内容:
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)>dlt
c=(a+b)/2;
if f(c)==0
break;
elseif f(c)*f(b)<0
a=c;
else b=c;
end
fprintf('k=%d,x=%.5f\n',k,c); k=k+1;
end
2、
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;
end
k
x
3、
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)>0
x0=a;
else
x0=b;
end
m=min(abs(df(a)),abs(df(b)));
k=0;
while abs(f(x0))>m*dlt
k=k+1;
x1=x0-f(x0)/df(x0);
x0=x1;
fprintf('k=%d x=%.5f\n',k,x0); end
for x0=1.5
fprintf('k=%d x=%.5f\n',k,x0); end
for x0=0
fprintf('k=%d x=%.5f\n',k,x0); end
for x0=-1
fprintf('k=%d x=%.5f\n',k,x0); end
五.程序运行结果:
1、k=1,x=0.50000
k=2,x=0.75000
k=3,x=0.62500
k=4,x=0.56250
k=5,x=0.53125
k=6,x=0.51563
k=7,x=0.50781
k=8,x=0.51172
k=9,x=0.50977
k=10,x=0.51074
k=11,x=0.51123
k=12,x=0.51099
k=13,x=0.51086
k=14,x=0.51093
2、k =
15
x =
3.1462
3、k=1 x=-2.03846
k=2 x=-1.39028
k=3 x=-0.91161
k=4 x=-0.34503
k=5 x=-1.42775
k=6 x=-0.94242
k=7 x=-0.40495
k=8 x=-1.70690
k=9 x=-1.15576
k=10 x=-0.69419
k=11 x=0.74249
k=12 x=2.78130
k=13 x=1.98273
k=14 x=1.53693
k=15 x=1.35726
k=16 x=1.32566
k=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.00000
2、六.实验总结:通过实验学会理解并掌握二分法、不动点迭代、牛顿切线法及弦截法解非线性方程求根的原理,掌握相应的算法原理,通过计算机解决实验问题并通过反复的上机实验操作,解决了在实验过程中遇到的实验问题,并了解了一些函数的特殊用法,学会了用这三种基本方法解决实际遇到的问题,并了解了二分法、不动点迭代、牛顿切线法及弦截法的各种变形算法。