当前位置:文档之家› 牛顿迭代法解非线性方程组

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

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

计算方法第十章上机报告

00986096沈欢

北京大学工学院,北京100871

2012年5月13日

1问题描述

编制求解非线性方程组的牛顿法程序。

用上述程序求解以下非线性方程组并输出结果。

f1=x21+x22+x23?1=0;(1)

f2=2x21+x22?4x3=0;(2)

f3=3x21?4x2+x23=0;(3)取初值为(1.0,1.0,1.0)T,设定精度为10?7.

图1:Jacobi矩阵

1

图2:程序框架

2牛顿法简述

牛顿法的迭代格式为:

?→x k +1=?→x k ?[F (?→x k )]?1f (?→x k )

(4)

其中F (?→x )是Jacobi 矩阵,如图一所示。

对F (?→x k )作LU 分解,即:

F (?→x k )=L k U k (5)通过解:L k ?→y k =f (?→x k )

(6)

得到?→

y k .通过解:U k ?→δk =?→y k

(7)

得到?→δk .由

??→x k +1=?→x k ??→δk

(8)

2

实现迭代。

迭代结束的条件为:max |f i (??→

x k +1)|<ε其中ε为预设精度。

图3:输入界面

3程序描述

用于实现上述算法的程序见附件“nonlinear.cpp”.该程序的框架如图二所示。

整个函数由主函数”main”和子函数”void function(double *x,double *f)”、”void Jacobi(double *x,double **J)”、”void LU(int n,double *b,double **A,double *detax)”构成。在主函数中实现以下功能:

1、定义计算精度error,以及其他各种计算中的中间变量。

2、用友好的输入界面,提示用户输入方程组的维数n(方程的个数)、以及初始的迭代向量?→

x 0.输入方法如图三所示。

3、为通用变量(在子函数可以对这些变量进行修改)的存储开辟空间。这些变量是:

用于存储?→x 的变量:”double *x=new double [n+1]”.用于存储???→f (?→x )的变量:”double *f=new double [n+1]”

用于存储Jacobi 矩阵的变量:”double **J =new double *[n+1]”.所有的子函数均直接对这些值进行操作,就不再返还任何值。

4、调用子函数”void function(double *x,double *f)”计算f (?→

x k )、调用子函数”void Jacobi(double *x,double **J)”计算Jacobi 矩阵、调用子函数”void LU(int n,double *b,double **A,double

3

*detax)”计算?→

δk .通过第二部分描述的迭代格式(8)式进行迭代求解。当满足精度要求时结束计算。

5、输出满足精度要求的解。

子函数”void function(double *x,double*f)”由用户自己编写实现f (?→x )的计算。函数的被主

函数调用,入口参数为存储?→x 的指针和存储f (?→x )的指针。编写方式如图四所示。

图4:子函数function 的编写方式示例

子函数”void Jacobi(double *x,double **J)”由用户自己编写实现Jacobi 矩阵的计算。函数的

被主函数调用,入口参数为存储?→x 的指针和存储Jacobi 矩阵的指针。编写方式如图五所示。

图5:子函数Jacobi 的编写方式示例

子函数”void LU(int n,double *b,double **A,double *detax)”用第二部分描述的LU 分解法

求解线性方程:

F (?→x k )?→δk

=???→f (?→x k )(9)其入参为方程维数n,右端项指针b,系数矩阵的指针A,解的存储指针detax.

4

4计算结果

将??→

f(x)及Jacobi矩阵设置为题意所需。

取ε=10?7,初始向量[1,1,1]T。经5次迭代,计算结果为:x=[0.785197,0.496611,0.369923]T.计算结果如图六所示。

图6:计算结果

5

牛顿法求非线性方程的根

学科前沿讲座论文 班级:工程力学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

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<<"初始近似解向量:"<

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)

二分法和牛顿法求解非线性方程(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

基于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

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<<"初始近似解向量:"<

非线性方程的简单迭代法和Steffensen迭代法

《数值计算方法》实验报告 实验名称:实验1 非线性方程的简单迭代法和Steffensen 迭代法 实验题目:分别用简单迭代法和Steffensen 迭代法求方程 010423=-+x x 在 [1, 2] 内的一个实根. 实验目的:理解并掌握简单迭代法和Steffensen 迭代法 基础理论:简单迭代法和Steffensen 迭代法 1).简单迭代法的原理:将一元非线性方程:0)(=x f 改写成等价方程:)(x x ρ= ,对此,从某个初始值x0开始,对应式)(x x ρ= 构成迭代公式 ,...1,0),(1==+k x x k k ρ ,这样就可以确定序列 {}k x (k=0,1,2…)。如果 {}k x 有极限 *lim x x k k =∞→ ,由式 ,...1,0),(1==+k x x k k ρ 两边取极限可得 )(**x x ρ= ,可知 * x 为方程0)(=x f 的近似解。 2)Steffensen 迭代法的原理: 通过把改进的Aitken 方法应用于根据不动点迭代所得到的线性收敛序列,将收敛速度加速到二阶。

()???? ?????+---===+k k k k k k k k k k k x y z x y x x y z x y 2) ()(21ρρ []x x x x x x x +---=)(2)(()()(2ρρρρψ 实验环境:操作系统:Windows 7; 实验平台:Turbo C++ 实验过程:写出算法→编写程序→调试运行程序→计算结果 1)简单迭代法的算法: Input:初始近似值x0,精度要求del,最大迭代次数N Output:近似解x 或失败信息 1. n ←1 2. While n ≤N do; 3. x ←f(x0); 4. if | x-x0|

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 -+- =+

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

不动点迭代法求解非线性方程组

不动点迭代法求解非线性方程组 摘要:一般非线性方程组可以写成()0F x =的形式,其中:n m F R R →是定义在区域 n D R ?上的向量函数。把方程组()0F x =改写成与之等价的形式:(x G x =)。因此,求 方程组()0F x =的解就转化为求函数的(G x )的不动点。本文首先介绍了多变量函数()F x 的微积分性质,接着介绍了用不动点迭代法求解非线性方程组。 关键词:多变量函数;微积分;不动点 Fixed Point Iteration Method For Solving Nonlinear Equations Abstract :General nonlinear equations can be written in the form of ()F x θ=, where the vector function :n m F R R →is defined on the region n D R ?. Transform the equations ()0F x = into its equivalent form: (x G x =).Therefore, we can get the solution of ()0F x = by finding the fixed point of (G x ).In this paper, we first introduce some knowledge about multivariable calculus, then introduce the fixed point iteration method for solving nonlinear equations. Key words: multi-variable function; calculus; fixed point 1 引言 一般非线性方程组及其向量表示法:含有n 个方程的n 元非线性方程组的一般形式为 11221212(,...,)0(,...,)0......(,...,)0 n n m n f x x x f x x x f x x x =??=?? ? ?=? (1) 其中,()1,2,...,i f i n =是定义在n D R ?上的n 元实值函数,且i f 中至少有一个是非线性 函数。

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

实验名称: 牛顿法解非线性方程组 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 +-∞ ?-=??=-

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)将文件内的数据按照要求读取到矩阵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; if mod(line,20)==1 phi2=(data/5)+1; phi=1; 数据说明部分,与作图无关 此方向表示f 随着φ1从0,5,10,15, 20 …到90的变化而变化 此方向表示f 随着φ从0,5,10,15, 20 …到90的变化而变化 表示以下数据为φ2=0的数据,即f (φ1,φ,0)

matlab实现牛顿迭代法求解非线性方程组

matlab实现牛顿迭代法求解非线性方程组 已知非线性方程组如下 3*x1-cos(x2*x3)-1/2=0 x1^2-81*(x2+0.1)^2+sin(x3)+1.06=0 exp(-x1*x2)+20*x3+(10*pi-3)/3=0 求解要求精度达到0.00001 ———————————————————————————————— 首先建立函数fun 储存方程组编程如下将fun.m保存到工作路径中: function f=fun(x); %定义非线性方程组如下 %变量x1 x2 x3 %函数f1 f2 f3 syms x1 x2 x3 f1=3*x1-cos(x2*x3)-1/2; f2=x1^2-81*(x2+0.1)^2+sin(x3)+1.06; f3=exp(-x1*x2)+20*x3+(10*pi-3)/3; f=[f1 f2 f3]; ———————————————————————————————— 建立函数dfun 用来求方程组的雅克比矩阵将dfun.m保存到工作路径中: function df=dfun(x); %用来求解方程组的雅克比矩阵储存在dfun中 f=fun(x); df=[diff(f,'x1');diff(f,'x2');diff(f,'x3')]; df=conj(df'); ———————————————————————————————— 编程牛顿法求解非线性方程组将newton.m保存到工作路径中: function x=newton(x0,eps,N); con=0; %其中x0为迭代初值eps为精度要求N为最大迭代步数con用来记录结果是否收敛for i=1:N; f=subs(fun(x0),{'x1' 'x2' 'x3'},{x0(1) x0(2) x0(3)}); df=subs(dfun(x0),{'x1' 'x2' 'x3'},{x0(1) x0(2) x0(3)}); x=x0-f/df; for j=1: length(x0); il(i,j)=x(j); end if norm(x-x0)

数值分析求解非线性方程根的二分法、简单迭代法和牛顿迭代法

实验报告一:实验题目 一、 实验目的 掌握求解非线性方程根的二分法、简单迭代法和牛顿迭代法,并通过数值实验比较两种方法的收敛速度。 二、 实验内容 1、编写二分法、牛顿迭代法程序,并使用这两个程序计算02)(=-+=x e x x f 在[0, 1]区间的解,要求误差小于 4 10- ,比较两种方法收敛速度。 2、在利率问题中,若贷款额为20万元,月还款额为2160元,还期为10年,则年利率为多少?请使用牛顿迭代法求解。 3、由中子迁移理论,燃料棒的临界长度为下面方程的根,用牛顿迭 代法求这个方程的最小正根。 4、用牛顿法求方程 的根,精确至8位有效数字。比较 牛顿迭代法算单根和重根的收敛速度,并用改进的牛顿迭代法计算重根。 三、 实验程序 第1题: 02)(=-+=x e x x f 区间[0,1] 函数画图可得函数零点约为0.5。 画图函数: f un cti on Te st1() % f(x ) 示意图, f(x) = x + exp (x) - 2; f(x) = 0 r = 0:0.01:1; y = r + e xp(r) - 2 p lot(r, y); gri d on 二分法程序: 计算调用函数:[c,n um ]=bisec t(0,1,1e-4) fu ncti on [c,num ]=bisect (a,b,de lt a) %Inp ut –a,b 是取值区间范围 % -de lta 是允许误差 %O utput -c牛顿迭代法最后计算所得零点值 % -num 是迭代次数 ya = a + exp(a) - 2; yb = b + e xp(b) - 2;

牛顿法求解非线性方程组matlab源程序

牛顿法求解非线性方程组matlab源程序Newton-Raphson 求解非线性方程组matlab源程序 matlab程序如下: function hom [P,iter,err]=newton('f','JF',[;; ],,,1000); disp(P); disp(iter); disp(err); function Y=f(x,y,z) Y=[x^2+y^2+z^2-1; 2*x^2+y^2-4*z; 3*x^2-4*y+z^2]; function y=JF(x,y,z) f1='x^2+y^2+z^2-1'; f2='2*x^2+y^2-4*z'; f3='3*x^2-4*y+z^2'; df1x=diff(sym(f1),'x'); df1y=diff(sym(f1),'y'); df1z=diff(sym(f1),'z'); df2x=diff(sym(f2),'x'); df2y=diff(sym(f2),'y'); df2z=diff(sym(f2),'z'); df3x=diff(sym(f3),'x'); df3y=diff(sym(f3),'y'); df3z=diff(sym(f3),'z'); j=[df1x,df1y,df1z;df2x,df2y,df2z;df3x,df3y,df3z]; y=(j); function [P,iter,err]=newton(F,JF,P,tolp,tolfp,max) %输入P为初始猜测值,输出P则为近似解 %JF为相应的Jacobian矩阵 %tolp为P的允许误差 %tolfp为f(P)的允许误差 %max:循环次数 Y=f(F,P(1),P(2),P(3)); for k=1:max

数值分析求解非线性方程根的二分法,简单迭代法和牛顿迭代法

实验报告一:实验题目 一、 实验目的 掌握求解非线性方程根的二分法、简单迭代法和牛顿迭代法,并通过数值实验比较两种方法的收敛速度。 二、 实验内容 1、编写二分法、牛顿迭代法程序,并使用这两个程序计算 02)(=-+=x e x x f 在[0, 1]区间的解,要求误差小于 4 10- ,比较两种方法收敛速度。 2、在利率问题中,若贷款额为20万元,月还款额为2160元,还期为10年,则年利率为多少?请使用牛顿迭代法求解。 3、由中子迁移理论,燃料棒的临界长度为下面方程的根cot x =(x 2?1)/2x ,用牛顿迭代法求这个方程的最小正根。 4、用牛顿法求方程f (x )=x 3?11x 2+32x ?28=0的根,精确至8位有效数字。比较牛顿迭代法算单根和重根的收敛速度,并用改进的牛顿迭代法计算重根。 三、 实验程序 第1题: 02)(=-+=x e x x f 区间[0,1] 函数画图可得函数零点约为0.5。 画图函数: function Test1() % f(x) 示意图, f(x) = x + exp(x) - 2; f(x) = 0 r = 0:0.01:1; y = r + exp(r) - 2 plot(r, y); grid on 二分法程序: 计算调用函数:[c,num]=bisect(0,1,1e-4) function [c,num]=bisect(a,b,delta) %Input –a,b 是取值区间范围 % -delta 是允许误差 %Output -c 牛顿迭代法最后计算所得零点值 % -num 是迭代次数

ya = a + exp(a) - 2; yb = b + exp(b) - 2; if ya * yb>0 return; end for k=1:100 c=(a+b)/2; yc= c + exp(c) - 2; if abs(yc)<=delta a=c; b=c; elseif yb*yc>0 b=c; yb=yc; else a=c; ya=yc; end if abs(b-a)

经典Newton-Raphson牛顿法求解非线性方程组matlab源程序

function hom [P,iter,err]=newton('f','JF',[7.8e-001;4.9e-001;3.7e-001],0.01,0.001,1000); disp(P); disp(iter); disp(err); function Y=f(x,y,z) Y=[x^2+y^2+z^2-1; 2*x^2+y^2-4*z; 3*x^2-4*y+z^2]; function y=JF(x,y,z) f1='x^2+y^2+z^2-1'; f2='2*x^2+y^2-4*z'; f3='3*x^2-4*y+z^2'; df1x=diff(sym(f1),'x');

df1y=diff(sym(f1),'y'); df1z=diff(sym(f1),'z'); df2x=diff(sym(f2),'x'); df2y=diff(sym(f2),'y'); df2z=diff(sym(f2),'z'); df3x=diff(sym(f3),'x'); df3y=diff(sym(f3),'y'); df3z=diff(sym(f3),'z'); j=[df1x,df1y,df1z;df2x,df2y,df2z;df3x,df3y,df3z]; y=(j); function [P,iter,err]=newton(F,JF,P,tolp,tolfp,max) %输入P为初始猜测值,输出P则为近似解%JF为相应的Jacobian矩阵 %tolp为P的允许误差 %tolfp为f(P)的允许误差 %max:循环次数

Y=f(F,P(1),P(2),P(3)); for k=1:max J=f(JF,P(1),P(2),P(3)); Q=P-inv(J)*Y; Z=f(F,Q(1),Q(2),Q(3)); err=norm(Q-P); P=Q; Y=Z; iter=k; if (err function homework4 [P,iter,err]=newton('f','JF',[7.8e-001;4.9e-001;3.7e-001],0.01,0.001,1000);

用牛顿法解非线性方程组

四、(上机题)分别用Newton 法和Broyden 法求解下面非线性方程组 1212322 12333cos()0.50 81(0.1)sin 1.0601 20(103)0 3x x x x x x x x e x π-?--=??-+++=???++-=? (要求:用Matlab 编程,并附上源代码及迭代五次的结果,初值可取(0.1,0.1,0.1)-) 第四题: Newton 法:myNewton..m function[t]=myNewton(x0) % x0为初始值向量 syms x y z; x0 = transpose(x0); %=============================== f1=3*x-cos(y*z)-0.5; f2=x^2-81*(y+0.1)^2+sin(z)+1.06; f3=exp(-x*y)+20*z+1/3*(10*pi-3); F=[f1;f2;f3]; %=============================== Fx = subs(F,{x,y,z},x0); dF = Jacobian(F); % 求雅克比矩阵 dFx = subs(dF,{x,y,z},x0); A=inv(dFx); k=0; %=============================== % Newon 迭代法核心程序 while norm(Fx)>1e-10 x1=x0-A*Fx; % 核心迭代公式 k=k+1; if k==5 disp('迭代五次的结果为:') ; x1 elseif k>=100 disp('迭代次数过多,不收敛!'); return; end Fx = subs(F,{x,y,z},x1); dFx = subs(dF,{x,y,z},x1); A=inv(dFx); x0=x1; end %============================== disp('非线性方程组的解为:') x0 % 输出最后的解 输出结果为: >> x0=[0.1,0.1,-0.1]; >> myNewton(x0) 迭代五次的结果为: x1 = 0.5000 -0.0000 -0.5236 非线性方程组的解为: x0 = 0.5000 -0.0000 -0.5236

相关主题
文本预览
相关文档 最新文档