搜档网
当前位置:搜档网 › 求解非线性方程组的方法研究

求解非线性方程组的方法研究

求解非线性方程组的方法研究
求解非线性方程组的方法研究

非线性方程组的求解(汇编)

非线性方程组的求解 摘要:非线性方程组求解是数学教学中,数值分析课程的一个重要组成部分,作为一门学科,其研究对象是非线性方程组。求解非线性方程组主要有两种方法:一种是传统的数学方法,如牛顿法、梯度法、共轭方向法、混沌法、BFGS 法、单纯形法等。传统数值方法的优点是计算精度高,缺点是对初始迭代值具有敏感性,同时传统数值方法还会遇到计算函数的导数和矩阵求逆的问题,对于某些导数不存在或是导数难求的方程,传统数值方法具有一定局限性。另一种方法是进化算法,如遗传算法、粒子群算法、人工鱼群算法、差分进化算法等。进化算法的优点是对函数本身没有要求,不需求导,计算速度快,但是精度不高。 关键字:非线性方程组、牛顿法、BFGS 法、记忆梯度法、Memetic 算法 1: 三种牛顿法:Newton 法、简化Newton 法、修改的Newton 法【1-3】 求解非线性方程组的Newton 法是一个最基本而且十分重要的方法, 目前使用的很多有效的迭代法都是以Newton 法为基础, 或由它派生而来。 n 个变量n 个方程的非线性方程组, 其一般形式如下: ???????===0),...,(... 0),...,(0),...,(21212211n n n n x x x f x x x f x x x f (1) 式(1)中,),...,(21n i x x x f ( i=1, ?, n) 是定义在n 维Euclid 空间Rn 中开域 D 上 的实值函数。若用向量记号,令: ????????????=n x x x ...X 21,????????????=??????????????====)(...)()(0),...,(...0),..,(0)...,()(2121212,211X f X f X f x x x f x x x f x x x f X F n n n n n

非线性方程求根

第七章 非线性方程求根 教学目的与要求: 理解二分法求根的思想;掌握二分法求解过程;了解二分法的优点和缺点。了解迭代法的基本思想,迭代法的收敛条件以及局部收敛性的定义;理解基本迭代法的迭代思路,收敛条件的产生与求证过程;掌握基本迭代法的迭代格式,收敛条件的应用以及局部收敛定理。 重点和难点:迭代法的基本思想,迭代法的收敛性 ■ 教学内容: 基本概念: 的零点; 的m 重零点。 )(x f )(x f 非线性方程的求根通常分为两个步骤:一是对根的搜索,二是根的精确化,求得根的足够精确的近似值。 求方程的有根区间有如下方法: (1)描图法。画出的简图,从曲线与)(x f y =x 轴交点的位置确定有根区间。 (2)解析法。根据函数的连续性、介值定理以及单调性等寻找有根区间。 § 1 二分法 分析二分法的基本原理 例1 用二分法求方程的一个正根,要求误差不超过. 01)(6=??=x x x f 2105.0?ק 2 迭代法及其收敛性 一、迭代法的定义 二、基本迭代法 定义:将方程改写成以下等价形式() x x ?=取定初始值0x ,由迭代公式1() (0,1,2,)n n x x n ?+==L 产生迭代序列{}n x 。显然,若{}n x 收敛于*x ,()x ?在*x 处连续,就有** 1lim lim ()()n n n n x x x ??+→∞→∞ ===x 即*x 是方程() x x ?=的解,从而也是0)(=x f 的解。故当充分大时,可取作为方程根的近似值。用迭代格式求得方程近似根的方法称为基本迭代法,n n x )(x ?称为迭代函数。由于收敛点*x 满足*()* x x ?=,故称*x 为)(x ?的不动点 例 求方程的一个实根,要求精确到六位小数。 032)(3 =??=x x x f 注意:把此方程转换成三种等价形式 ,32)(31+==x x x ?)3(2 1)(32?= =x x x ?, 3)(33??==x x x x ?三、迭代法的收敛条件

Matlab求解线性方程组非线性方程组

求解线性方程组 solve,linsolve 例: A=[5 0 4 2;1 -1 2 1;4 1 2 0;1 1 1 1]; %矩阵的行之间用分号隔开,元素之间用逗号或空格 B=[3;1;1;0] X=zeros(4,1);%建立一个4元列向量 X=linsolve(A,B) diff(fun,var,n):对表达式fun中的变量var求n阶导数。 例如:F=sym('u(x,y)*v(x,y)'); %sym()用来定义一个符号表达式 diff(F); %matlab区分大小写 pretty(ans) %pretty():用习惯书写方式显示变量;ans是答案表达式 非线性方程求解 fsolve(fun,x0,options) 为待解方程或方程组的文件名;fun其中 x0位求解方程的初始向量或矩阵; option为设置命令参数 建立文件fun.m: function y=fun(x) y=[x(1)-0.5*sin(x(1))-0.3*cos(x(2)), ... x(2) - 0.5*cos(x(1))+0.3*sin(x(2))]; >>clear;x0=[0.1,0.1];fsolve(@fun,x0,optimset('fsolve')) 注: ...为续行符 m文件必须以function为文件头,调用符为@;文件名必须与定义的函数名相同;fsolve()主要求解复杂非线性方程和方程组,求解过程是一个逼近过程。Matlab求解线性方程组 AX=B或XA=B 在MATLAB中,求解线性方程组时,主要采用前面章节介绍的除法运算符“/”和“\”。如: X=A\B表示求矩阵方程AX=B的解; 的解。XA=B表示矩阵方程B/A=X. 对方程组X=A\B,要求A和B用相同的行数,X和B有相同的列数,它的行数等于矩阵A的列数,方程X=B/A同理。 如果矩阵A不是方阵,其维数是m×n,则有: m=n 恰定方程,求解精确解; m>n 超定方程,寻求最小二乘解; m

牛顿法求非线性方程的根

学科前沿讲座论文 班级:工程力学13-1班姓名:陆树飞

学号:02130827

牛顿法求非线性方程的根 一 实验目的 (1)用牛顿迭代法求解方程的根 (2)了解迭代法的原理,了解迭代速度跟什么有关 题目:用Newton 法计算下列方程 (1) 013=--x x , 初值分别为10=x ,7.00=x ,5.00=x ; (2) 32943892940x x x +-+= 其三个根分别为1,3,98-。当选择初值02x =时 给出结果并分析现象,当6510ε-=?,迭代停止。 二 数学原理 对于方程f(x)=0,如果f(x)是线性函数,则它的求根是很容易的。牛顿迭代法实质上是一种线性化方法,其基本思想是将非线性方程f(x)=0逐步归结为某种线性方程来求解。 设已知方程f(x)=0有近似根x k (假定k f'(x )0≠) ,将函数f(x)在点x k 进行泰勒展开,有 k k k f(x)f(x )+f'(x )(x-x )+≈??? 于是方程f(x)=0可近似的表示为 k k k f(x )+f'(x )(x-x )=0 这是个线性方程,记其根为x k+1,则x k+1的计算公式为 k+1k ()x =x -'() k k f x f x ,k=0,1,2,… 这就是牛顿迭代法。

三 程序设计 (1)对于310x x --=,按照上述数学原理,编制的程序如下 program newton implicit none real :: x(0:50),fx(0:50),f1x(0:50)!分别为自变量x ,函数f(x)和一阶导数f1(x) integer :: k write(*,*) "x(0)=" read(*,*) x(0) !输入变量:初始值x(0) open(10,file='1.txt') do k=1,50,1 fx(k)=x(k-1)**3-x(k-1)-1 f1x(k)=3*x(k-1)**2-1 x(k)=x(k-1)-fx(k)/f1x(k) !牛顿法 write(*,'(I3,1x,f11.6)') k,x(k) !输出变量:迭代次数k 及x 的值 write(10,'(I3,1x,f11.6)') k,x(k) if(abs(x(k)-x(k-1))<1e-6) exit !终止迭代条件 end do stop end (2)对于32943892940x x x +-+=,按照上述数学原理,编制的程序如下 program newton implicit none

牛顿法非线性方程求解

《MATLAB 程序设计实践》课程考核 ---第37-38页 题1 : 编程实现以下科学计算算法,并举一例应用之。(参考书籍《精 通MAT LAB科学计算》,王正林等著,电子工业出版社,2009 年) “牛顿法非线性方程求解” 弦截法本质是一种割线法,它从两端向中间逐渐逼近方程的根;牛顿法本质上是一种切线法,它从一端向一个方向逼近方程的根,其递推公式为: - =+n n x x 1) ()(' n n x f x f 初始值可以取)('a f 和)('b f 的较大者,这样可以加快收敛速度。 和牛顿法有关的还有简化牛顿法和牛顿下山法。 在MATLAB 中编程实现的牛顿法的函数为:NewtonRoot 。 功能:用牛顿法求函数在某个区间上的一个零点。 调用格式:root=NewtonRoot )(```eps b a f 其中,f 为函数名; a 为区间左端点; b 为区间右端点 eps 为根的精度; root 为求出的函数零点。 ,

牛顿法的matlab程序代码如下: function root=NewtonRoot(f,a,b,eps) %牛顿法求函数f在区间[a,b]上的一个零点%函数名:f %区间左端点:a

%区间右端点:b %根的精度:eps %求出的函数零点:root if(nargin==3) eps=1.0e-4; end f1=subs(sym(f),findsym(sym(f)),a); f2=subs(sym(f),findsym(sym(f)),b); if (f1==0) root=a; end if (f2==0) root=b; end if (f1*f2>0) disp('两端点函数值乘积大于0 !'); return; else tol=1; fun=diff(sym(f)); %求导数 fa=subs(sym(f),findsym(sym(f)),a); fb=subs(sym(f),findsym(sym(f)),b); dfa=subs(sym(fun),findsym(sym(fun)),a); dfb=subs(sym(fun),findsym(sym(fun)),b); if(dfa>dfb) %初始值取两端点导数较大者 root=a-fa/dfa; else root=b-fb/dfb; end while(tol>eps) r1=root; fx=subs(sym(f),findsym(sym(f)),r1); dfx=subs(sym(fun),findsym(sym(fun)),r1); %求该点的导数值 root=r1-fx/dfx; %迭代的核心公式 tol=abs(root-r1); end end 例:求方程3x^2-exp(x)=0的一根 解:在MATLAB命令窗口输入: >> r=NewtonRoot('3*x^2-exp(x)',3,4) 输出结果: X=3.7331

非线性方程组求根的牛顿迭代法

二元非线性方程组求根的牛顿迭代法 摘要:本文根据一元函数的Taybr 公式和求解一元非线性方程的牛顿迭代法之间的关系,利用多元函数的Taybr 公式推导出了二元非线性方程组的牛顿迭代法;在此基础上,通过MA TLAB 仿真计算一个方程组的根来说明该方法是可行的。 关键词:牛顿迭代法;一元函数;二元函数; Taybr 公式; Matlab 0 引言 非线性方程()0f x =的数值解法有逐步搜索法、区间二分法、迭代法、牛顿 迭代法等, 那么, 对于对于非线性方程组(,)0 (,)0f x y g x y =??=?,其牛顿迭代法的迭代方 程是什么? 本文根据一元函数的Taybr 公式和一元非线性方程牛顿迭代法之间的关系,利用多元函数的Taybr 公式推导出了二元非线性方程组的牛顿迭代法,在此基础上利用推导出的二元非线性方程组求根的牛顿迭代法通过matlab 仿真计算出一个方程组的根,检验了所得方法的有效性。 1 基本定理、结论 定理1 (一元函数的Taybr 公式) 如果函数()f x 在含有0x 的某个开区间(,)a b 内具有直(1)n +阶的导数,则对任一(,)x a b ∈ ,有 ()2 0000000()()()()()()()...()()2!! n n n f x f x f x f x f x x x x x x x R x n '''=+-+-++-+ 其中()n R x = ()(1)10() ()1! n n f x x n ξ++-+,这里ξ是0x 与x 之间的某个值。 定理2 (二元函数的Taybr 公式) 设(,)z f x y =在点00(,)x y 的某一邻域内连续且有直到(1)n +阶的连续偏导数, 00(,)x k y k ++为此邻域内任一点,则有 2 000000001(,)(,)(,)(,)... 2!f x k y k f x y h k f x y h k f x y x y x y αααααααα???? ++=++++++ ? ?????

非线性方程组数值解法

非线性方程组数值解法 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,得到阻尼牛顿法,即

matlab程序设计实践-牛顿法解非线性方程

中南大学MATLAB程序设计实践学长有爱奉献,下载填上信息即可上交,没有下载券的自行百度。所需m文件照本文档做即可,即新建(FILE)→脚本(NEW-Sscript)→复制本文档代码→运行(会跳出保存界面,文件名默认不要修改,保存)→结果。第一题需要把数据文本文档和m文件放在一起。全部测试无误,放心使用。本文档针对做牛顿法求非线性函数题目的同学,当然第一题都一样,所有人都可以用。←记得删掉这段话 班级: ? 学号: 姓名:

一、《MATLAB程序设计实践》Matlab基础 表示多晶体材料织构的三维取向分布函数(f=f(φ1,φ,φ2))是一个非常复杂的函数,难以精确的用解析函数表达,通常采用离散 空间函数值来表示取向分布函数,是三维取向分布函数的一个实例。 由于数据量非常大,不便于分析,需要借助图形来分析。请你编写一 个matlab程序画出如下的几种图形来分析其取向分布特征: (1)用Slice函数给出其整体分布特征; " ~ (2)用pcolor或contour函数分别给出(φ2=0, 5, 10, 15, 20, 25, 30, 35 … 90)切面上f分布情况(需要用到subplot函数);

(3) 用plot函数给出沿α取向线(φ1=0~90,φ=45,φ2=0)的f分布情况。 (

备注:数据格式说明 解: (1)( (2)将文件内的数据按照要求读取到矩阵f(phi1,phi,phi2)中,代码如 下: fid=fopen(''); for i=1:18 tline=fgetl(fid); end phi1=1;phi=1;phi2=1;line=0; f=zeros(19,19,19); [ while ~feof(fid) tline=fgetl(fid); data=str2num(tline); line=line+1;数据说明部分,与 作图无关此方向表示f随着 φ1从0,5,10,15, 20 …到90的变化而 变化 此方向表示f随着φ 从0,5,10,15, 20 … 到90的变化而变化 表示以下数据为φ2=0的数据,即f(φ1,φ,0)

5非线性方程求根习题课

非线性方程求根 一、证明:对任意初始值01,13x ?? ∈???? ,由不动点迭代12 k x k x -+=,k=0,1,2,…产生的序 列{}k x 都收敛于方程2x x -=在1,13?????? 的唯一 根p 。 若要求p 的近似值的误差不超过4 10 -(取初始值02 3x =),试估计迭代次数。 解:由()12k x k k x x ?-+==知迭代函数()2x x ?-= 对[]1/3,1x ∈,有 ()()()[][]1,1/30.5,0.79371/3,1x ???∈=????? 另外有 ()1/32ln 22ln 20.55011x x ?--'=-≤=< 由定理得本题证明部分。 为使解p 的近似值k x 的误差不超过410-,根据误 差估计式: 10,1k k L x p x x L -≤-- 令 4 10101k L x x L --<-,得k 应取为

10 4ln10ln 111.22ln x x L k L ---->≈ 取k=12可使近似解的误差不超过410- 二、证明: 设()x ?在[],a b 上连续可微,且()01x ?'<<, ()x x ?=在[],a b 上有根*x ,0[,]x a b ∈,但* 0x x ≠, 则由 ()1, 0,1,2...k k x x k ?+== 产生的迭代序列{}k x 单调收敛于* x 。 证明:因为()x x ?=在[],a b 上有根* x ,故有()**x x ?=, 设*0x x b <≤,则由 ()() * * 10x x x x ??-=-()()*00x x ?ξ'=- 及()01x ?'<<知 * * 100x x x x <-<- 于是 * 10x x x << 同理可得* * 211,,k k x x x x x x +<<<< ,因而{}0 k k x ∞ = 单调下降并以*x 为下界,所以lim k k x →∞ 存在,记为x 。 由()01x ?'<<知方程在[],a b 内的根是唯一的,显然有 x =*x 。所以 *lim k k x x →∞= 三、设函数()f x 的导数满足'0()m f x M <≤≤,x 任意,且0)(=x f 的根存在,证明:

二分法和牛顿法求解非线性方程(C语言)

(1)二分法求解非线性方程: #include #include #define f(x)((x*x-1)*x-1) void main() {float a,b,x,eps; int k=0; printf("intput eps\n");/*容许误差*/ scanf("%f",&eps); printf("a,b=\n"); for(;;) {scanf("%f,%f",&a,&b); if(f(a)*f(b)>=0)/*判断是否符合二分法使用的条件*/ printf("二分法不可使用,请重新输入:\n"); else break; } do {x=(a+b)/2; k++; if(f(a)*f(x)<0)/*如果f(a)*f(x)<0,则根在区间的左半部分*/ b=x; else if(f(a)*f(x)>0)/*否则根在区间的右半部分*/ a=x; else break; }while(fabs(b-a)>eps);/*判断是否达到精度要求,若没有达到,继续循环*/ x=(a+b)/2;/*取最后的小区间中点作为根的近似值*/ printf("\n The root is x=%f,k=%d\n",x,k); } 运行结果: intput eps 0.00001 a,b= 2,-5 The root is x=1.324721,k=20 Press any key to continue 总结:本题关键在于两个端点的取值和误差的判断,此程序较容易。二分法收敛速度较快,但缺点是只能求解单根。 (2)牛顿法求解非线性方程: #include #include float f(float x)/*定义函数f(x)*/ {return((-3*x+4)*x-5)*x+6;} float f1(float x)/*定义函数f(x)的导数*/

牛顿迭代法求解非线性方程组的代码

牛顿迭代法求解非线性方程组 非线性方程组如下: 221122121210801080 x x x x x x x ?-++=??+-+=?? 给定初值()00.0T x =,要求求解精度达到0.00001 1.首先建立函数()F X ,方程编程如下,将F.m 保存到工作路径中: function f=F(x) f(1)=x(1)^2-10*x(1)+x(2)^2+8; f(2)=x(1)*x(2)^2+x(1)-10*x(2)+8; f=[f(1),f(2)] ; 2.建立函数()DF X ,用于求方程的jacobi 矩阵,将DF.m 保存到工作路径中: function df=DF(x) df=[2*x(1)-10,2*x(2);x(2)^2+1,2*x(1)*x(2)-10]; %jacobi 矩阵是一阶偏导数以一定方式排列成的矩阵。 3.编程牛顿迭代法解非线性方程组,将newton.m 保存在工作路径中: clear,clc; x=[0,0]'; f=F(x);

df=DF(x); fprintf('%d %.7f %.7f\n',0,x(1),x(2)); N=4; for i=1:N y=df\f'; x=x-y; f=F(x); df=DF(x); fprintf('%d %.7f %.7f\n',i,x(1),x(2)); if norm(y)<0.0000001 break; else end end ezplot('x^2-10*x+y^2+8',[-6,6,-6,6]); hold on ezplot('x*y^2+x-10*y+8',[-6,6,-6,6]); 运行结果如下: 0 0.0000000 0.0000000 1 0.8000000 0.8800000 2 0.9917872 0.9917117

C++实现 牛顿迭代 解非线性方程组

C++实现牛顿迭代解非线性方程组(二元二次为例) 求解{0=x*x-2*x-y+0.5; 0=x*x+4*y*y-4; }的方程 #include #include #define N 2 // 非线性方程组中方程个数、未知量个数#define Epsilon 0.0001 // 差向量1范数的上限 #define Max 100 // 最大迭代次数 using namespace std; const int N2=2*N; int main() { void ff(float xx[N],float yy[N]); //计算向量函数的因变量向量yy[N] void ffjacobian(float xx[N],float yy[N][N]); //计算雅克比矩阵yy[N][N] void inv_jacobian(float yy[N][N],float inv[N][N]); //计算雅克比矩阵的逆矩阵inv void newdundiedai(float x0[N], float inv[N][N],float y0[N],float x1[N]); //由近似解向量x0 计算近似解向量x1 float x0[N]={2.0,0.25},y0[N],jacobian[N][N],invjacobian[N][N],x1[N],errornorm; int i,j,iter=0; //如果取消对x0的初始化,撤销下面两行的注释符,就可以由键盘x读入初始近似解向量for( i=0;i>x0[i]; cout<<"初始近似解向量:"<

非线性方程求根问题

计算机学院上机实践报告 一、目的 1.通过本实验,帮助加深对非线性方程求根方法的构造过程的理解; 2.能将各种方法编写为程序并上机实现; 3.比较各种方法在求解同一非线性方程根时,在收敛情况上的差异。 二、容与设计思想 1.用二分法求方程f(x)=x3-2x-5=0在区间[2 , 3]的根。 2.方程f(x)=2x3-5x2-19x+42=0在x=3.0附近有根,试写出其三种不同的等价形式以构成三种不同的迭代格式,再用简单迭代法求根,观察这三种迭代是否收敛。 三、使用环境 1. 硬件环境 微型计算机(Intel x86系列CPU)一台 2. 软件环境 Windows2000/XP操作系统 VC++6.0或其它的开发工具。 四、核心代码及调试过程 1.用二分法求方程f(x)=x3-2x-5=0在区间[2 , 3]的根主要代码: void bisect(double a,double b,int max_B) { double root, ya,yb,yroot; int i,actual_B; ya=f(a);yb=f(b); if(ya*yb>0) { printf("method failed!\n"); exit(0); } for(i=1;i<=max_B;i++) { root=(a+b)/2;yroot=f(root); //取当前含根区间的中点 if(yroot==0) { a=root;b=root;} else if(yb*yroot>0) //取含根区间为[a,(a+b)/2]

{ b=root;yb=yroot;} Else //取含根区间为[(a+b)/2,b] { a=root;ya=yroot;} if(fabs(b-a)b)) { printf("re_select a proper initial value x0!\n"); exit(0); } if(fabs(x1-x0)

非线性方程求根

第二章非线性方程求根 线性方程是方程式中仅包含未知量的一次方项和常数项的方程,除此之外的方程都是非线性方程(nonlinear equation). 例如,大家熟知的“一元二次方程”就是一个非线性方程. 多元线性方程组的求解是数值计算领域的一个重要问题,在后续几章将专门讨论. 本章介绍求解非线性方程的数值方法,主要针对实数域,重点是单个非线性方程的求根问题. 2.1引言 2.1.1非线性方程的解 记要求解的单变量非线性方程为 f(x)=0(2.1) 其中函数f: ?→?. 一般而言,非线性方程的解的存在性和个数是很难确定的,它可能无解,也可能有一个或多个解. 例2.1 (非线性方程的解):分析下列非线性方程的解是否存在和解的个数. (1) e x+1=0. 此方程无解. (2) e?x?x=0. 此方程有一个解. (3) x2?4sinx=0. 此方程有两个解. (4) x3?6x2+5x=0. 此方程有三个解. (5) cosx=0. 此方程有无穷多个解. 在实际问题中,往往要求的是自变量在一定范围内的解,比如限定x∈[a,b]. 函数f一般为连续函数,则可记为f(x)∈C[a,b],C[a,b]表示区间[a,b]上所有连续实函数的集合. 假设在区间[a, b]上方程(2.1)的根为x?,也称x?为函数f(x)的零点. 方程的根可能不唯一,而且同一个根x?也可能是方程(2.1)的多重根. 定义2.1:对光滑函数f,若f(x?)=f′(x?)=?=f(m?1)(x?)=0,但f(m)(x?)≠0,则称x?为方程(2.1)的m重根. 当m=1时,即f(x?)=0,f′(x?)≠0时,称x?为单根. 对于多项式函数f(x),若x?为m重根,则f(x)可因式分解为 f(x)=(x?x?)m g(x) 其中g(x)也是多项式函数,且g(x?)≠0. 很容易验证,f(x?)=f′(x?)=?=f(m?1)(x?)=0,但f(m)(x?)≠0,即多项式方程重根的概念与定义2.1是一致的. 对一般的函数f,x?是方程(2.1)的重根的几何含义是,函数曲线在x?处的斜率为0,且在该点处与x轴相交. 非线性方程的一个特例是n次多项式方程(n≥2),根据代数基本定理可知,n次方程在复数域上有n个根(m重根计为m个根). 当n=1, 2时,方程的求解方法是大家熟知的. 当 n=3, 4时,虽然也有求根公式,但已经很复杂,在实际计算时并不一定适用. 当n≥5时,不存在一般的求根公式,只能借助数值求解方法来求根. 2.1.2问题的敏感性 根据问题敏感性的定义,这里需要考虑输入数据的扰动对方程的根有多大影响. 要分析敏感性首先应假设问题中的数据如何扰动,一种易于分析的情况是将非线性方程写成: f(x)=y 的形式,然后讨论y在0值附近的扰动造成的问题敏感性. 此时,求根问题变成了函数求值

c++求解非线性方程组的牛顿顿迭代法

牛顿迭代法c++程序设计 求解{0=x*x-2*x-y+0.5; 0=x*x+4*y*y-4; }的方程 #include #include #define N 2 // 非线性方程组中方程个数、未知量个数 #define Epsilon 0.0001 // 差向量1范数的上限 #define Max 100 //最大迭代次数 using namespace std; const int N2=2*N; int main() { void ff(float xx[N],float yy[N]); //计算向量函数的因变量向量yy[N] void ffjacobian(float xx[N],float yy[N][N]);/ /计算雅克比矩阵yy[N][N] void inv_jacobian(float yy[N][N],float inv[N][N]); //计算雅克比矩阵的逆矩阵inv void newdundiedai(float x0[N], float inv[N][N],float y0[N],float x1[N]); //由近似解向量x0 计算近似解向量x1 float x0[N]={2.0,0.25},y0[N],jacobian[N][N],invjacobian[N][N],x1[N],errornorm; int i,j,iter=0; //如果取消对x0的初始化,撤销下面两行的注释符, 就可以由键盘向x0读入初始近似解向量for( i=0;i>x0[i]; cout<<"初始近似解向量:"<

基于Matlab的牛顿迭代法解非线性方程组

基于Matlab 实现牛顿迭代法解非线性方程组 已知非线性方程组如下 2211221212 10801080x x x x x x x ?-++=??+-+=?? 给定初值0(0,0)T x =,要求求解精度达到0.00001 首先建立函数F(x),方程组编程如下,将F.m 保存到工作路径中: function f=F(x) f(1)=x(1)^2-10*x(1)+x(2)^2+8; f(2)=x(1)*x(2)^2+x(1)-10*x(2)+8; f=[f(1) f(2)]; 建立函数DF(x),用于求方程组的Jacobi 矩阵,将DF.m 保存到工作路径中: function df=DF(x) df=[2*x(1)-10,2*x(2);x(2)^2+1,2*x(1)*x(2)-10]; 编程牛顿迭代法解非线性方程组,将newton.m 保存到工作路径中: clear; clc x=[0,0]'; f=F(x); df=DF(x); fprintf('%d %.7f %.7f\n',0,x(1),x(2)); N=4; for i=1:N y=df\f'; x=x-y; f=F(x); df=DF(x); fprintf('%d %.7f %.7f\n',i,x(1),x(2)); if norm(y)<0.0000001 break ; else end end

运行结果如下: 0 0.0000000 0.0000000 1 0.8000000 0.8800000 2 0.9917872 0.9917117 3 0.9999752 0.9999685 4 1.0000000 1.0000000

Newton 法解非线性方程组

Newton法解非线性方程组 一.题目重述:编程实现非线性方程组的牛顿解法,并求解如下方程组。 3x1?cos x2x3?0.5=0 x12?81x2+0.12+sin x3+1.06=0 e?x1x2+20x3+10π?3 3 =0 二.算法: 非线性方程组的牛顿法为:给定初始解向量x(0),对于k≥1生成 x(k)=x(k?1)?J x k?1?1F(x(k?1)). 三.编程实现: 这里用MATLAB程序实现,建立三个文件如下: 1.函数F(X)文件 function F =F( X) F(1,1)=3*X(1)-cos(X(2)*X(3))-0.5; F(2,1)=X(1)^2-81*(X(2)+0.1)^2+sin(X(3))+1.06; F(3,1)=exp(-X(1)*X(2))+20*X(3)+(10*pi-3)/3; end 2.J(X) 函数(即Jacobian矩阵)文件 function F1= F1(X ) F1(1,:)=[3,sin(X(1)*X(2))*X(3),sin(X(1)*X(2))*X(2)]; F1(2,:)=[2*X(1),-162*(X(2)+0.1),cos(X(3))]; F1(3,:)=[exp(-X(1)*X(2))*(-X(2)),exp(-X(1)*X(2))*(-X(1)),20]; end 3.解题脚本文件 文件名zu %% 牛顿法解非线性方程组 clear; X0=[0.1;0.1;-0.1]; for i=1:200 X=X0-F1(X0)\F(X0); %这里采用MATLAB的左除方法,避免算逆矩阵X0=X; end X

Newton迭代法求解非线性方程

Newton迭代法求解非 线性方程

一、 Newton 迭代法概述 构造迭代函数的一条重要途径是用近似方程来代替原方程去求根。因此,如果能将非线性方程f (x )=0用线性方程去代替,那么,求近似根问题就很容易解决,而且十分方便。牛顿(Newton)法就是一种将非线性方程线化的一种方法。 设k x 是方程f (x )=0的一个近似根,把如果)(x f 在k x 处作一阶Taylor 展开,即: )x x )(x ('f )x (f )x (f k k k -+≈ (1-1) 于是我们得到如下近似方程: 0)x x )(x ('f )x (f k k k =-+ (1-2) 设0)('≠k x f ,则方程的解为: x ?=x k +f (x k ) f (x k )? (1-3) 取x ~作为原方程的新近似根1+k x ,即令: ) x ('f ) x (f x x k k k 1k -=+, k=0,1,2,… (1-4) 上式称为牛顿迭代格式。用牛顿迭代格式求方程的根的方法就称为牛顿迭代法,简称牛顿法。 牛顿法具有明显的几何意义。方程: )x x )(x ('f )x (f y k k k -+= (1-5) 是曲线)x (f y =上点))x (f ,x (k k 处的切线方程。迭代格式(1-4)就是用切线式(1-5)的零点来代替曲线的零点。正因为如此,牛顿法也称为切线法。 牛顿迭代法对单根至少是二阶局部收敛的,而对于重根是一阶局部收敛的。一般来说,牛顿法对初值0x 的要求较高,初值足够靠近*x 时才能保证收敛。若

要保证初值在较大范围内收敛,则需对)x (f 加一些条件。如果所加的条件不满足,而导致牛顿法不收敛时,则需对牛顿法作一些改时,即可以采用下面的迭代格式: ) x ('f ) x (f x x k k k 1k λ -=+, ?=,2,1,0k (1-6) 上式中,10<λ<,称为下山因子。因此,用这种方法求方程的根,也称为牛顿下山法。 牛顿法对单根收敛速度快,但每迭代一次,除需计算)x (f k 之外,还要计算 )x ('f k 的值。如果)x (f 比较复杂,计算)x ('f k 的工作量就可能比较大。为了避免计算导数值,我们可用差商来代替导数。通常用如下几种方法: 1. 割线法 如果用 1 k k 1k k x x ) x (f )x (f ----代替)x ('f k ,则得到割线法的迭代格式为: )x (f ) x (f )x (f x x x x k 1k k 1 k k k 1k --+---= (1-7) 2. 拟牛顿法 如果用 ) x (f )) x (f x (f )x (f k 1k k k ---代替)x ('f k ,则得到拟牛顿法的迭代格式为: )) x (f x (f )x (f ) x (f x x 1k k k k 2k 1k -+--- = (1-8) 3. Steffenson 法 如果用 ) x (f ) x (f ))x (f x (f k k k k -+代替)x ('f k ,则得到拟牛顿法的迭代格式为: ) x (f ))x (f x (f ) x (f x x k k k k 2k 1 k -+- =+

牛顿法解非线性方程组实验报告

实验名称: 牛顿法解非线性方程组 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 n i g R R g R R →→ 112 2()()(),()n n 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 如果()*lim k k →∞ ≡x x (存在),称(){}k x 为收敛。且当()i g x 为连续函数时,可得 *()*(lim )()k k g g →∞ ==x x x 说明*x 为方程组的解。又称为x =g (x )的不动点。 本实验中采用牛顿迭代法来求解非线性方程组。 2 实验目的和要求 运用matlab 编写一个.m 文件,要求用牛顿法非线性方程组: 12(0)(1)()3211 cos 02,(取(0,0),要求10)1sin 0 2 T k k x x x x x x x +-∞ ?-=??=-

相关主题