数值计算方法第八章 非线性方程求解
- 格式:ppt
- 大小:1.36 MB
- 文档页数:72
⾮线性⽅程求解基于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,于是该法的效率。
#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 ϕ迭代法是一种逐次逼近法,用某个固定公式反复校正根的近似值,使之逐 步精确化,最后得到满足精度要求的解。