数值计算方法第八章 非线性方程求解

合集下载

非线性方程求解

非线性方程求解
disp([’k=’,num2str(k)])
牛顿法
牛顿法也称为牛顿-拉普森法或者切线法。由 于这个方法的计算结果颇佳,而计算过程也比 较简单,所以被普遍采用。
牛顿法的核心内容是通过泰勒级数将非线性方 程式转化为线性方程式,然后用迭代法求解。
牛顿法原理
设方程式 f x 0 的近似根为 x0
数值计算的误差
模型误差
误 差 观测误差

分 类
截断误差
计算时只截 ln(x 1) x 1 x2 1 x3 1 x4 (1)n1 1 xn
取有限项
234
ቤተ መጻሕፍቲ ባይዱ
n
舍入误差
计算机对所 储存的数据 位数有限制
误差的分类 有效数字
绝对误差 相对误差
(x) x*x
(x)
二分法 不动点迭代 牛顿法
二分法
若函数f(x)在区间[a,b]内单调连续,且f(a)f(b)<0, 则在闭区间[a,b]内必然存在方程f(x)=0的根x*
二分法的图形解释
二分法的MATLAB程序
function x=mabisec(fun,a,b,ep)
x=(a+b)/2.0; k=0;
课堂练习
某蒸馏釜的操作压力位106.7kpa,其中溶液含苯摩尔分 数为0.2,甲苯为0.8,求此溶液的泡点和平衡的气相组 成。
苯甲苯溶液可以看做理想溶液,组分蒸汽压为:a为苯, b为甲苯
log Pa 6.301 1211 t 220.8
log Pb 6.080 1345 t 219.5
{ x0, x1, x2, …, xk, … }
如果这个数列有极限,则迭代格式是收敛的。

非线性方程求解

非线性方程求解

⾮线性⽅程求解基于MATLAB的⾮线性⽅程的五种解法探讨摘要:本⽂利⽤matlab软件对⾮线性⽅程解法中的⼆分法、简单迭代法、⽜顿法、割线法以及Steffensen法的数值分析⽅法的算法原理及实现⽅法进⾏了探讨。

对f x x x=+-()2ln2的零点问题,分别运⽤以上五种不同的⽅法进⾏数值实验,⽐较⼏种解法的优缺点并进⾏初步分析评价。

关键词:⼆分法、简单迭代法、⽜顿法、割线法、Steffensen法1、引⾔在很多实际问题中,经常需要求⾮线性⽅程f(x) =0的根。

⽅程f(x) =0的根叫做函数f(x)的零点。

由连续函数的特性知:若f(x)在闭区间[a,b ]上连续,且()()0f a f b<.则f(x) =0在开区间(a,b)内⾄少有⼀个实根。

这时称[a,b]为⽅程f(x) =0的根的存在区间。

本⽂主要对⾮线性⽅程的数值解法进⾏分析,并介绍了⾮线性⽅程数值解法的五种⽅法。

并设=+-.f x x x()2ln2f x在[1,2]上的图形,如图1:. 显然,函数在[1,2]之间有⼀个零点。

⾸先画出()2、计算机配置操作系统Windows 7 旗舰版内存2GB处理器AMD 4核 A6-3400M APU 1.4GHz图.13、⼆分法⼆分法的基本思想是将⽅程根的区间平分为两个⼩区间,把有根的⼩区间再平分为两个更⼩的区间,进⼀步考察根在哪个更⼩的区间内。

如此继续下去,直到求出满⾜精度要求的近似值。

设函数()f x 在区间[a,b ]上连续,且f(a)·f(b) <0,则[a,b ]是⽅程f(x) =0的根的存在区间,设其内有⼀实根,记为x*。

取区间[a,b ]的中点()2k a b x +=并计算1()f x ,则必有下列三种情况之⼀成⽴: (1) 1()f x =0,x1就是⽅程的根x*;(2)()f a .1()f x <0,⽅程的根x*位于区间[a, 1x ]之中,此时令111,a a b x ==; (3)1()f x .()f b <0,⽅程的根x*位于区间[1x ,b ]之中,此时令11a x =,1b b =。

非线性方程数值方法

非线性方程数值方法

非线性方程数值方法1、 固定点迭代:求解方程)(x g x =的近似值,初始值为0x ,迭代式为)(1n n x g x =+ function [k,x1,err,x]=fixpt(g,x0,tol,maxl)%Input-g is the iteration function input as a string 'g' % -x0 is the initial guess for the fixed point % -tol is the tolerance% -maxl is the maximum number of iterations%Output-k is the number of iteration that were carried out % -x1 is the approximation to the fixed point % -err is the error in the approximation % -x contains the sequence {xn} x(1)=x0;for k=2:maxlx(k)=feval(g,x(k-1)); err=abs(x(k)-x(k-1));relerr=err/(abs(x(k))+eps); x1=x(k);if(err<tol)|(relerr<tol),break;end endif k==maxldisp('maximum number of iterations exceeded') end x=x';例如 g=inline('exp(-x)');[k,p,err,P]=fixpt(g,0.5,0.01,20)2、 二分法:求解方程0)(=x f 在区间],[b a 内的一个根。

前提条件是)(x f 是连续的,且)(a f 与)(b f 的符号相反。

非线性方程的数值解法

非线性方程的数值解法
本文详细介绍了非线性方程的数值解法,主要包括二分法、一般迭代法、牛顿迭代法和弦截法等。其中,二分法作为一种重要的区间收缩法,被重点阐述。二分法通过不断将含根区间对分,逐步逼近方程的根。该方法首先确定初始含根区间,然后取区间中点进行函数值判断,根据函数值的符号变化来缩小含根区间。通过反复迭代,最终可以得到满足精度要求的近似根。二分法具有简单可靠、易于编程实现的优点,但对函数的光滑性要求较高。此外,本文还介绍了二分法的收敛性和误差控制方法,包括事先误差估计和事后误差估计,为实际应用提供了理论指导。除了二分法,本文还简要提及了一般迭代法、牛顿有广泛的应用。

计算方法—非线性方程求解

计算方法—非线性方程求解

计算方法—非线性方程求解计算方法是数学中的一个重要分支,它研究如何利用计算机和数值方法解决各种数学问题。

在实际应用中,非线性方程是一个常见的问题。

非线性方程是指其表达式中包含一个或多个非线性项的方程。

与线性方程相比,非线性方程更加复杂,通常不能通过代数方法直接求解。

因此,我们需要借助计算方法来求解非线性方程。

常见的非线性方程求解方法包括迭代法、牛顿法和二分法等。

首先,迭代法是一种基本的非线性方程求解方法。

它的基本思想是通过不断迭代逼近方程的根。

迭代法的一般步骤如下:1.选取一个初始值x0;2.利用迭代公式x_{n+1}=g(x_n),计算下一个值x_{n+1};3.不断重复步骤2,直到计算出满足精度要求的解为止。

其中,g(x)是一个逼近函数,通常是通过原方程进行变形得到的。

在实际应用中,迭代法的关键是选择适当的初始值x0和逼近函数g(x)。

如果选取的初始值离方程的根较远,可能会导致迭代结果不收敛;如果逼近函数不恰当,迭代结果也可能不收敛。

因此,在使用迭代法时需要注意这些问题。

其次,牛顿法是一种较为高效的非线性方程求解方法。

它的基本思想是通过线性近似来逼近方程的根。

牛顿法的一般步骤如下:1.选取一个初始值x0;2.利用泰勒展开将原方程线性化,得到一个线性方程;3.解线性方程,计算下一个值x_{n+1};4.不断重复步骤2和步骤3,直到计算出满足精度要求的解为止。

在实际应用中,牛顿法的关键是计算线性方程的解。

通常可以通过直接求解或迭代方法求解线性方程。

此外,牛顿法还需要注意选择适当的初始值x0,特别是对于多根方程需要选择不同的初始值。

最后,二分法是一种简单但较为稳定的非线性方程求解方法。

它的基本思想是通过区间缩减来逼近方程的根。

二分法的一般步骤如下:1.选取一个包含根的初始区间[a,b];2.计算区间的中点c=(a+b)/2;3.判断中点c的函数值与0的关系,从而确定下一个区间;4.不断重复步骤2和步骤3,直到计算出满足精度要求的解为止。

非线性方程组数值解法-非线性方程组数值解法

非线性方程组数值解法-非线性方程组数值解法

非线性方程组数值解法-非线性方程组数值解法非线性方程组数值解法-正文n个变量n个方程(n >1)的方程组表示为(1)式中ƒi(x1,x2,…,x n)是定义在n维欧氏空间R n的开域D上的实函数。

若ƒi中至少有一个非线性函数,则称(1)为非线性方程组。

在R n中记ƒ=则(1)简写为ƒ(尣)=0。

若存在尣*∈D,使ƒ(尣*)=0,则称尣*为非线性方程组的解。

方程组(1)可能有一个解或多个解,也可能有无穷多解或无解。

对非线性方程组解的存在性的研究远不如线性方程组那样成熟,现有的解法也不象线性方程组那样有效。

除极特殊的方程外,一般不能用直接方法求得精确解,目前主要采用迭代法求近似解。

根据不同思想构造收敛于解尣*的迭代序列{尣k}(k=0,1,…),即可得到求解非线性方程组的各种迭代法,其中最著名的是牛顿法。

牛顿法及其变形牛顿法基本思想是将非线性问题逐步线性化而形成如下迭代程序:(2)式中是ƒ(尣k)的雅可比矩阵,尣0是方程(1)的解尣*的初始近似。

这个程序至少具有2阶收敛速度。

由尣k算到尣k+的步骤为:①由尣k算出ƒ(尣k)及;②用直接法求线性方程组的解Δ尣k;③求。

由此看到迭代一次需计算n个分量函数值和n2个分量偏导数值,并求解一次n阶线性方程组。

为了评价非线性方程组不同迭代法的优劣,通常用效率作为衡量标准,其中P为迭代法的收敛阶,W为每迭代步计算函数值ƒi及偏导数值的总个数(每迭代步中求一次逆的工作量相同,均不算在W内)。

效率e越大表示此迭代法花费代价越小,根据效率定义,牛顿法(2)的效率为。

牛顿法有很多变形,如当奇异或严重病态时,可引进阻尼因子λk,得到阻尼牛顿法,即式中I是单位矩阵。

牛顿法是局部收敛方法,因而对初始近似尣0限制较严,为放宽对尣0的要求,扩大收敛范围,通常可引进松弛因子ωk,得到牛顿下降法:(3)式中ωk的选择应使成立。

为减少解线性方程组次数,提高效率,可使用修正牛顿程序(4)这种算法也称为萨马斯基技巧,它的收敛阶为 p =m+1,由尣k计算的工作量为W =n2+mn,于是该法的效率。

数值计算方法—非线性方程求解.cpp

数值计算方法—非线性方程求解.cpp

#include <stdio.h>#include <math.h>#include <stdlib.h>#define precision pow(10,-6) //根的精度double f(double x)/*定义f函数,求f(x)=x3-x-1 的值*/{return( x * x * x - x - 1 ) ;}void Dichotomy() //二分法{double x2 , x1 , x ;//上届,下届,根double fx2 , fx1 , fx ; //上届、下届、根对应的函数值printf("请输入该函数的存根区间的下界和上届,用空格分隔:\n"); scanf("%lf%lf",&x1,&x2);if( f(x2) * f(x1) > 0 ) //判断输入的区间是否满足条件{printf("错误输入!");system("pause");system("cls");Dichotomy();}printf("二分法求根过程如下:\n");do //二分替代,循环执行{x=(x2+x1)/2.0;printf("%f\n",x);fx=f(x);fx2=f(x2);fx1=f(x1);if(fx2 * fx > 0)x2 = x ;elsex1 = x ;//fx2 * fx > 0 ? x2 = x : x1 = x ;}while( fabs( x2 - x1 ) > precision && fabs( fx )> precision );printf("\n\t函数的根为:%f\n",x);void Iteration()//迭代法{double x,fx;printf("请输入一个数:");scanf("%lf",&x);printf("\n迭代法求根过程如下:\n");fx=pow((x+1),1.0/3);while(( fabs( fx > precision ) ) && ( fabs( fx - x ) > precision)){printf("%f\n",x);x=fx;fx=pow((x+1),1.0/3);}printf("\n\t函数的根为:%f\n",x);}void newton()//牛顿法{double temp,x;printf("请输入一个数:");scanf("%lf",&temp);printf("\n牛顿迭代法求根过程如下:\n");do{printf("%f\n",temp);temp = x;x = temp - f(temp) / ( 3 * temp * temp - 1 );}while((fabs( f(x) ) > precision )&&( fabs( x - temp ) > precision )); printf("\n\t函数的根为:%f\n",x);}void xianjiefa()//弦截法{double x1,x2,x,temp;//区间,上届,下届,根,零时根double fx1,fx2,fx; //上届、下届、根对应的函数值printf("请输入该函数的存根区间的下界和上届,用空格分隔:\n");scanf("%lf%lf",&x1,&x2);if(f(x1)*f(x2)>0) //判断输入的区间是否满足条件{printf("错误输入");system("pause");system("cls");xianjiefa();}printf("双点弦截法求根过程如下:\n");while((fabs( f(x) ) > precision ) && ( fabs(x2-x1) > precision )) {fx2=f(x2);fx1=f(x1);x = x2-fx2 * ( x2 - x1 ) / ( fx2 - fx1 );printf("%f\n",x);fx = f(x);if(fx2 * fx > 0)x2 = x ;elsex1 = x ;//fx * fx1 > 0 ? x1 = x: x2 = x ;}printf("\n\t函数的根为:%lf\n",x);}int main(){double a,b;int xz;while(1){printf("\t\t\t****************************\n");printf("\t\t\t**** \t 1.二分法 ****\n");printf("\t\t\t**** \t 2.迭代法 ****\n");printf("\t\t\t**** \t 3.牛顿法 ****\n");printf("\t\t\t**** \t 4.弦截法 ****\n");printf("\t\t\t**** \t 5.退出 ****\n");printf("\t\t\t****************************\n");printf("\t 函数方程为: x3-x-1 = 0\n\n");printf("\t请根据相应的代号,从上述方法中选择其一: ");scanf("%d",&xz);switch(xz){case 1: Dichotomy();break;case 2: Iteration();break;case 3: newton();break;case 4: xianjiefa();break;case 5: exit(0);default:printf("\n\t错误输入o(︶︿︶)o 唉!\n\n");break;}system("pause");system("cls");}}。

非线性方程数值求解法总结

非线性方程数值求解法总结

(一)非线性方程的迭代解法1.非线性方程的一般形式:f(x)=02.非线性方程的分类:⎩⎨⎧=为其他函数。

超越方程,次代数多项式;为代数方程,)()(0)(x f n x f x f 3.方程的根:若存在常数s 使f(s)=0,则称s 是方程(4.1)的根,又称s 是函数f(x)的零点。

4.重根:若f(x)能分解为)()()(x s x x f m ϕ-= 则称s 是方程(4.1)的m 重根和f(x)的m 重零点。

当m=1时,s 称为方程(4.1)的单根和f(x)的单零点。

5.结论:(1)零点存在定理:设函数f(x)在闭区间[a,b]上连续,且f(a)•f(b)<0,那么在开区间(a,b )内至少有一点ξ,使f(ξ)=0.(2)根的唯一性判别:一阶导数不变号且不为零(3)n 次代数方程在复数域上恰有n 个根(4)高于4次的代数方程没有求根公式6.方法:(1)搜索根方法:①作图法:②逐步搜索法:确定方程根的范围的步骤:步骤1 取含f(x)=0根的区间[a,b],即f(a)•f(b)<0;步骤2 从a 开始,按某个预定的步长h ,不断地向右跨一步进行一次搜索, 即检查kh a x k +=上的函数)(k x f 值的符号。

若0)()(1<•-k k x f x f ,则可以确定一个有根区间],[1k k x x -.步骤3 继续向右搜索,直到找出[a,b]上的全部有根区间],[1k k x x -(k=1,2,…,n).(2)二分法①基本思想:含根区间逐次分半缩小,得到一个区间长度以1/2的比例减小的含根区间序列 {}k I ,在给定根的误差界时,利用长度趋于零的特点,可得到在某个区间中满足要求的近似根。

②迭代终止的条件ε<)(k x fε2<-k k a b或者ε<-≤-2k k k a b s x(3)简单迭代法及其收敛性)(0)(x x x f ϕ=⇔=,2,1,0),(1==+k x x k k ϕ迭代法是一种逐次逼近法,用某个固定公式反复校正根的近似值,使之逐 步精确化,最后得到满足精度要求的解。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

0.42
0.4
4
6
8
10
12 k
14
16
18
20
22
定理8.2(局部收敛性定理) 若函数 ( x) 在
x
*
的邻域 U ( x* , ) 连续可微,x *
是方程 x ( x) 的解,且 ( x) 1,则存在正数
* , 使得对任意 x0 [ x* , x* ], 迭代序列
eps=5e-5;dx=1;x0=0.4;k=4; fprintf('It.no=%2d x[%2d]=%10.6f',k,k,x0) plot(k,x0,'r*') hold on while(dx>eps) k=k+1; x=1/(x0+1)^2; dx=abs(x-x0)/(1+abs(x)); plot(k,x0,'r*') fprintf('It.no=%2d x[%2d]=%10.6f',k,k,x) if mod(k+1,3)==0,fprintf('\n'),end x0=x; end fprintf('\n满足精度要求的迭代次数k=%2d',k) x
x0 [a, b]
迭代序列
x n 1 g ( x n ), (n 0,1, )
都收敛于x*,并有
Ln x * xn x1 x0 1 L
(8-2-2)
注:用定理8、2比定理8、1方便。 如上面的函数取
20 40 g ( x) 2 g ( x) 2 , 2 x 10 ( x 10) 40 x 80 ( x) 2 x [1,2] g 2 1 2 ( x 10) 11 迭代收敛。 误差估计式表明L越小迭代收敛越快。
第八章 非线性方程及非线性方程组的解法
主要内容: 1、对分区间法 2、简单迭代法 3、牛顿法与弦截法 4、抛物线法 5、非线性方程组的解法
研究对象:迭代方法、收敛条件、收敛速度
k-重零点:
若x=a处f(x)满足f(a)=0,f(L)(a)=0,(L=1,2,--,k-1) ,f(L)(a)=/=0(k=1,2,---) (8-1-1) 则称x=a为f(x)的k-重零点(方程f(x)=0的k-重根). 方程f(x)=0有k-重根等价函数可分解为
f ( x) ( x a) k ( x), (a) 0
(8-1-2)
8-1、对分区间法
对分法的基本思想:
通过计算隔根区间的中点,逐步将隔根 区间缩小,从而可得方 程的近似根数列{xn }.
设f(x)在区间[a,b]上连续,有f(a)f(b)<0 则由连续函数的介值定理,f(x)在(a,b)必有 零点,称(a,b)为方程f(x)=0的有根区间.
例2、用对分区间法求f(x)的唯一实根,其误 差不超过 1 4
2 10
其中 解:
f ( x) x3 10 x 20 0
易知
f (1) 12 10 20 0
f (2) 2 2 20 20 0
f ( x) 3x 2 10 0, x (, ) f ( x)
function [x_star,k]=bisect923(fun,a,b,ep) % 二分法解f(x)=0 %fun(x)为求根的函数f(x),a,b为初值区间的端点 %ep为精度(默认值为1e-5),当(b-a)/2<ep时终止计算 %x_star为迭代成功时的方程的根,k表示迭代次数 %当输出迭代次数k为0时表示在此区间没有根存在 if nargin<4 ep=1e-5;end fa=feval(fun,a);fb=feval(fun,b); if fa*fb>0 x_star=[fa,fb];N=0;return;end k=1; while abs(b-a)/2>ep x=(a+b)/2;fx=feval(fun,x); if fx*fa<0 b=x;fb=fx; else a=x;fa=fx; end k=k+1; end x_star=(a+b)/2;
单调增的, f ( x) x 2 10 x 20 0 有唯一实根,且在[1,2]内。
对分区间的次数
1 ln(2 1) ln( 10 4 ) 2 n 1 13.28 n 14 ln 2
x (计算结果见教材) 14 1.5945741 即为所求。
fun=inline('x^3+10*x-20','x'); [x,k]=bisect923(fun,1,2,0.0005) x= k= 1.5942 11
It.no= 4 , x[ 4]= 0.400000, It.no= 5, x[ 5]= It.no= 6, x[ 6]= 0.438459, It.no= 7, x[ 7]= It.no= 8 , x[ 8]= 0.454516, It.no= 9, x[ 9]= It.no=10 ,x[10]= 0.461090,It.no=11, x[11]= It.no=12, x[12]= 0.463759,It.no=13, x[13]= It.no=14 ,x[14]= 0.464839,It.no=15, x[15]= It.no=16, x[16]= 0.465276,It.no=17 ,x[17]= It.no=18, x[18]= 0.465452,It.no=19 ,x[19]= It.no=20, x[20]= 0.465523,It.no=21, x[21]= It.no=22 ,x[22]= 0.465552 满足精度要求的迭代次数k=22 x = 0.4656
lim a n lim bn x *
n n
且x =x*是方程f(x)=0的根。取xn=(an+bn)/2为 近似根,其误差为
bn a n b a (8-1-3) x xn n 1 2 2 上述方法求非线性方程f(x)=0近似根称为---对分区间法. 算法:8-1(见教材186页)
8-2、简单迭代法
已知方程的根得近似值,由递推公式
xn 1 g ( xn )
产生序列逼近真值。 f ( x) 0 x ( x),
若 xn 收敛于x* , ( x)在x*处连续
x* lim xn 1 lim ( xn ) ( x* )
n n
k
7 8
xk
f ( xk )符号
隔根区间
[1.359375,1.375] [1.359375,1.3671875]
1.3671875 1.36328125
+ -
所以有 1 * x (1.359375 1.3671875) 1.363 2
fun=inline('x^3+4*x^2-10','x'); [x,k]=bisect923(fun,1,2,0.005) x= k= 1.3633 8
x [a, b]
a g ( x) b;
(2)存在常数0<L<1,使
x, y [a, b]
g ( x) g ( y ) L x y
则方程x=g(x)在[a,b]内有唯一根x*,且对 x0 [a, b] ,迭代序列
x n 1 g ( x n ), (n 0,1, )
例3
已知方程10 x x 2 0在[0.3,0.4]内有
k
一根,用两种不同的迭代公式 (1)xk 1 10 x 2 (2)xk 1 lg( xk 2) 进行迭代,观察所得序列的收敛性。
解: 计算结果如下表:
k 0 1 2 3 4 (1)xk
0.3 -0.0047 -1.0108
xn 1 ( xn )
收敛于 x 证明思路:1)迭代函数在邻域内是收敛的;2)迭代 函数在正方形内。 ----------迭代函数满足压缩映象原理的两个条件。
*
1 迭代法的收敛速度(收敛阶) )
(2)xk
0.3 0.3617 0.3732 0.3753 0.3757
例3‘用不动点迭代格式
xk 1 1/ ( xk 1)2 , (k 0,1, 2,)
求解方程
f ( x) x( x 1)2 1 0
在区间[0,1]的一个实根,初始值x0=0.4, 精确到4位有效数字
即为所求。(称为简单迭代法)
注:在例1中取
x x 3 11x 20 等价方程
3 n
x0 1.5 ,若改写原方程为
xn 1 x 11xn 20
x1 0.125, x2 21.376953, x3 10023.861, 迭代序列发散! 20 若改写原方程为等价方程 xn 1 x 2 10 n
设f(a)<0,f(b)>0.取x0=(a+b)/2 若f( x0)=0,则x=x0是方程f(x)=0的解。 否则若f( x0) <0,取a=x0, b1=b; 若f( x0) >0,取a1=a, b1= x0,有
ba [a1 , b1 ] [a, b], b1 a1 2
且f(x)在区间[a1,b1]上连续,满足(a1)f(b1)<0.
*
注:给定误差限,可求对分区间的次数。
ba ln(b a) ln x xn n 1 n 1 ln 2 2
*
(8-1-4)
例1、
用二分法求方程 x 3 x 2 10 0在
[1 2]内根的近似值,要求绝 对误差不超过 , 1 102. 2 解: f ( x) x 3 4 x 2 10在[1 2]上 ,
相关文档
最新文档